Tam Sürümünü Görmek İçin : sayıları 1+1/2+1/3... 1/n toplam sonuç bulma
faktoriel olarak toplam yaptırıyorum fakat toplam sonucu yanlış veriyor nerde hatam var yardımcı olurmusunuz
#include <stdio.h>
int fact(int);
main()
{
int sayi;
printf("Sayiyi giriniz : ");
scanf("%d",&sayi);
while(sayi != 0 ){
printf("1/%d! = ",sayi);
printf("%d! = %d",sayi,fact(sayi));
printf(" Sayiyi giriniz : ");
scanf("%d",&sayi);
}
return 0;
}
int fact(int sayi){
static int t=0;
int a,sayi1,sum;
if (sayi < 1){
for (a=0 ; a<=t; a++)
printf(" ");
printf("1");
return 1;
}
else {
t++;
for (a=0;a<t ; a++)
printf(" ");
printf("1/%d+1/%d",sayi);
return sayi +fact(sayi-1);
}
}
acehreli
15/04/2006, 00:34
1) Kod tekrarinin onune gecmek icin soyle iki oneri:
for (;;)
{
printf("Sayiyi giriniz : ");
scanf("%d",&sayi);
if (sayi == 0) break;
printf("1/%d! = ",sayi);
printf("%d! = %d",sayi,fact(sayi));
}
Eger for'dan oyle gizli bir break ile cikmak istenmiyorsa:
for ( ; sayi != 0; )
{
printf("Sayiyi giriniz : ");
scanf("%d",&sayi);
if (sayi)
{
printf("1/%d! = ",sayi);
printf("%d! = %d",sayi,fact(sayi));
}
}
2) fact islevinin iki gorevi var: hesap yapmak ve yazdirmak. Bence isler bu yuzden karisiyor. Gorevleri iki isleve ayirmayi dene.
3) fact'in static nesnesi t aslinda bir hata, cunku fact islevini bir programda iki degisik noktadan cagiramazsin. Ikinci cagri birincinin kaldigi yerden devam etmek zorundadir. Boyle bir durumda fact'i iki parcaya ayirip t'yi ikinci parcaya gecirme yontemini uygulayabilirsin:
int fact_yinelemeli(int sayi, int t)
{
// Artik t'yi tanimlamiyoruz
int a,sayi1,sum;
// ... Bu arasi eski kodla ayni
// Simdi yinelemeli olan parcayi cagiriyoruz
return sayi +fact_yinelemeli(sayi-1, t);
}
}
int fact(int sayi)
{
return fact_yinelemeli(sayi, 0);
}
Tabii dogru isi yapip yapmadigindan emin degilim :)
Ali
Sanirim yapmak istedigin boyle bir sey....
#include <stdio.h>
long fact(int);
int main()
{
int sayi;
while(1)
{
printf(" Sayiyi giriniz : ");
scanf("%d",&sayi);
if(sayi < 0 ) break; //0 dan kucuk sayilarin factoriyeli yoktur
printf("%d! = %d",sayi,fact(sayi));
}
return 0;
}
long fact(int sayi){
long araCarpim=1;
for(int i=2;i<=sayi;i++)
araCarpim=araCarpim *i;
return araCarpim;
}
Not: Factoriyeli Recursive olarak kullanmadım.. Anlamadıgın yeri sorabilirsin.. Bir de programi Ceviz editorunde :) yazdıgımdan ufak tefek derleme hataları cıkabilir..
merhaba yanlız sizin yaptığınızda sadece faktoriel alıyor ben onu yapıyorum benim yapamadığım klavyeden kaç girilirse onun toplamı mesele 3 girdik 1+1/2+1/3 toplamının ekrana gelmesi
Sordugunuz soruyu anlamaya calistim ama nafile.
Mainde kullanicidan giris alinir alinmaz while icinde printf("1/%d! = ",sayi); ifadesine baktigimda sunu anliyorum, eger 5 rakami girilirse 1/5! u hesaplayacaksiniz. Oteki taraftan yazdiginiz kod parcasinin geri kalanina baktigimda fact diye bir fonksiyonunuz olmasina ragmen factoriel hesabi disinda her seyi yapmaya calisiyor ve 1/5!, 1+1/2+...+1/5 e esit degildir.
Eger bir odev yapmaya calisiyorsaniz sorunun aslini burda verirseniz belki daha iyi bir fikir yurutebiliriz.
sondurak
21/04/2006, 23:23
Faktoriyelle sayilarin carpmaya gore terslerinin toplamlari arasindaki iliskiyi anlamadim ben de arkadasim:ama sadece toplama islemi icin:
double sum(int sayi){ double add=0.00;int x; for(x=1;x<=sayi;x++) add+=1/x;return add;}
mainde de;
..... if(sayi<0) return 0;else printf("%f",sum(sayi));...
//Benim simdilik anladigim bu.
bu seri için recursive fonksiyon kullanımı bir hata,
( aslında tüm seriler için bir hata , çünkü tanım gereği serilerde bir genel ifade (formül))vardır)
sondurak ın gösterdiği gibi basit ve hızlı bir çözüm mevcut.
yine de yapılsa idi şöyle olabilirdi:
#include <iostream>
using namespace std;
void recursive_func(int);
int main()
{
int sayi;
do{
cout << "\n\n Sayiyi giriniz : \n";
cin >> sayi;
cout <<" seri 1/n ," << " n = " << sayi << endl;
recursive_func(sayi);
}
while(sayi != 0 );
return 0;
}
// recursive fonksiyon , sayilari ve toplami yazmak icin.
void recursive_func(int sayi){
static double sum = 0;
sum += (double)1/sayi;
if (sayi <= 1){
cout << " 1 = " << sum;
sum = 0;
return;
}
else {
cout<<"1/"<<sayi<<" + ";
return recursive_func(sayi-1);
}
}
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.