Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
763 kez görüntülendi

C Programlama: Çok büyük sayılar için hata alıyorum. Örneğin istenen üç değere de sırayla 100,100,100 yazdığımda üst sınırdan fazla olduğu için hata veriyor. Nasıl düzeltebilirim? C Programlama: Çok büyük sayılar için hata alıyorum. 

Bir de yıllık nüfus artış yüzdesi negatif girilirse "Hatali giris: Artis yuzdesi negatif olmamali." uyarısı verdim. Artış dediği için pozitif olması gerekir diye düşündüm. Doğru mu acaba? 

 

#include <stdio.h>
#include <conio.h>
#include <math.h>
//Nüfus Hesaplama
int main(){
int  bed3;
long long int a3, bed1;
float  bed2,abc, a1,a2;
    printf("Ulke nufusunu giriniz: ");
    scanf("%lld", &bed1);
    
    if(bed1<2){
    printf("Hatali giris: Nufus,en az 2 olmali.");
	}
	else {
    printf("Yillik artis yuzdesini giriniz: ");
    scanf("%f", &bed2);
     if(bed2<0){
    printf("Hatali giris: Artis yuzdesi negatif olmamali.");
	}
	else {
    printf("Kac yil sonrasi icin nufusu ogrenmek istiyorsunuz? ");
    scanf("%d", &bed3);
       if(bed3<0){
    printf("Hatali giris: Yil sayisi 0'dan buyuk olmali!");
	}
	else {		
abc=(float)bed2/100;   
a1=1+abc;
a2=pow(a1,bed3);
a3=bed1*a2;
a3=fabs(a3);

 
printf("Nufus:%lld",a3);
    getch();
    return 0; 	}}}}

 

Veri Bilimi kategorisinde (55 puan) tarafından 
tarafından düzenlendi | 763 kez görüntülendi
artış negatifte pozitifte olabilir.başta nasıl tanımlama yaptıysan ona göre.bunu if else ile düzeltebilirsin.

çok büyük sayılara gelince C de, -2147483647 ile 2147483647 arasında değer alabilirsin bilgin olsun.

Bilgisayarinizin/derleyinizin limitlerini su siteden gerekli kodu alip gorebilirsiniz.

Dikkatimi ceken nokta pow() fonksiyonunun iki tane float kabul edip geriye float

dondurmesi. Su siteden veya headeri okuyup bakabilirsiniz. float kabul ettigi icin pow fonksyonu ve long long int daha fazla yer kapladigi icin orada olabilir hata. Kendi us fonksyinonuzu yazabilirsiniz.

long long int yerine unsigned long long int kullanmaniz gosterebileceginiz araligi iki katina cikarir.

Daha yuksek sayilari gostermek icin kutuphane kullanmaya (misal GMP) yada kendi buyuk sayilar kutuphanenizi yazmaya mecbursunuz c dilinde.

Çok teşekkür ederim. Çıktı, nüfus olacağı için float kullanmak istemedim, long ve diğerleri için de belli üst sınırlar olduğu için hata verebiliyordu. Neyse ki hocamıza sordum, float kullanın, deyince sorun kalmadı.
Çok teşekkür ederim.

@SilentMary
insan müsvettelerini 0.5 0,3 gibi değerlerden hesapladım diyin hocanıza.hak verecektir :))

 

rica ederiz

Kodunuzu biraz degistirdim.

Tek degistirdigim sey  long long int vefloat yerine long double kullanmak oldu. Tabii ki buna uygun sekilde scanf in okuma stringini "%Lf" ile degistirdim ve pow fonksyonu yerine powl fonksyonunu kullandim.

Verdiginiz girdiler ile $(100,100,100)$ gelen sonuc

Ulke nufusunu giriniz: 100
Yillik artis yuzdesini giriniz: 100
Kac yil sonrasi icin nufusu ogrenmek istiyorsunuz? 100
 126765060022822940149670320537600.000000 

Aradiginiz cevap bu mu acaba ?

Kodun degistirilmis hali asagidadir.

int main(){
    int  bed3;
    long double a3, bed1;
    long double  bed2,abc, a1,a2;
    printf("Ulke nufusunu giriniz: ");
    scanf("%Lf", &bed1);
    if(bed1<2)
    {
        printf("Hatali giris: Nufus,en az 2 olmali.");
    }
    else
    {
        printf("Yillik artis yuzdesini giriniz: ");
        scanf("%Lf", &bed2);
        if(bed2<0)
        {
            printf("Hatali giris: Artis yuzdesi negatif olmamali.");
	}
	else
        {
            printf("Kac yil sonrasi icin nufusu ogrenmek istiyorsunuz? ");
            scanf("%d", &bed3);
            if(bed3<0)
            {
                printf("Hatali giris: Yil sayisi 0'dan buyuk olmali!");
            }
            else
            {		
                abc=bed2/100;   
                a1=1+abc;
                a2=powl(a1,bed3);
                a3=bed1*a2;
                printf(" %Lf \n", a3);
            }
            
        }
    }
}

 

Yorumun buradan sonrasi estetik ile alakali.

 

Eger kullandigimiz degiskenlere daha guzel isimler verirsek kodu anlamak kolaylasir. Ileride geri donup baktigimizda kodumuza ne yaptigimizi daha iyi hatirlariz. Kodu yukaridan asagi okuyoruz. Onemli seyler yukarida olsa iyi olur.  C makrolari bazen dostumuzdur.

#define Hata_Makrosu(X,MinimumDeger)                                    \
    do                                                                  \
    {                                                                   \
        if(X < MinimumDeger)                                                       \
        {                                                               \
            printf("Hatali giris: " #X " en az" #MinimumDeger "olmali.\n"); \
        }                                                               \
    }                                                                   \
    while(0);                                                           \
    
int main(){
    int  yil_sayisi;
    long double tahmin, nufus;
    long double  artis_yuzdesi,artis ;
    printf("Ulke nufusunu giriniz: ");
    scanf("%Lf", &nufus);
    printf("Yillik artis yuzdesini giriniz: ");
    scanf("%Lf", &artis_yuzdesi);
    printf("Kac yil sonrasi icin nufusu ogrenmek istiyorsunuz? ");
    scanf("%d", &yil_sayisi);
    
    if(nufus>=2 && artis_yuzdesi>=0 && yil_sayisi>=0)
    {
        artis=1+(artis_yuzdesi/100);   
        tahmin=nufus*powl(artis,yil_sayisi);;
        printf(" %Lf \n", tahmin);
    }
    else
    {
        Hata_Makrosu(nufus,2);
        Hata_Makrosu(artis_yuzdesi,0);
        Hata_Makrosu(yil_sayisi,0);

    }
}

 

Teşekkür ederim @elol hocam.
20,207 soru
21,731 cevap
73,297 yorum
1,896,643 kullanıcı