Tam Sürümünü Görmek İçin : garip infinite loop
bool control(int x, int y = 1, int z = 1)
{
if(x>0 && y>0 && z>0 )
return true;
else if(!isdigit(x) || !isdigit(y) || !isdigit(z))
return false;
else
return false;
}
int main()
{
double h;
cin>>h;
fflush(stdin);
while(control(h) == false)
{
cout<<"Lengths must be greater than zero"<<endl;
fflush(stdin);
cout<<"Enter the lenght of sides: ";
cin>>h;
}
}
bu programımın kodunun bir parçası... eğer h değerine bir harf girersem while döngüsündeki cin>> çalışmıyor. sürekli
Lengths must be greater than zero
Enter the lenght of sides: Lengths must be greater than zero
Enter the lenght of sides: Lengths must be greater than zero
Enter the lenght of sides: Lengths must be greater than zero
Enter the lenght of sides: Lengths must be greater than zero
...
basıyor.
sorun nedir?
acehreli
21/03/2008, 20:52
Oncelikle, fflush konusunda karisikliklar var:
Giris akimlarina fflush uygulayamazsin. Yani fflush(stdin) yanlis. Ek olarak gereksiz de. cin>>h islemi karakterleri okuyup sana bir double vermistir. (Veya giris hatali oldugu icin verememistir ama sen onu denetlemiyorsun.)
Yine ek olarak, fflush(stdin)'in cin'i etkileyecegi zaten kesin degildir. Birisi <iostream>'in akimi, oteki <stdio.h>'nin...
control icinde birden fazla denetim yapiyorsun. O denetimleri if/else'lerle baglanabildigini sanmiyorum. Anladigim kadariyla butun kosullar dogru oldugunda 'true' dOndUreceksin.
O zaman hersey && ile baglanmali herhalde:
bool control(int x, int y = 1, int z = 1)
{
return ((x>0 && y>0 && z>0 )
&&
(isdigit(x) && isdigit(y) && isdigit(z)));
}
h double oldugu halde control int aliyor. Ote yandan isdigit kullandigina bakarak karakterlerle ilgilendigin anlasiliyor.
Ama uzunlukla (length) ilgilendigin icin karakter de kullanamazsin.
Tam olarak ne yapmak istiyorsun? Su programdaki fikirleri uygulamak isteyebilirsin. Onemli nokta, girilen karakterlerin double'a uygun olup olmadiklarini !cin denetimi ile yapiyoruz:
#include <iostream>
using namespace std;
bool control(double x, int y = 1, int z = 1)
{
return x>0 && y>0 && z>0;
}
double uzunluk_oku()
{
double h;
cout<<"Enter the length of sides: ";
cin>>h;
if (!cin) {
// !cin denetimi, giris akiminda bir hata oldugunu gosterir.
cerr << "Hata: lutfen 'double' girin\n";
/* Not: Aslinda burada throw ile bir hata atmak daha uygun olur. -1
* degerini ozel bir bilgi icin kullanmak iyi degil, ama simdilik
* idare eder... */
h = -1;
cin.clear();
cin.ignore(1000, '\n');
}
return h;
}
int main()
{
double h = uzunluk_oku();
while(control(h) == false)
{
cout<<"Lengths must be greater than zero\n";
h = uzunluk_oku();
}
}
Ali
acehreli
21/03/2008, 20:55
Orada 'ignore'u denerken 1000 ile cagirmisim. Aslinda soyle bir sey daha uygun:
#include<limits> // numeric_limits icin
/* ... */
cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
Ali
kısaca kullanıcının bir char girmesini engellemek istiyorum. (!cin) kullanımını da denedim ama olmadı malesef.
acehreli
22/03/2008, 15:59
Yani benim yazdigim programi denedin ve olmadi ha... Hangi derleyiciyi kullaniyorsun?
Izninle kili kirk yararak bir yanit vereyim: Kesinlikle sunu anlaman gerekiyor: kullanicinin char girmesini engelleyemezsin! Tam tersine, kullanici char'dan baska bir sey giremez zaten. Boyle bir seyi engelleyemezsin.
Sen, ancak girilen char'larin bir double icin yasal olup olmadiklarini denetleyebilirsin. Bunu ya zaten var olan bir fonksiyonla yapacaksin (ornegin scanf, veya cin'den okumak), ya da kendin karakter karakter okuyarak.
Eger (!cin) ise yaramadiysa derleyicinde bir sorun var.
Ali
verdiginiz cevap benim icin ciddi anlamda tatmin edici oldu. cok tesekkurler :)
saygilar
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.