Меня затронула эта проблема и я решил разобраться. Написал код, который работает так, как ты ожидал. Ну почти. Теперь он хитрый стал и не отстанет от пользователя, пока тот не введет то, что надо
Код:
// sqrt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
bool Continue (const char *theThingWeAreDoing)
{
char DoneCharacter;
cout << endl << theThingWeAreDoing << " - Nazhmite \"n\" i \"Enter\" dlya vihoda ili druguyu klavishu dlya povtora: ";
cin >> DoneCharacter;
return (DoneCharacter != 'n');
}
int NumError(void)
{
cerr << "Vozmozhno vi vveli ne chislo!" << endl;
cin.clear();
char BadInput[5];
cin >> BadInput;
return 1;
}
//Моя новая функция для хитрого ввода
double Input(const char *s)
{
double r;
cout << s;
while(!(cin >> r)){
//Вводящий что то напартачил. Ругнём его
cout << "Eto ne chislo. Poprobujte eshche!" << endl;
//Очистим буфер
cin.clear();
//Проигнорируем все символы до конца строки, но не больше 80
cin.ignore(80, '\n');
//и на второй круг
};
return r;
};
int _tmain(int argc, _TCHAR* argv[])
{
do{
try{
cout << "Vvedite argumenty a, b, c uravneniya vida \"ax^2 + bx + c = 0\" v sootvetstvii s ih znakami. a ne dolzhno byt' ravno 0." << endl;
double a = Input("a: ");
if(a == 0){
cout << "a ne dolzhno byt' ravno 0!" << endl;
}else{
double b = Input("b: ");
double c = Input("c: ");
double D = (b*b)-(4*a*c);
if(D < 0){
cout << "Diskriminant menshe 0!" << endl;
}else{
double x1 = (-(b)-sqrt(D))/(a*2);
double x2 = (-(b)+sqrt(D))/(a*2);
if(fabs(D) <= 0.001){
cout << "x = " << x1 << "." << endl;
}
else{//Здесь было условие. Но учитывая предыдущее, его смело можно убрать
cout << "x1 = " << x1 << ";" << endl;
cout << "x2 = " << x2 << "." << endl;
}
}
}
}
catch(...)
{
NumError();//Теперь это наверное не надо.
};
}
while (Continue("Escho raz? "));
return 0;
}
Этот код я проверял на 2005 студии, а тот пример был скомпилирован в 6. Код я покоментировал, поэтому должно быть понятно
Социальные закладки