Skip to content

Instantly share code, notes, and snippets.

@roktas
Forked from symtkn/gist:1256058
Created October 2, 2011 20:39
Show Gist options
  • Save roktas/1257912 to your computer and use it in GitHub Desktop.
Save roktas/1257912 to your computer and use it in GitHub Desktop.
hesap makinesi hatası
#include <stdio.h>
int
main(void)
{
int say1, say2, tip;
printf("1. sayıyı giriniz: "); scanf("%d", &say1);
printf("2. sayıyı giriniz: "); scanf("%d", &say2);
/*
* stdio.h'da tanımlı işlevler (scanf dahil) daima tamponlanmıştır.
* Örneğin, kullanıcının klavye girdisi önce bir ara belleğe (tampon)
* okunur ve kullanıcı ENTER'a bastığında ('\n') tamponlanmış olan
* girdiler işlenir (ENTER "tamponu işle" gibi bir anlama geliyor).
* Yani scanf '%d' ayrıştırmasını ENTER'a basıldığında yapar ve
* tamsayıyı okuduktan sonra '\n' karakterinde işlemi sonlandırır.
* Sonuç? ENTER ile gerçekleşen her scanf çağırısında tamponda bir adet
* artık '\n' bulunur.
*
* Demek oluyor ki bu noktada tamponda bir '\n' var. Şimdi getchar
* çağrılırsa tamponda '\n' görülür ve işlev sadece bu karakteri okuyup
* döner.
*
* O halde çözüm olarak getchar çağrısından önce tamponu '\n'e kadar
* boşaltmamız lazım. Nasıl? Yine getchar'ı kullanarak, şöyle:
*/
while (getchar() != '\n')
/*
* '\n'e kadar ('\n' dahil) boş okuma yap. getchar her
* seferinde tampondan bir karakter çeker. Bu örnek için
* aslında tek bir getchar çağrısı da yeterli çünkü tamponda
* sadece bir adet karakter var, o da '\n'.
*/
;
printf("İşlem tipini giriniz (+,-,*,?): "); tip = getchar();
switch (tip) {
case '+': printf("%d\n", say1 + say2); break;
case '-': printf("%d\n", say1 - say2); break;
case '*': printf("%d\n", say1 * say2); break;
case '/': printf("%d\n", say1 / say2); break;
default:
fprintf(stderr, "Hatalı işlem tipi: %c\n", tip);
return 1; /* Hata durumunu sinyalleyerek çık. */
}
return 0;
}
#include <stdio.h>
int
main(void)
{
int say1, say2;
char tip;
/*
* "Tamponda artık '\n'" hatalarını önlemek için tamsayı okurken
* tamsayıdan sonra gelen ekstra karakterleri yutuyoruz. Nasıl?
* "%d%*c" biçim dizgisiyle: %d oku ve kalan tüm karakterleri ('%*c')
* bir değişkene atamadan göz ardı et.
*/
printf("1. sayıyı giriniz: "); scanf("%d%*c", &say1);
printf("2. sayıyı giriniz: "); scanf("%d%*c", &say2);
printf("İşlem tipini giriniz (+,-,*,?): "); scanf("%c", &tip);
switch (tip) {
case '+': printf("%d\n", say1 + say2); break;
case '-': printf("%d\n", say1 - say2); break;
case '*': printf("%d\n", say1 * say2); break;
case '/': printf("%d\n", say1 / say2); break;
default:
fprintf(stderr, "Hatalı işlem tipi: %c\n", tip);
return 1; /* Hata durumunu sinyalleyerek çık. */
}
return 0;
}
@delirehberi
Copy link

Kan yaptı bu :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment