Şimdi Ara

c kodunda hata nerede

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
8
Cevap
0
Favori
568
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • //sayi tahmin oyunu
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>


    int main()
    {
    int tutulansayi=0;
    int saniyeler=0;
    int tahmin=0;
    int kactahmin=0;
    int puan=50;
    //sayi tut

    saniyeler=time(NULL);
    srand(saniyeler);
    tutulansayi=(rand()%100)+1;
    printf("1 ile 100 arasinda rasgele bir sayi tuttum!\nkolaysa tahmin et\nsana bazi ipuclari verecegim");
    while(tahmin!=-1)
    tekrar:
    printf("\ntahminin(1-100:");
    scanf("%d",&tahmin);


    if(tahmin<1 || tahmin>100)
    {
    printf("hile yapma 1 ile 100 arasi sayi gir");
    goto tekrar;
    }
    kactahmin++;
    if(tahmin==tutulansayi){//bildi
    printf("tebrikler toplam %d seferde bildin!\n",kactahmin);
    break;
    }
    else{
    if(tahmin>tutulansayi){
    printf("daha kucuk sayi girmelisin!\n");
    puan-=5;
    }
    else{
    printf("daha buyuk bir sayi girmelisin\n");
    puan-=5;

    }
    }
    }
    bilemedin; printf("bilemediniz puaniniz sifir oldu sayi %d idi",srand(saniyeler);
    printf("puanin 50 uzerinden %d!",puan<0?*:puan);
    tekrar2:

    getch();
    }

    arkdaşlar dev c ile derledğimde abuk subuk bi hara veriyo berak not loob felan diyo anlayamadım:)







  • tam inceleyecek vakit bulamadım şöyle bir baktımda else ler yerine if kullanmayı dermisin bi.
  • quote:

    Orijinalden alıntı: atletico

    tam inceleyecek vakit bulamadım şöyle bir baktımda else ler yerine if kullanmayı dermisin bi.

    olmuyor:(
  • //sayı tahmin oyunu 
    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #include<conio.h>

    int main()
    {
    int tutulansayi=0;
    int tahmin=0;
    int saniyeler=0;
    int kactahmin=0;
    int puan=50;
    saniyeler=time(NULL);
    srand(saniyeler);
    tutulansayi=(rand()%100)+1;
    printf("Tahminlere basliyoruz\n1-100 arasi deger tuttum bakalim bilebilecenmi?\n");
    while(tahmin!=-1)
    {


    printf("lutfen 1-100 arasi deger giriniz:");
    scanf("%d",&tahmin);
    if(tahmin==-1) break;
    if(tahmin<1 || tahmin>100){
    printf("oyun bozanlik yapma\n1 ila 100 arasi deger gir!");
    continue;
    }
    kactahmin++;
    if(tahmin==tutulansayi)
    {
    printf("tebrikler!\n toplam %d seferde bildin\n",kactahmin);
    break;
    }else{
    if(tahmin>tutulansayi)
    {
    printf("lutfen daha kucuk deger gir\n");
    puan-=5;
    }else{
    printf("daha buyuk sayi gir\n");
    puan-=5;
    }
    }
    }
    printf("puanin 50 uzerinden %d",puan<0 ? 0: puan);
    getch();
    }


    böyle olunca oluyor sorun rand fonksiyonunu döngü içerisine yazmaktan kaynaklanıymuş...fakat neden böyle yapıyor anlamadım ne fark ederki?




  • while(tahmin!=-1)
    tekrar:
    .....
    .....
    goto tekrar;

    Sorun goto Detayı biraz karmaşık ama önemi yok. Zira asıl sorun o goto'nun kendisi. Goto'yu sözlüklerinizden, zihninizden filan çıkarıp, duyarsanız "Nedir o, turşusu mu oluyor?" sormadıkça bu iş yürümez.

    Derleyici az bile şarlamış, ben olsam bilmem ne yapardım artık

    Biz bu işi ilk öğrenirken, bir BASIC vardı, başka bir şey yoktu. Tamam bir şeyler vardı, 8086 PC'ler için, ama disketini filan nerden bulacaksın ki, COBOL'muş, C'ymiş vs. Hatta 8086 CPU, 64K RAM makineyi bulmak bile bir şeydi zaten. Ve Commodore'lar, ZX-81'ler vs. için defacto dil, assembler ve BASIC'ti. 8086'larda da elbette, meşhur GW-BASIC.. Hatta IBM'in INT 18H BASIC'i..

    Ve o dillerde JMP ila GOTO bizim işimizi harika bir şekilde görürdü. Zaten başka bir şey yok ki, nerde while filan? Bu yüzden, itiraf edeyim, yapısal programlamaya intibakımız zor oldu. Hatta sırf bu yüzden PASCAL'ı hiç sevemedim.

    Siz siz olun, goto'yu unutun. Ve ardından goto'yu bir daha unutun.




  • quote:

    Orijinalden alıntı: skoylu

    while(tahmin!=-1)
    tekrar:
    .....
    .....
    goto tekrar;

    Sorun goto Detayı biraz karmaşık ama önemi yok. Zira asıl sorun o goto'nun kendisi. Goto'yu sözlüklerinizden, zihninizden filan çıkarıp, duyarsanız "Nedir o, turşusu mu oluyor?" sormadıkça bu iş yürümez.

    Derleyici az bile şarlamış, ben olsam bilmem ne yapardım artık

    Biz bu işi ilk öğrenirken, bir BASIC vardı, başka bir şey yoktu. Tamam bir şeyler vardı, 8086 PC'ler için, ama disketini filan nerden bulacaksın ki, COBOL'muş, C'ymiş vs. Hatta 8086 CPU, 64K RAM makineyi bulmak bile bir şeydi zaten. Ve Commodore'lar, ZX-81'ler vs. için defacto dil, assembler ve BASIC'ti. 8086'larda da elbette, meşhur GW-BASIC.. Hatta IBM'in INT 18H BASIC'i..

    Ve o dillerde JMP ila GOTO bizim işimizi harika bir şekilde görürdü. Zaten başka bir şey yok ki, nerde while filan? Bu yüzden, itiraf edeyim, yapısal programlamaya intibakımız zor oldu. Hatta sırf bu yüzden PASCAL'ı hiç sevemedim.

    Siz siz olun, goto'yu unutun. Ve ardından goto'yu bir daha unutun.



    2. mesajımda goto suz yaptım bi bakarmısn:)..mesajı okursan bişi yazdım bi zahmet ona göre cevap veririmisn teşekkülrer ilgilendiğin içn




  • Gördüğüm kadarıyla, çalışmasını engelleyecek bir hata yok.

    Fakat çalışıyor olmak, iyi olmak demek değil maalesef.

    Mesela:

    if (tahmin == -1) break;

    Eğer hiç tahmin yapmadan çıkarsa, 50 puan alacaktır sanıyorum oyuncu. Skorboarda yazılmak için iyi bir yöntem

    Ama asıl sorun, kullanıcın bundan haberdar olmaması. Paskalya yumurtası koymak gibi bir niyetiniz var olabilir, bilemiyorum, ama bu biraz basit kalır.

    Bir diğer mesele ise, olmayacak işe bakalım. Eğer bu koda aynı rakamı belli defa girersek, kod acayip enteresan bir hale gelmezmi? Şöyle ki, her defasında -5, -5 derken, kactahmin değeri, -MAXINT olacak, ardından 0 ve "0 tahminde bildin" gibi abes bir durum ortaya çıkacak. Programcı, bu gibi durumları gören ve göz önüne alan kimsedir.

    Daha başka bir mesele ise şu. O main() fonksiyonu için demişsiniz ki: int main();

    Bu durumda bu fonksiyonun geriye bir değer döndürmesi gerekiyor. Ne değeri, ne olacak filan demeyin, derleyiciyi kızdırmamak, kafasını karıştırmamak, onu mutlu etmek gerekir. Derleyicinin mutluluğu ile programcının mutluluğu arasında kesin bir parallellik olacaktır her daim.

    Bu gibi hususları görmeyi öğrenmeye çalışın, her durumu düşünün. Derleyiciyi mutlu etmeyi öğrenin. Bir kaç iyi kaide vardır bizim meslekte: KISS, "Keep compiler happy" gibi..




  • quote:

    Orijinalden alıntı: skoylu

    Gördüğüm kadarıyla, çalışmasını engelleyecek bir hata yok.

    Fakat çalışıyor olmak, iyi olmak demek değil maalesef.

    Mesela:

    if (tahmin == -1) break;

    Eğer hiç tahmin yapmadan çıkarsa, 50 puan alacaktır sanıyorum oyuncu. Skorboarda yazılmak için iyi bir yöntem

    Ama asıl sorun, kullanıcın bundan haberdar olmaması. Paskalya yumurtası koymak gibi bir niyetiniz var olabilir, bilemiyorum, ama bu biraz basit kalır.

    Bir diğer mesele ise, olmayacak işe bakalım. Eğer bu koda aynı rakamı belli defa girersek, kod acayip enteresan bir hale gelmezmi? Şöyle ki, her defasında -5, -5 derken, kactahmin değeri, -MAXINT olacak, ardından 0 ve "0 tahminde bildin" gibi abes bir durum ortaya çıkacak. Programcı, bu gibi durumları gören ve göz önüne alan kimsedir.

    Daha başka bir mesele ise şu. O main() fonksiyonu için demişsiniz ki: int main();

    Bu durumda bu fonksiyonun geriye bir değer döndürmesi gerekiyor. Ne değeri, ne olacak filan demeyin, derleyiciyi kızdırmamak, kafasını karıştırmamak, onu mutlu etmek gerekir. Derleyicinin mutluluğu ile programcının mutluluğu arasında kesin bir parallellik olacaktır her daim.

    Bu gibi hususları görmeyi öğrenmeye çalışın, her durumu düşünün. Derleyiciyi mutlu etmeyi öğrenin. Bir kaç iyi kaide vardır bizim meslekte: KISS, "Keep compiler happy" gibi..



    peki teşekkür ederim :)




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.