#include
#include
//Tarih: 20061027 Yazan: FoX_ / baron06
int main()
{
double b,a,d,sayac;
b = 1;
sayac = 0;
printf("Hangi sayinin faktoriyelini hesaplamak istiyorsunuz?\n");
scanf("%lf", &d);
while(d < 0)
{
printf("Negatif sayinin faktoriyeli olmaz.Lutfen yeniden deneyin.\n");
scanf("%lf", &d);
}
a = d;
while(sayac < d)
{
b = b * a;
a = a - 1;
sayac = sayac + 1;
}
printf("\n%.0lf", b);
getch();
return 0;
}
Simdi programimizi adim adim inceleyelim:
Not:Programin basindaki #include kismini dev-c++ kullandigim icin yazdim.Microsoft kullananlarin bunu ve programin sonunda getch() yazmasina gerek yoktur.Diger derleyicilerde gerek var midir orasini bilemiyorum.
Oncelikle printf ve scanf islevlerinin calismasi icin programin tepesine #include yaziyoruz ve degiskenlerimizi double turunde tanimliyoruz.Bunun nedeni daha fazla sayinin faktoriyelini hesaplayabilmek.Bu sayede 170! 'e kadar sayilarimizi hesaplayabiliriz.
b'nin ilk degerini 1 verdik cunku ilerideki while dongumuzde b = b*a oldugundan ilk degerinin 1 olmasi gerekiyor yoksa yanlis sonuc verir.İleriki aciklamamda neden 1 verdigimizi daha iyi anlayacaksiniz.
Sayacin degerine neden 0 verdigimize gelince ikinci while dongumuzde sayac < girilen sayi oldugundan girilen sayinin faktoriyelini hesaplamasi icin sayac degiskenine 0 verdik.Eger sayac degiskenine 2 verip 5 sayisinin faktoriyelini hesaplamak isteseydik eksik sayida carpma islemi yapilip sonuc yanlis cikardi.
Sonra kullanicidan hangi sayinin faktoriyelini hesaplamak istedigini sorup bunu d degiskeninde depoladik.Degiskenlerimizi double olarak tanimladigimiz icin de scanf("%lf", &d) yaptik.Eger degiskenlerimiz long olsaydi scanf("%ld", &d) yapacaktik.Bu arada "&" isaretini de unutmamaliyiz yoksa program calismaz.
Gelelim 1. while dongumuze.Burada girilen sayi 0'dan kucuk oldugu surece kullanicidan yeni deger istenmektedir.Bunun nedeni ise negatif sayilarinin faktoriyelinin olmamasidir.Kullanici negatif deger girdigi surece bu donguden cikamaz.
Sonra d degiskeninin degerini a degiskenine aktardik.Neden boyle yaptigimizi yazinin sonunda programin calismasini bir ornekle incelerken anlatacagim.
Simdi programimizi calistiralim.Simdi anlatacaklarimda son while dongusunun ne ise yaradigini da aciklayacagim.
Programi calistirmadan once bir kagit kalem alip degiskenleri ve ilk degerlerini not edin.Bu programa gore programin baslangicinda b degiskenimizin degeri 1 a ve d degiskenimizin degeri belirsiz ve sayac degiskenimizin degeri 0 'dir.
Program calisti ve kullanicidan bir deger girmesi istendi.Programci 4 sayisini girsin.Simdi d degiskenimizin degeri 3 oldu.Kullanici sayiyi 0'dan buyuk girdigi icin 1.while dongusune girmeden bir sonraki ifadeye geldi.Bu ifade de d degiskeninin degerini a degiskenine koymamizi soyluyor.O halde a degiskenimizin degeri de 3 oldu.Burada bir noktaya dikkatinizi cekmek istiyorum.Burada a = d demek d degiskeninin degerini a'ya koy demektir.Eger d = a yazsaydi belirsiz bir degiskenin degerini d'ye koy demek olacakti ve programimiz hatali sonuc verecekti.
Simdi duruma bir bakalim: b degiskeni 1, a degiskeni 4, d degiskeni 4 ve sayac degiskeni 0.Degiskemlerin yeni durumlarini kagit kalemle not alin.
Simdi 2. while dongumuze geldik.sayac degiskeni(0), d degiskeninden(3) kucuk oldugu icin donguye girdik.Birinci ifademiz b = b*a calistirildi ve b'nin yeni degeri, eski degeri * a oldu.Yani b = 1 * 3'den b = 3 oldu.İkinci ifadede a'nin yeni degeri, eski degeri - 1 oldu.Yani a = 3 -1 = 2 oldu.Sayac degiskeninin yeni degeri, eski degeri + 1 yani, sayac = 0 + 1 = 1 oldu.Bu arada d degiskeninin deger degismedi ve 3 olarak kaldi.
Tekrar basa donduk.sayac'in degeri(1) , d'den (3) kucuk oldugu icin donguye devam ettik ve adimlari tekrarladik.Yani b degiskenini degeri artik b'nin eski degeri * a'nin yeni degeri.Yani 3*2 = 6.a'nin degerini 1 eksilttik.Bu durumda a = 1 oldu.sayac degiskeni 1 artti ve 2 oldu.d degiskeni degismedi.
sayacin degeri(2) , d degiskeninden(3) kucuk oldugu icin donguye devam edildi ve adimlar tekrarlanarak b = 6.a yani 6.1 = 6 oldu.Sonra a degiskeni bir azalarak 0 oldu.sayac degiskeni 1 artarak 3 oldu ve d degiskeni 3 olarak kaldi.
Artik dongunun sonuna geldik cunku sayac degiskeni(3), d degiskeninden(3) kucuk degil.Bu sayede dongumuz sonlandi.
Simdi bir durum degerlendirmesi yapalim:b degiskenimizin degeri 6 oldu ki bu da 3! 'e esittir.a dgiskenimizin deger 0 oldu.sayac ve de degiskenlerimiz de 3 oldu.
Geldik en son adima:Bu adimda printf("\n%.0lf", b) seklinde bir ifade goruyoruz.
Bu ifadede yazilan "%.0lf" nin anlami hesapladigimiz sayida noktadan sonra hicbir basamaginin gosterilmemesini saglamaktir.Faktoriyel sonucu tamsayi cikacagindan 0.lf seklinde yazdik.Eger .2lf yazsaydik sayi 6.00 sekline gosterilecekti.Sonra da b'nin degerini bir satir atlayip ekrana yazdirdik sonra "return 0;" ifadesine geldi ve programimiz bitti.
Umarim programi aciklayici bir sekilde anlatabilmisimdir.Bu programin benim gibi yeni baslayanlara yardimi olacagini dusunuyorum.Eger alinti yapacaksak lutfen programin basindaki aciklama satirlarini silmeyelim...
Buda rekursiyon fve fonksiyonlu bir örnek
#include
#include
double fakt(int);
main(){
int a;
printf("\nFaktoeryel Hesaplama\n");
do{
printf("\nHesaplanmasi istenilen sayi: ");
scanf("%i", &a);
}
while(a<0);
printf("\n%i! = %.0lf\n", a,fakt(a));
system("pause");
}
double fakt(int a){
if(a == 0) return 1;
if(a == 1) return a;
if(a > 1) return(a*fakt(a - 1));
}