PDA

Tam Sürümünü Görmek İçin : C Faktoriyel hesaplaması soru


zerdest
22/01/2008, 01:20
C programlama diline yeni yeni giriş yaptım ve küçük örnekleri derleyerek öğrenmeye çalışıyorum. Derleyici olarak Dev-C++ derleyicisini kullanıyorum ama birkaç sorun yaşıyorum.

1-Kullanıcı tarafından girilen iki sayıdan hangisinin daha buyuk oldugunu yazan program.

#include <stdio.h>
int main()
{
int a , b;
printf("\nBirinci sayiyi giriniz: ");
scanf("%d" , &a);
printf("\nİkinci sayiyi giriniz: ");
scanf("%d" , &b);
if (a<b) printf("\n\nBirinci sayi ikinciden kucuk!!\n\n");
if (b<a) printf("İkinci sayi biriciden kucuk\n\n");
return 0;
}


ikinci sayıyı girdikten sonra ekran kapanıyor ve sonucu göstermiyor. Bunu nasıl düzeltebilirim?

2) Faktoriyel hesaplaması yapan program

#include <stdio.h>
int fact(n)
{
if (n == 0)
return(1);
return(n * fact(n-1));
}
int main() {
int n, m;
printf("Enter a number: ");
scanf("%d", &n);
m = fact(n);
printf("The factorial of %d is %d.\n", n, m);
return 0;
}



Derlemek istedigimde int fact(n) kısmında bir hata oldugunu söylüyor. bu hata kodlamadanmı kaynaklı yoksa derleyici ile ilgili bir sorunmu?

3- C derleyici olarak tavsiye edebileceginiz daha iyi bir derleyici varmı?

yanıtlarınız için şimdiden teşekkürler.


acehreli
22/01/2008, 01:39
1) Programini Dev-C++ icinden degil, program satirinda baslat

2) int fact(n)'de n'nin tUrUnu yazmayi unutmussun. Herhalde int olacak:

int fact(int n)

3) Aslinda Dev-C++ kendisi derleyici degil, bir gelistirme ortami; derleyici olarak gcc'yi kullanir. Daha iyi derleyici de olabilir ama gcc superdir iste... :)

Ali

zerdest
22/01/2008, 03:20
Programini Dev-C++ icinden degil, program satirinda baslat


1-)Bunu tam olarak anlayamadım:( biraz daha detaylı anlata bilirmisin?
Not: programlama diline yeni başladım ve ilk deneyimlerim bunlar.

quasimodo
22/01/2008, 13:55
Hani Dev Cpp ta dosya acarken projeri bir yere kaydediyorsunya
iste oraya git yazdigin kodun exe sini komut satirindan bul ve calistir.
Baslat -> Calistir -> cmd komut satirida boyle aciliyor...

ortug
22/01/2008, 15:20
komut satırıyla çalıştırmak zahmetli veya eziyetli gelebilir. Programın sonunda kullanıcıdan bir değer okumasını bekleyebilirsin. Böylelikle değer okununcaya kadar program bekleyecektir ;)
scanf("%d", &n);

zerdest
22/01/2008, 17:34
scanf("%d"); bu komutu kullanınca sorun ortadan kalkıyor.
ama ben halen program satırından nasıl başlata bilecegimi anlayamadım.
ben projeleri masa üstinde örnek programlar diye bir klasörde saklıyorum.
başlat>çalıştır>cmd yazdıktan sonra dos ortamı açılıyor.
bundan sonra masa üstüne ve masa üstündeki örnek programlar klasörüne nasıl ulaşacagım??

BFS
22/01/2008, 18:06
Programın en başına
#include <conio.h>
satırını ekleyip ve return 0; dan önce de
getch(); satırını eklersen olur.

zerdest
22/01/2008, 18:10
gösterme sorununu çözdüm ama faktoriyel hesaplamalarında 16 dan bük sayılar girince sonuç negatif olarak çıkıyor ve 33 ten büyük degerler içinde sonucu sıfır gösteriyor.
bunların nedeni nedir?
tanımlama türündenmi kaynaklı acaba?

quasimodo
22/01/2008, 18:12
cd ile dosyanin icine giriyorsun.
dir ile icinde bulundugun dosyanin icerigini gorursun.

quasimodo
22/01/2008, 18:16
Yeni baslamis biri olarak neden faktoriyel icin recursive fonksiyon kullaniyorsun. Baska sekilde bir kodlama denesen?

