// englerr.cpp // контроль ввода данных для класса английских расстояний #include #include #include // для atoi(), atof() using namespace std; int isFeet(string); //объявление /////////////////////////////////////////////////////////// class Distance // Класс английских расстояний { private: int feet; float inches; public: Distance() // конструктор (без аргументов) { feet = 0; inches = 0.0; } Distance(int ft, float in) // конструктор (2 арг.) { feet = ft; inches = in; } void showdist() // вывод расстояния { cout << feet << "\'-" << inches << '\"';} void getdist(); // запросить длину // у пользователя }; //--------------------------------------------------------- void Distance::getdist() // получение длины от пользователя { string instr; // для входной строки while(true) // цикл, пока футы // не будут правильными { cout << "\n\nВведите футы: "; cin.unsetf(ios::skipws);// не пропускать // разделители cin >> instr; // получить футы как строку if( isFeet(instr) ) // правильное значение? { //да cin.ignore(10, '\n'); // съесть символы, // включая разделитель строк feet = atoi( instr.c_str() ); // перевести // значение в целочисленное break; // выход из цикла 'while' } // нет, не целое cin.ignore(10, '\n'); // съесть символы, включая // разделитель строк cout << "Футы должны быть целыми < 1000\n"; } //конец цикла while для футов while(true) // цикл проверки дюймов { cout << "Введите дюймы: "; cin.unsetf(ios::skipws);// не пропускать // разделители cin >> inches; // получить дюймы (тип float) if(inches>=12.0 || inches<0.0) { cout << "Дюймы должны быть между 0.0 и 11.99\n"; cin.clear(ios::failbit); //"искусственно" //установить флаг ошибки } if( cin.good() ) // все ли хорошо с cin { //(обычно вводят не цифры) cin.ignore(10, '\n'); // съесть разделитель break; // Ввод корректный, выйти из 'while' } cin.clear(); // ошибка; очистить статус ошибки cin.ignore(10, '\n'); // съесть символы с разделителем cout << "Неверно введены дюймы\n"; //заново } //конец while для дюймов } //--------------------------------------------------------- int isFeet(string str) // true если введена строка { // с правильным значением футов int slen = str.size(); // получить длину if(slen==0 || slen > 5) // не было или слишком много // данных return 0; // не целое for(int j=0; j '9')&&str[j] != '-') return 0; // строка неправильных футов double n = atof( str.c_str() ); // перевод в double if( n<-999.0 || n>999.0 ) // вне допустимых значений? return 0; // если да, неправильные футы return 1; // правильные футы } /////////////////////////////////////////////////////////// int main() { Distance d; //создать объект Distance char ans; do { d.getdist(); // получить его значение cout << "\nРасстояние = "; d.showdist(); // вывести его cout << "\nЕще раз (y/n)? "; cin >> ans; cin.ignore(10,'\n' ); // съесть символы и // разделитель } while(ans != 'n'); // цикл до 'n' return 0; }