C'de karakter girlimesini nasil engelleriz ?

Başlatan empax, 22 Temmuz 2011 - 12:21:05

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

empax

Merhabalar.

Alttaki kod bolumunde 0 ve 50 sayilari icin kisitlama getirdim ama bir de karakter kisitlamasi getirmek istiyorum. Kisitlama icin altta XX yazan yere bir sey ekleyebilir miyiz ya da baska sekilde nasil cozeriz? Sadece integer girelecek.

again:
        scanf("%d",&sayilar[i]);
if(sayilar[i]=0 || sayilar[i]=50 || sayilar[i] == XX)
       
{
printf("Tekrar girin.\n");
goto again;
}
}
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

cxerpw57

Biraz daha detaylı açıklayabilirmisin, istediğin sadece 0-50 arasında rakamlar girilmesi midir?

İyi çalışmalar
Yarım hazırlıkla, yarım tedbirle yapılacak taarruz, hiç taarruz etmemekten çok daha fenadır (1922). M.Kemal ATATÜRK
http://canerblt.wordpress.com
twitter : cabulut

empax

#2
Yani klavyeden herhangi bir harfe basilinca yukaridaki if akisi devam etsin.

Duzenleme:
Degisken int turunden. Degisken sayi beklerken harf girince sapitiyor bunun onune gecmek istiyorum. Harf girince "Tekrar girin" uyarisini verdirmek istiyorum.
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

cxerpw57

#include <ctype.h> şeklinde bir kutuphane var diye biliyorum, aşağıda bir örnek paylaşıyorum işini görüyormu denermisin, örnekte isalpha kullanmış senin isalnum() kullanman gerekiyor,

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="C++";
  while (str[i])
  {
    if (isalpha(str[i])) printf ("character %c is alphabetic\n",str[i]);
    else printf ("character %c is not alphabetic\n",str[i]);
    i++;
  }
  return 0;


#include <ctype.h> hakkında detaylı bilgi,
http://www.cplusplus.com/reference/clibrary/cctype/

İyi çalışmalar.
Yarım hazırlıkla, yarım tedbirle yapılacak taarruz, hiç taarruz etmemekten çok daha fenadır (1922). M.Kemal ATATÜRK
http://canerblt.wordpress.com
twitter : cabulut

empax

Tesekkurler ancak tam ise yaradi diyemem.

if(isalnum(sayilar[i]) || sayilar[i]<=0 || sayilar[i]>=50)

Bu halde kullanildiginda bazi harflerde Segmentation fault diyor bazi harflerde de program sapitiyor.
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

endryz


int i;

if(isalpha(i) || i == 50 || i == 0){
printf("tekrar girin");
}

else printf("dogru giriş");


sanırım bu işe yarar.

ayrıca ilk iletinde if içinde kontrol yaparken hatalı yazmışsın. == olması lazım karşılaştırma, senin ki atama operatörü olmuş. birde naçizane önerim; goto kullanmaya alışma, döngülerle yapmaya çalış. kolay gelsin.
0: her türlü amaç için yazılımı çalıştırma özgürlüğü.
1: yazılımın nasıl çalıştığını inceleme ve kendi gereksinimleri doğrultusunda değiştirme özgürlüğü.
2: yeniden dağıtma ve toplumla paylaşma özgürlüğü.
3: yazılımı geliştirme ve gelişmiş haliyle topluma dağıtma özgürlüğü.



empax

=='i buraya aktarirken hata yapmisim.
Tavsiyenizi dikkate alacagim, tesekkurler. :)



Harf girince yine Segmentation fault hatasi verdi. Bu kontrol bolumu, dun aksamdan beri ugrasiyorum.
printf(" alti tane sayi girin\n\n");
for(i=0;i<=5;i++)
{
tekrar:
printf("%d.sayi: ",i+1);
scanf("%d",&sayilar[i]);

for(j=i-1;j>=0;j--)
{
if(sayilar[i]==sayilar[j])
{
printf("Ayni sayiyi zaten girdiniz. Farkli bir sayi girin.\n");
goto tekrar;
}
}
if(isalpha(sayilar[i]) || sayilar[i]<=0 || sayilar[i]>=50) 
{
printf("Tekrar girin. (1-49)\n");
goto tekrar;
}
}
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

endryz

şu olabilir; dışarıdaki for döngüsünde i = 0 iken içerideki for döngüsünde j = -1 olma durumu oluyor, yani sayilar[-1] gibi bi durum oluşuyor ama c dilinde diziler 0 dan başlar. bu durumu düzelticek şekilde deneyebilirsin.
0: her türlü amaç için yazılımı çalıştırma özgürlüğü.
1: yazılımın nasıl çalıştığını inceleme ve kendi gereksinimleri doğrultusunda değiştirme özgürlüğü.
2: yeniden dağıtma ve toplumla paylaşma özgürlüğü.
3: yazılımı geliştirme ve gelişmiş haliyle topluma dağıtma özgürlüğü.