zerdest
22/01/2008, 18:58
farklı bir şekilde kodlamayı yapmaya çalışacagım.
yanıtlarınız için teşekkürler

acehreli
22/01/2008, 19:17
Eger programin faktoriyel hesapliyorsa, yalnizca faktoriyel hesaplasin. Eger "faktoriyel hesapladiktan sonra bir de kullancinin bir tusa basmasini gerektirsin" ise, o zaman programinin sonuna oyle satirlar eklersin.

Programi komut satirindan baslatmanin zahmetli olmadigini da gordun herhalde. Programi Dev-C++'ta derledikten sonra Alt-Tab'a basarak biraz once kullandigin komut satiri penceresini tekrar etkinlestiriyorsun (tesekkurler Windows), sonra yukari oka basarak programi son calistirdigin komutu geri cagiriyorsun ve Enter'a basiyorsun (tesekkurler Windows).

Isin guzeli, butun olay tek bir pencere icinde gelisiyor. Programin daha onceki sonuclari orada duruyorlar iste.

16'dan buyuk sayi kullanamamakla ilgili olarak: Her tUrUn saklayabildigi sayi araligi belirlidir. Eger sonuc int'e sigmiyorsa sigmiyordur. :) [Not: 12'den buyuk sayilar icin sonuc sifirdan buyuk cikti diye onlarin dogru olduklarini dusunmuyorsundur umarim. ;) ]

Ali

zerdest
22/01/2008, 21:37
Sanırım bu bölüm altında daha çok soru soracagım:)
yardımlarınızdan dolayı teşekkürler. iyi çalışmalar
not: tanımlama türünü degiştirdim ve 32 ye kadar hesaplamayı yaptırabildim ama bundan fazlasını yapamadım. bütün sayıları kapsayacak bir yolu varsa öğretin;)

choldax
22/01/2008, 23:16
gözüme çarpan int fact(n) oldu. fonksiyonların kullanacağı verileri tipleriyle beraber girmelisin. (char a) (double number) gibi. ayrıca bildiğim kadarıyla return komutu return(1) gibi değil de return 1 gibi kullanılır.

acehreli
23/01/2008, 00:16
Su adreste bir faktoriyel tablosu var:

http://membres.lycos.fr/rsirdey/facttabl.htm

Senin sonuclar gercekten 32'ye kadar dogru mu? ;)

Bu kadar buyuk sayilarla calisabilmek icin temel turlerin disinda yapilar kullanilabilir. Boyle yapilara 'bigint' deniyor. Google... :)

Ali

-aga-
23/01/2008, 08:53
İnt türünden dizi tanımlayıp sayıları belli hanelere bölerek çok büyük sayıları hesaplayabilirsin.

zerdest
23/01/2008, 17:54
Su adreste bir faktoriyel tablosu var:

http://membres.lycos.fr/rsirdey/facttabl.htm

Senin sonuclar gercekten 32'ye kadar dogru mu? ;)

Bu kadar buyuk sayilarla calisabilmek icin temel turlerin disinda yapilar kullanilabilir. Boyle yapilara 'bigint' deniyor. Google... :)

Ali

Kontrol ettim ve sonuçlarda hata oluşuyor:) bir ana sevinmiştim ama adrese bakınca eksik ve hatalı olduklarını gördüm;)

return 1 şeklinde kulanılamıyor. derleyici hata mesajı veriyor ve return (1) şeklinde kulanınca bir sorun gözükmüyor.


İnt türünden dizi tanımlayıp sayıları belli hanelere bölerek çok büyük sayıları hesaplayabilirsin.


yeni başladıgım için bunu yapmam biraz zaman gerektirecek. ve nasıl yapıldıgı konusundada bir bilgim yok açıkçası. anlata bilirsen öğrenmiş olurum bende;)

saygılar....

acehreli
23/01/2008, 21:58
return 1 nasil bir hata veriyor?

Nette bigint kodlari bulursan -aga-'nin bahsettigi hanelere bolme isini anlayacaksin. Ben de soyle cok kisitli bir BuyukSayi yapisi yazdim:

#include <stdio.h>
#include <limits.h>

#define TOPLAM_HANE 6

typedef struct
{
unsigned int haneler[TOPLAM_HANE];
} BuyukSayi;

