Eski 28-10-06, 17:40 #1
baron06 baron06 çevrimdışı

bynogame
Varsayılan C'de faktoriyel hesaplama

bynogame
Selam arkadaslar kendi yazdigim bir faktoriyel hesaplama programinin kodlarini paylasmak istedim.

Kod:
#include <stdio.h>
#include <conio.h>

                  
//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 <conio.h> 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 <stdio.h> 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...

Mesajı son düzenleyen baron06 ( 28-10-06 - 17:43 )
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 31-10-06, 17:38 #2
anotherUSER anotherUSER çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
Buda rekursiyon fve fonksiyonlu bir örnek

Kod:
#include<stdio.h>
#include<stdlib.h>

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));
    }

Mesajı son düzenleyen anotherUSER ( 31-10-06 - 17:42 )
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 06-11-06, 22:22 #3
Reactive Reactive çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
hoca soruyordu okuldada bunu nasıl kalkacam altından bilemiyorum. bu c den nefret ettim yav genede sağol yararlanıcam bundan.
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 07-11-06, 11:19 #4
arşimet arşimet çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
Sağol paylaşımın için
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 15-11-06, 18:32 #5
_iSYaNKaR-uA_ _iSYaNKaR-uA_ çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
bende daha kısasını ve klavyeden girilen sayının for döngüsünde yzayım bari
#include"stdio.h"
#include"math.h"
#include"conio.h#
int i,s;
float fak;
main()
{
printf("faktöryeli alınacak sayıyı giriniz");scanf("%d",&s);
fak=1;(başlangıc dgeri bir olmazsa hep 0 dgerini verir)
for (i=1;i<=s;i++)
{
fak=fak*i;
printf("sayının faktöryeli..:%f",fak);
}
getch();
}
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 17-11-06, 14:50 #6
TheX TheX çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
Alıntı:
Gerçek Mesajı Gönderen anotherUSER Mesajı Göster
Buda rekursiyon fve fonksiyonlu bir örnek

Kod:
#include<stdio.h>
#include<stdlib.h>

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));
    }
Recursive kullanan kalitesini gösteriyor Her zaman recursive
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Eski 18-11-06, 01:05 #7
YoU LoSe YoU LoSe çevrimdışı

bynogame
Varsayılan C: C'de faktoriyel hesaplama

bynogame
tşK'Ler güseL çalışmalar..
  Alıntı Yaparak CevaplaAlıntı Yaparak Cevapla
Cevapla

Bu konunun kısa yolunu aşağıdaki sitelere ekleyebilirsiniz

Konu Araçları

Gönderme Kuralları
Yeni konu açamazsınız
Cevap yazamazsınız
Dosya gönderemezsiniz
Mesajlarınızı düzenleyemezsiniz

BB code is Açık
Smiley Açık
[IMG] kodu Açık
HTML kodu Kapalı



Tüm saatler GMT +3. Şuan saat: 11:38
(Türkiye için artık GMT +3 seçilmelidir.)

 
5651 sayılı yasaya göre forumumuzdaki mesajlardan doğabilecek her türlü sorumluluk yazan kullanıcılara aittir. Şikayet Mailimiz. İçerik, Yer Sağlayıcı Bilgilerimiz. Tatil


bynogame