empax

Alıntı yapılan: endryz - 22 Temmuz 2011 - 19:59:13
şu olabilir; dışarıdaki for döngüsünde i = 0 iken içerideki for döngüsünde j = -1 olma durumu oluyor, yani sayilar[-1] gibi bi durum oluşuyor ama c dilinde diziler 0 dan başlar. bu durumu düzelticek şekilde deneyebilirsin.

C'de yeniyim, o kod parcasi icin de 2-3 saat ugrastim. :)
Girilen sayi ile kendisinden once girilen sayilar karsilastiriliyor.(kendisi ile karsilastirildiginda ve kendisi ile ayni oldugundan program ilerlemiyordu.)
Dizi[3] 'e (i=3 iken) herhangi biri rakam verildiginde Dizi[3] haric dizi[2], dizi[1], dizi[0] kontrol ediliyor.
Ama dizi[0]`a (i=0 iken) herhangi bir rakam verildiginde j, dizi[-1] oluyor(j=i-1) ve sizin deginiz durum ortaya cikiyor. Bu dikkatimden kacmisti ama problemi gideremiyorum.
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

endryz

şöyle bir şey olabilir mi acaba;

printf(" alti tane sayi girin\n\n");

for(i=0;i<=5;i++){

printf("%d.sayi: ",i+1);
scanf("%d",&sayilar[i]);

while(isalpha(sayilar[i]) || sayilar[i]<=0 || sayilar[i]>=50){

printf("Tekrar girin. (1-49)\n");
scanf("%d",&sayilar[i]);

}

for(j=0; j<=i; j++){

if ( j == i) continue;

if (sayilar[j] == sayilar[i])

{

printf("Ayni sayiyi zaten girdiniz. Tekrar girin. (1-49)\n");
scanf("%d",&sayilar[j]);

}


}


}
0: her türlü amaç için yazılımı çalıştırma özgürlüğü.
1: yazılımın nasıl çalıştığını inceleme ve kendi gereksinimleri doğrultusunda değiştirme özgürlüğü.
2: yeniden dağıtma ve toplumla paylaşma özgürlüğü.
3: yazılımı geliştirme ve gelişmiş haliyle topluma dağıtma özgürlüğü.



empax

Harf girince yine segmentation fault hatasi adlim. Ayrica icteki for dongusu girilen sayilarin ayni olup olmadigini tam anlamiyila kontrol edemiyor.
ilginiz icin tesekkurler yarin sakin kafayla tekrar bakarim kafam durdu resmen.  :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

endryz

#11
kontrol mekanizmasını şöyle güncelliyeyim o zaman  :)


for(j=0; j<=i; j++){

if(i == j) continue;

while(sayilar[i] == sayilar[j]){

printf("daha onceki girdi, tekrar gir:");
scanf("%d", &sayilar[i]);

j = 0;

}

}


fakat segmentation fault konusunda bir çözüm bulamadım  ???

ama değişkeni karakter cinsinden yapıp, isdigit ile sayı olanları belirleyip, stdlib kütüphanesinde bulunan atoi fonksiyonuyla sayıya çevirebilirsin. kulağı belki tersten göstermek oldu ama  ;D
0: her türlü amaç için yazılımı çalıştırma özgürlüğü.
1: yazılımın nasıl çalıştığını inceleme ve kendi gereksinimleri doğrultusunda değiştirme özgürlüğü.
2: yeniden dağıtma ve toplumla paylaşma özgürlüğü.
3: yazılımı geliştirme ve gelişmiş haliyle topluma dağıtma özgürlüğü.



empax

Verdiginiz kod daha derli toplu olmus sagolun ama harf isini cozemeyecegiz sanirim.

Kulagi tersten gostermekle nitelendirdiginiz yontem sanirim beni asiyor.  :)
isdigit'i bugun ilk defa gordum, atoi'yi ise daha simdi sizden duydum. Gerisini siz dusunun.  :)
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

sem

Aslında duruma göre bir strateji belirlenebilir. En garanti yolu isdigit, isaplha gibi makrolar ile girdiyi tüm olasılıklara karşı yoklamak olacaktır. Yani @endryz arkadaşın önerisi makul bence. Fakat şu şekilde bir okus pokus da bazı uygulamalar işinizi görebilir;

#include <stdio.h>


int main()
{
int x = -5;
puts("Girin:");

while(1){
fscanf(stdin,"%d", &x);
if(x != -5)
    break;
else{
   fprintf(stdout, "Kabul Edilmedi.Tekrar girin: ");
   getchar(); //scanf fonksiyonunun okumadığı \n karakteri okunuyor
}
}

}


okus pokus kısmında fscanf'in  okuma yapamadığı durumda değişken değerini değiştirememesinden yararlanıyoruz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?