Aşağıda kodunu yazmaya çalıştığım programla 0 haricinde girilen rakamları, rakamın sayı değeri kadar yan yan yazdırmak istiyorum.
Program büyük ölçüde çalışıyor. Sadece harf, sembol ve virgülle yazılmış ondalıklı sayılarda hata veriyor. Atol fonksiyonu ile kontrol sağlamak mümkün görünüyor ama bir türlü yapamadım. Kod aşağıda... Şimdiden teşekkür ederim.
#include <stdio.h> #include <stdlib.h> #include <string.h> void fonk(void); int main(void) { basadon: int i; float sayi; char sayii, cdizi; printf("\n0'dan farkli bir rakam giriniz:"); scanf("%f", & sayi); scanf("%c", &sayii); if(sayi - (int)sayi != 0){ printf("Hata:Bir rakam girmediniz!"); goto basadon; } if( (sayii>='a' && sayii<='z') || (sayii>='A' && sayii<='Z')) { printf("Hata:Bir rakam girmediniz!\n"); goto basadon; } if(sayi<1 or sayi>9) {printf("Hata:Bir rakam girmediniz!"); goto basadon; } else{ for (i=0; i<(int)sayi; i=i+1) printf("%d", (int)sayi); goto basadon; } return 0; }
"Sadece harf, sembol ve virgülle yazılmış ondalıklı sayılarda hata veriyor"
bu kod parçası nerede tam olarak ?
karakter ve sembollerle işlem yapıcaksanız,ASCII tablosundan faydalanmanızı öneririm.
yani
#include <stdio.h> int main() { char k=90; printf("%c",k); }
bu kodu çalıştırdığınızda çıkış olarak z harfi alırsınız.buna göre düzenlemenizi yapın.aksi durumda gene uğrayın :)
Soruyu tam anlamadim ama anladigim kadari ile cevaplayacagim.
Kodunuzda birinci gozume carpan sey goto kullanimi oldu. Bu pek tavsiye edilen bir durum degil. Kendinizi goto kullanirken buluyorsaniz durun ve yazdiginiz algoritmayi yeniden dusunun. mesela while dongusu kullanin
goto
while
Ikinci gozume carpan sey ise for dongusunde scope (acilen ve kapanan suslu kume parantezleri) kullanmamaniz. Evet bu C de legal ama ozellikle de goto ile birlesince kodunuzu cok anlasilmaz hale getiriyor.
for
scope
Sorunuzu su sekilde anladim. Kullanicidan bir rakam isteyecegiz (sayi degil!) eger rakam $0$ dan farkli ise ikiye bolup sonucu yazdiracagiz yok degilse basa donecegiz. Bunu yapabilmek icin once kullanicidan getchar fonksiyonu ile sadece bir karakter alacagim. Bu fonksiyon standart kutuphanede var. Bu karakterin rakam olup olmadigini gene standart kutuphanede bulunan isdigit fonksiyonu ile kontrol edebilirim. Fonksiyonlari stdlib.h ve ctype.h headerlarini programiniza dahil ederek kullanabilirsiniz. Tabii bize rakam degil 0 dan farkli bir rakam gerekiyor. Bu nedenle kucuk bir fonksiyon yazdim sifirdanFarkliBirRakamMi adinda. Eger bu sart saglaniyorsa karakter degerinden 48 cikararak (neden?) sayi degerinin elde ediyorum, float tipine cevirip, ikiye bolup yazdiriyorum . Yok degilse hata mesaji yazdiriyorum. Bu anlattigim prosedurun tamamani bir while dongusu icinde yapiyorum
getchar
isdigit
stdlib.h
ctype.h
sifirdanFarkliBirRakamMi
float
#include <stdlib.h> #include <stdio.h> #include <ctype.h> unsigned char sifirdanFarkliRakamMi(char s){ return isdigit(c) & (c!='0') } int main () { while(1) { printf("Bir sayi girin \n"); char c = getchar(); if( sifirdanFarkliRakamMi(c)) { float temp = (float) c -48 / 2.0; printf("Sayinin yarisi %f \n",temp); } else { printf("Hatali girdi!\n verdiginiz girdi <%c> sifirdan farkli bir rakam degil") } } }
Yazdığınız kodda bazı satırlarda hata veriyor hocam, ekran görüntüsünü ekliyorum. Dediğiniz gibi eğer bu kodu çalıştırabilirsem, yani "ab", "2,3", "ab,2" gibi girdilerde hata mesajı verdirebilirsem, istediğimi yapmış olacağım.
haklisiniz iki uc tane kucuk hata vardi
#include <ctype.h> #include <stdio.h> #include <stdlib.h> unsigned char sifirdanFarkliRakamMi(char c) { return isdigit(c) && (c != '0'); } int main() { int c = 0; while (1) { printf("Bir sayi girin \n"); int c = getchar(); int temp = getchar(); if(temp =='\n' ) { // <Enter> girdisini cozmek icin if (sifirdanFarkliRakamMi(c)) { printf("Sayi : "); int temp = c - '0'; for (int i = 0; i < temp; i++) { printf("%d ", temp); } printf("\n"); } else { printf("Hatali girdi!\n verdiginiz girdi <%c> sifirdan farkli bir " "rakam degil\n", c); } } else { printf("Hata!!\n Girdiden sonra entera basmalisiniz!\n"); temp = getchar(); { // <Enter> girdisini cozmek icin enter gorene kadar karakter oku while (temp != '\n') { temp = getchar(); } } } }