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

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;
}

 

Veri Bilimi kategorisinde (55 puan) tarafından  | 1.5k kez görüntülendi

"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 :)

İlginiz için çok teşekkür ederim.

Aksine karakter ve sembollerle işim yok. Sadece 0'dan farklı rakamlarla çalışacağım. Diyelim ki 3 girdik, çıktısı 333 olacak; 4 girdik, 4444 olacak.

Sorun şu ki; 2,44, abc, 2ab gibi ifadeler girildiğinde hata veriyor. Sadece rakam girişi izin vermem gerekiyor. Bazı şeyler yapmaya çalıştım:

abc girdiğim zaman, 3 defa, yani her karekter için ayrı uyarı veriyor.

2,4 girdiğim zaman 4444 çıktısı veriyor.

ab,2 girdiğim zaman 22 çıktısı veriyor.

Sorunum bu...
ASCII tablosundan ,sadece rakamların girişine izin veren bir kontrol algoritması yazmayı deneyin.

1 cevap

0 beğenilme 0 beğenilmeme
En İyi Cevap

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

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.

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

#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")
      }
   }
}

 

(1.6k puan) tarafından 
tarafından seçilmiş
İlginiz için çok teşekkürler. Yalnız yapmak istediğim şey şu: Girdiler sadece  {1,2,3,4,5,6,7,8,9} kümesinden olacak. Diyelim ki 3 girdik, çıktısı 333 olacak; 4 girdik, 4444 olacak.

Sorun şu ki; 2,44, abc, 2ab gibi ifadeler girildiğinde hata veriyor.
yukarida verdigim kodda boyle sikintilar yasamamalisiniz. biraz modifiye ederek istediginiz sonuca erisebilirsiniz

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();
          }
        }
  }

}

 

Çok ama çok teşekkür ederim hocam, şimdi oldu.
20,281 soru
21,819 cevap
73,492 yorum
2,504,874 kullanıcı