void BuyukSayi_sifirla(BuyukSayi * sayi)
{
int i = 0;

for (i = 0; i != TOPLAM_HANE; ++i) {
sayi->haneler[i] = 0;
}
}

void BuyukSayi_kur(BuyukSayi * sayi, unsigned int deger)
{
BuyukSayi_sifirla(sayi);
sayi->haneler[0] = deger;
}

void BuyukSayi_arttir(BuyukSayi * sayi)
{
int i = 0;
unsigned int elde = 1;

for (i = 0; (i != TOPLAM_HANE) && elde; ++i) {
sayi->haneler[i] += elde;
elde = (sayi->haneler[i] == 0) ? 1 : 0;
}
}

void BuyukSayi_yazdir(FILE * cikis, const BuyukSayi * sayi)
{
int i = 0;

fprintf(cikis, "0x");

for (i = TOPLAM_HANE - 1; i != -1; --i) {
fprintf(cikis, "%08x", sayi->haneler[i]);
}
}

int main()
{
int i = 0;
BuyukSayi sayi;
BuyukSayi_kur(&sayi, UINT_MAX - 3);

for (i = 0; i != 10; ++i) {
BuyukSayi_yazdir(stdout, &sayi);
printf("\n");
BuyukSayi_arttir(&sayi);
}

return 0;
}

Ali

zerdest
23/01/2008, 22:21
return 1 yazinca hata oluşmasının sebebi silerken ";" işaretinide silmişim ondan hata veriyordu:( yani sorun benden kaynaklıymış:)

vermiş oldugun kodları inceleyecegim ama şimdilik benim seviyemi aşıyor. yinede bigint kodları hakkında googleyi kullanacagım.


/*Dairenin yari çapini girince size dairenin alanini hesaplayan bir program*/
#include <stdio.h>
#include <conio.h>
main()
{
float r,pi,alan;
pi = 3.14;

printf("\nDairenin yari capini giriniz:");
scanf("%d" , &r);

alan= ( pi*r*r );

printf("alan:");
printf("%f", alan);
getch();
return 0;
}


bu arada bu benim yaptıgım ilk program:) eminim senin için çok basit gelecek ama benim için büyük bir heyacan yaratmıştı:p

acehreli
23/01/2008, 22:39
Bence cok guzel! :)

Ali

zerdest
23/01/2008, 23:19
teşekkürler;)
sayenizde daha güzellerini yapacagım;)
forumda yaptıgımız basit programları paylaşabiliyormuyuz??

quasimodo
23/01/2008, 23:36
@acehreli
Ben anlamadim kodu yaw :utangac:

acehreli
24/01/2008, 00:43
BuyukSayi'yi mi anlamadin?

Ondalik sayi sisteminde nasil her basamak bir oncekinin 10 katiysa, BuyukSayi'nin her hanesi bir onceki hanenin 2^32 kati oluyor. Yani 'haneler', 2^32'lik sayi sistemi gibi calisiyor.

Yalnizca uc hanesine bakarsak, BuyukSayi'nin degeri soyle oluyor:

2^32 * 2^32 * haneler[2] + 2^32 * haneler[1] + haneler[0]

Ondalik sistemde de ornegin "234" gibi uc basamagin degeri sudur ya...

10 * 10 * 2 + 10 * 3 + 4

Boylece cok buyuk sayilarla calisabiliyoruz. Ama kod cok eksik tabii. :)

Ali

quasimodo
24/01/2008, 00:50
Hmmm. Sol elle bu kadar oluyor kusura bakmayin :P

-aga-
24/01/2008, 10:11
Derlemedim, çalışacağından emin değilim.

int main()
{
int sonsayi,adet=0;
printf("\nSayiyi giriniz: ");
scanf("%d" , &sonsayi);

int hane[100] = {0}
hane[0]=1;
for (int a=1;a<=sonsayi;a++)
{
int b=0,el=0;
do
{
hane[b]=hane[b]*a+el;
if (hane[b]>=1000000)
{
el=hane[b]/1000000;
hane[b]=hane[b]%1000000;
if (b=adet)
adet++;
}
b++;
}while (b<=adet)
}
printf("%d sayısının faktöriyeli.\n", sonsayi);
for (int a=adet;a>=0;a--)
printf(hane[a]);
return 0;
}

-aga-
24/01/2008, 11:15
hane[b]=hane[b]*a+el;
'den sonra
el=0;
olmalı.