1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//clang Ввод только чисел Листинг #1 #include <iostream> using namespace std; int main(){ double value = 0; cout << "input value: "; //Диалог: введите число while (!(cin >> value)){ //пока не будет введено нормальное число, выполняем цикл cout << "error\n"; //сообщаем об ошибке ввода cin.clear(); //сбрасываем коматозное состояние cin fflush(stdin); //очищаем поток ввода } cout << "value = " << value << '\n'; cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//clang Ввод только числа с помощью строки Листинг #2 #include <iostream> #include <cstring> using namespace std; /*ФУНКЦИЯ ПРОВЕРКИ ВВЕДЁННОЙ СТРОКИ НА ЧИСЛОВОЙ ХАРАКТЕР*/ bool is_digit(const char *S){ const char *temp = "0123456789-+"; unsigned point_count = 0; for (int i=0; i<strlen(S); i++){ if ((i>0) && (S[i] == '+' || S[i] == '-')) return false; if (S[i] == '.') { point_count++; if (point_count > 1) return false; } if (!strchr(temp,S[i])) return false; } return true; } /*КОНЕЦ ФУНКЦИИ ПРОВЕРКИ*/ int main() { const int N = 256; char S[N]; double value = 0; //вводимое число /*ПЕРЕД ВВОДОМ ЧИСЛА ВВОДИТЬ И ПРОВЕРЯТЬ СТРОКУ*/ cin.getline(S,N); while(!is_digit(S)){ cerr << "error\n"; cin.getline(S,N); } /*КОНЕЦ ПРОВЕРКИ СТРОКИ*/ /*ПОСЛЕ ТОГО КАК ВВЕДЕНО ВСЁ-ТАКИ ЧИСЛО В НОРМАЛЬНОМ ВИДЕ, ЗАПОМИНАЕМ ЕГО*/ value = atof(S); //Записываем значение в value с помощью функции atof cout << "value = " << value << '\n'; cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//clang Листинг #3 Подсчёт среднего арифметического Цикл ввода чисел #include <iostream> using namespace std; int main(){ const int N = 5; int arr_cost[N] = {}; //массив цен предметов торговли int i = 0; //счётчик цикла cout << "Input cost of product: \n"; //Введи цену товара cout << "Product N_" << i + 1 << ": "; //диалог на экран while ( i<N && cin >> arr_cost[i]){ i++; //не забываем, что у while надо изменять счётчик if (i < N){ //чтобы не выводило лишнюю строчку cout << "Product N_" << i+1 << ": "; } } float total = 0; //Оценка средней стоимости /*считаем всю сумму на товары*/ for (int j=0; j<i; j++){ total = total + arr_cost[j]; } /*считаем среднюю стоимость*/ total = total/i; cout << "\nwill pay summ: " << total << '\n'; //Вывод оплачиваемой суммы cout << "done\n"; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
//clang Листинг #4 Цикл ввода чисел Нарушение типа отключает ввод #include <iostream> using namespace std; int main(){ const int N = 5; int arr_cost[N] = {}; //массив цен предметов торговли int i = 0; //счётчик цикла cout << "Input cost of product: \n"; //Введи цену товара cout << "Product N_" << i + 1 << ": "; //диалог на экран while ( i<N && cin >> arr_cost[i]){ i++; //не забываем, что у while надо изменять счётчик if (i < 90+ N){ //чтобы не выводило лишнюю строчку cout << "Product N_" << i+1 << ": "; } } float total = 0; //Оценка средней стоимости /*считаем всю сумму на товары*/ for (int j=0; j<i; j++){ total = total + arr_cost[j]; } /*считаем среднюю стоимость*/ total = total/i; cout << "\nwill pay summ: " << total << '\n'; //Вывод оплачиваемой суммы cout << "done\n"; int y = 0; cin >> y; cin >> y; cin >> y; cin >> y; cin >> y; cin >> y; cin >> y; //Хоть 100 вводов - оно не работает /*так тоже*/ cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
//clang Листинг #5 Подсчёт среднего арифметического Цикл ввода чисел #include <iostream> using namespace std; int main(){ const int N = 5; int arr_cost[N] = {}; //массив цен предметов торговли int i = 0; //счётчик цикла cout << "Input cost of product: \n"; //Введи цену товара cout << "Product N_" << i + 1 << ": "; //диалог на экран while ( i<N && cin >> arr_cost[i]){ i++; //не забываем, что у while надо изменять счётчик if (i < 90+ N){ //чтобы не выводило лишнюю строчку cout << "Product N_" << i+1 << ": "; } } float total = 0; //Оценка средней стоимости /*считаем всю сумму на товары*/ for (int j=0; j<i; j++){ total = total + arr_cost[j]; } /*считаем среднюю стоимость*/ total = total/i; cout << "\nwill pay summ: " << total << '\n'; //Вывод оплачиваемой суммы cout << "done\n"; if (!cin) // ввод прекращается с помощью нечислового значения { cin.clear(); // Сообщаем cin, что теперь все огрехи подчищены cin.get(); // чтение нечислового значения (извлекаем нарушивший работу символ) } int y = 0; cout << "input y: "; cin.get(); // чтение конца строки после последнего ввода // cin.get(); // ожидание нажатия пользователем клавиши <Enter> cin >> y; cout << y << '\n'; //system("PAUSE"); //Для Visual Studio } |
1 2 |
while ( i<N && cin >> arr_cost[i]){ //если i < N дало false, то всё, что правее, выполняться не будет, //потому что это не имеет смысла. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//clang Ввод только чисел Листинг #6 #include <iostream> using namespace std; int main(){ const int N = 5; int arr[N]; for (int i=0; i<N; i++){ cout << "arr [" << i << "]: "; while (!(cin >> arr[i])){ cin.clear(); //сбро ввода while (cin.get() != '\n') { continue; } cout << "input error, please input the number: \n"; //Диалоговое сообщение, что введена не цифра и просьюа ввести число cout << "arr [" << i << "]: "; } } cout << "\nOutput array:\n"; //Выводим массив for (int i=0; i<N; i++) cout << arr[i] << ' '; cout << '\n'; cin.get(); cin.get(); } |
Гарантировать ввод числа (например, float) можно ещё так:
я ввожу плюс или минус,а возращает не false, a true
Да, это проверка, которая определяет + или — принадлежат к знаку числа или являются частью строки:
+788 — число
-55 — число
55-99 — не число
ЭТО БУДЕТ ПЕРЕПОЛНЕНИЕ СТЕКА?
Если в int вмещается 999999999, и памяти хватает для 3 int, то никаких проблем не будет.
я ввожу плюс или минус,а возращает не false, a true
а я понял типо если это будет не первый символ то false?
Не понимаю это обьясните,пожалуйсто
if (strcchr(Строка, Искомый_Символ) == NULL) return false;
Функция strchr возвращает указазатель, если символа в строке найдено не было, то возвращается нулевой указатель. Если символа не нашлось (т. е. функция вернула нулевой указатель), то отдаём false
ЭТО БУДЕТ ПЕРЕПОЛНЕНИЕ СТЕКА?