Cin.clear(); //помилка, очистити статус помилки
cin.ignore(10,'\n');
cout <<"Nepravylno vvedeni dujmy\n";
}
}
//////////////////////////
int isFeet(string str)
{int slen=str.size(); //одержати довжину
if(slen==0||slen>5) //не було даних або забагато
return 0;
for(int j=0;j<slen;j++)
if((str[j]<'0'||str[j]>'9')&&str[j]!='-')
return 0;
double n=atof(str.c_str());
if(n<-999.0||n>999.0)
return 0;
return 1;
}
//////////////////
int main()
{ Distance d;
char ans;
do
{d.getdist();
cout<<"\nVidstan=";
d.showdist();
cout<<"\nWe raz (y/n)?";
cin>>ans;
cin.ignore(10,'\n');
} while (ans!='n');
return 0;
}
Програма 26.1
Програма дуже проста за винятком того, що метод getdist() розширений і спрямований на підтримку обробки помилок. Частково ця програма використовує підхід, показаний у раніше приведеному коді. Крім того, введений вираз, який слідкує за тим, щоб користувач не вводив фути у форматі чисел з плаваючою комою. Це дійсно важливо, оскільки дюйми можуть мати дробову частину, а фути – ні, і це може заплутати користувача.
Звичайно, очікуючи вводу цілочисельних значень, оператор видобування просто припиняє свою роботу, побачивши десяткову крапку. При цьому повідомлення про помилку не видається. Ми ж хочемо дізнатися про виявлену помилку, тому будемо зчитувати значення числа футів у вигляді рядка. Потім ми перевіряємо введений рядок за допомогою створеної нами функції isfeet(), що повертає true, якщо число футів введене коректно. Для схвалення нашою функцією число повинне містити лише цифри і його значення повинне лежати в межах від -999 до 999. Якщо з введеними футами все гаразд, ми конвертуємо рядок в int за допомогою стандартної бібліотечної функції atoi(). Натомість число дюймів може бути дробовим, ми перевіряємо тільки їх значення, яке повинне знаходитися в межах від 0 до 12,0.
В програмі використовується ще одна хитрість: прапор помилки встановлюється вручну. Тим самим ми перевірили, чи входять введені дюйми в діапазон допустимих значень. Якщо ні, ми встановлюємо failbit за допомогою
Дата добавления: 2015-08-26; просмотров: 1044;