Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159

Бесконечный цикл при вводе букв или символов

05.01.2023, 18:57. Показов 935. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
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
#include <iostream>
#include <windows.h>
#include <time.h>
#include <math.h>
 
 
using namespace std;
double f(double x)
    {
        return (sqrt(1+pow(x,2)));///////////функция которая дана в интеграле
    }
int main(int argc, char** argv) {
    
    setlocale(LC_ALL,"Rus");
    while(true)
    {
        int a;//Обозначения Отрезков а,b, а также шаг h
        int b;
        float h;
        do{
            system("cls");
            cout << "Введите а => "; cin >> a; cout << endl;///////ДЕЛАЕМ ЦИКЛ ВВОДА ДАННЫХ + ПОВТОР ВВОДА В СЛУЧАЕ НЕ ВЕРНЫХ ВВОДИМЫХ ДАННЫХ
            cout << "Введите b => "; cin >> b;cout << endl;
            cout << "Введите h => "; cin >> h;cout << endl;
        }while((a < 0) || (b > 21) || (a > b) || (h > 1) || (h < 0.0001));
        cout << "a = " << a << endl << "b = " << b << endl << "h = " << h << endl;
        
        
        float I;///Задаём букву для интеграла
        I = 0.0;
        int n,i; ///создаём переменные для трапеции и счётчика
        n = (b-a)/h;///формула трапеции.
        I = h * (f(a) + f(b))/2;
        for (i = 0; i < n; i++){
            I = I + h * f(a + h * i);////считаем интеграл
        }
        cout << "I = " << I << endl;////выводим интеграл
        cout << "Конец" << endl;
        Sleep(20000);
        
    }
    return 0;
}
Добавлено через 1 минуту
Написал код для вычисления интеграла методом трапеции. Но что-то пошло не так. При вводе символов или букв беск. цикл.
Пытался делать через cin.ignore(). Такая же штука с бесконечным циклом получается
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2023, 18:57
Ответы с готовыми решениями:

Бесконечный цикл при вводе букв
Почему если ввести в переменную управляющую циклом символ, при том ,что это переменная типа int, цикл станет бесконечным? Пример кода:...

Бесконечный цикл при вводе букв
Написал простую программку, в которой считается площадь, высота и диагонали параллелограмма. Через while я смог добиться того, чтобы при...

Как сделать, чтобы при вводе в меню (через switch) букв, не выпадал бесконечный цикл
Помогите, пожалуйста! Когда ввожу переменную не типа int, а допустим слово, то происходит бесконечный цикл. Как это исправить? (Для тех,...

14
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
05.01.2023, 19:04
Он проверяет ваши условия (a < 0) || (b > 21) || (a > b) || (h > 1) || (h < 0.0001). Я ввожу 10, 20, 0.001 и программа считает
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
05.01.2023, 19:11
поток ввода корраптится. можно его плохое состояние сбросить или же проверку в цикл добавить и после цикла тоже:
C++
1
2
3
4
5
6
7
8
9
10
11
      do{
            system("cls");
            cout << "Введите а => "; cin >> a; cout << endl;///////ДЕЛАЕМ ЦИКЛ ВВОДА ДАННЫХ + ПОВТОР ВВОДА В СЛУЧАЕ НЕ ВЕРНЫХ ВВОДИМЫХ ДАННЫХ
            cout << "Введите b => "; cin >> b;cout << endl;
            cout << "Введите h => "; cin >> h;cout << endl;
        }while(cin && (a < 0) || (b > 21) || (a > b) || (h > 1) || (h < 0.0001));
 
       if (!cin)
       {
          std::cout << "ERROR AHTUNG WTF" << std::endl;
       }
еще вариант - настроить std::cin так, чтобы он бросал исключения, а не в плохое состояние устанавливался
C++
1
2
3
std::cin.exceptions(std::istream::failbit);
do { 
...
0
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
05.01.2023, 19:18  [ТС]
ну она и должна считать
Цитата Сообщение от Evgen173 Посмотреть сообщение
Он проверяет ваши условия (a < 0) || (b > 21) || (a > b) || (h > 1) || (h < 0.0001). Я ввожу 10, 20, 0.001 и программа считает
Добавлено через 3 минуты
всё равно ведь цикл бесконечный получается
Или я вас не правильно понимаю
Цитата Сообщение от MegaJopa Посмотреть сообщение
поток ввода корраптится. можно его плохое состояние сбросить или же проверку в цикл добавить и после цикла тоже:
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
05.01.2023, 19:25
C++
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
#include <iostream>
 
int main()
{
  using namespace std;
 
  int h = 0;
 
  // unfinite
//  do
//  {
//    cout << "input int: ";
//    cin >> h;
//  } while (h == 0);
 
  // ok
  do
  {
    cout << "input int: ";
    cin >> h;
  } while (cin && h == 0);
 
  if (!cin)
  {
    std::cout << "ERROR AHTUNG WTF" << std::endl;
  }
 
  return 0;
}
ожидается ввод инта. если вбить буквы, то cin приводится в плохое состояние, h не изменило свое значение и цикл повторяется. поскольку cin в плохом состоянии, то следующая операция ввода даже не ожидает никакого ввода с клавы, она пускается и так до бесконечности. но если добавить проверку как во втором цикле, то все заканчивается.
1
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
05.01.2023, 19:35  [ТС]
я так понимаю для a и b, можно сделать аналогичным образом?

Добавлено через 49 секунд
типо вот так
Цитата Сообщение от MegaJopa Посмотреть сообщение
do
  {
    cout << "input int: ";
    cin >> h;
  } while (cin && h == 0);
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
05.01.2023, 19:37
Цитата Сообщение от PrOgGeR_nA_5 Посмотреть сообщение
я так понимаю для a и b, можно сделать аналогичным образом?
достаточно сделать так, как в сообщении #3
если же нужно чтоб прога была прям супердружелюбной к некорректному вводу пользователя, то конечно нужно после каждого ввода поток проверять. еще лучше, вводить строки и превращать их в double и прочие числовые типы, т.к. после ввода строк поток прятли перейдет в плохое состояние. а ошибки преобразования строки в числовой тип можно выводить в виде осмысленного текста, чтобы юзер понял, что где он накосячил и исправился.
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
05.01.2023, 19:40
Лучший ответ Сообщение было отмечено PrOgGeR_nA_5 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int a;//Обозначения Отрезков а,b, а также шаг h
        int b;
        float h;
        char num[100];
        do
        {
            system("cls");
            cout << "Введите а => ";
            cin >> num;
            if( !(a=atoi(num)) ) continue;
            cout << endl;///////ДЕЛАЕМ ЦИКЛ ВВОДА ДАННЫХ + ПОВТОР ВВОДА В СЛУЧАЕ НЕ ВЕРНЫХ ВВОДИМЫХ ДАННЫХ
            cout << "Введите b => ";
            cin >> num;
            if( !(b=atoi(num)) ) continue;
            cout << endl;
            cout << "Введите h => ";
            cin >> num;
            if( !(h=atof(num)) ) continue;
            cout << endl;
        }
        while((a < 0) || (b > 21) || (a > b) || (h > 1) || (h < 0.0001));
1
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
05.01.2023, 20:45  [ТС]
Evgen173, Скажите пожалуйста что значит atoi и atof? Я просто не знаю что это
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
05.01.2023, 20:48
Цитата Сообщение от PrOgGeR_nA_5 Посмотреть сообщение
Evgen173, Скажите пожалуйста что значит atoi и atof? Я просто не знаю что это
что ты как из древности? вбей эти слова и любые другие, которые тебе встретяться в любом поисковике. конкретно на функции atoi и atof поисковики в первой же строчке выдают то, что нужно.
0
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
06.01.2023, 09:32  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
do
        {
            system("cls");
            cout << "Введите а => ";
            cin >> num;
            if( !(a=atoi(num)) ) continue;
            cout << endl;///////ДЕЛАЕМ ЦИКЛ ВВОДА ДАННЫХ + ПОВТОР ВВОДА В СЛУЧАЕ НЕ ВЕРНЫХ ВВОДИМЫХ ДАННЫХ
            cout << "Введите b => ";
            cin >> num;
            if( !(b=atoi(num)) ) continue;
            cout << endl;
            cout << "Введите h => ";
            cin >> num;
            if( !(h=atof(num)) ) continue;
            cout << endl;
        }
данный код проверяет правильность ввода, но если ты вводишь всё правильно цикл всё равно обнуляется. Странно
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
06.01.2023, 09:58
Цитата Сообщение от PrOgGeR_nA_5 Посмотреть сообщение
данный код проверяет правильность ввода, но если ты вводишь всё правильно цикл всё равно обнуляется. Странно
циклы не обнуляются. выражайся яснее.
0
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
06.01.2023, 11:35  [ТС]
MegaJopa, Ну смотри. Я ввожу числа 1, 10, 0.1. Экран очищается и производится повторный ввод
0
79 / 60 / 22
Регистрация: 14.12.2022
Сообщений: 240
06.01.2023, 11:57
Лучший ответ Сообщение было отмечено PrOgGeR_nA_5 как решение

Решение

PrOgGeR_nA_5, похоже все дело в установленной русской локали, в которой 0.1 считается некорректным числом с плавающей точкой. ожидается не точка, а запатая.

C++
1
2
3
4
5
6
7
8
9
10
  const float f11 = atof("0.1"); // ok
  const float f12 = atof("0,1"); // не конвертится
  std::cout << "f11 = " << f11 << std::endl;
  std::cout << "f12 = " << f12 << std::endl;
 
  setlocale(LC_ALL, "Rus");
  const float f21 = atof("0.1"); // не конвертится
  const float f22 = atof("0,1"); // ok
  std::cout << "f21 = " << f21 << std::endl;
  std::cout << "f22 = " << f22 << std::endl;
Code
1
2
3
4
f11 = 0.1
f12 = 0
f21 = 0
f22 = 0.1
1
My C# lvl is bad
1 / 1 / 0
Регистрация: 04.01.2023
Сообщений: 159
06.01.2023, 12:14  [ТС]
всё, понял, спасибо, сейчас проверю

Добавлено через 2 минуты
Урааааа! Спасибо большое мил человек!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2023, 12:14
Помогаю со студенческими работами здесь

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
void mainmenu() { cout &lt;&lt; &quot;Введи число&quot; &lt;&lt; endl; cin &gt;&gt; choice; if (choice == 1) { cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl; } ...

При вводе не числа, программа уходит в бесконечный цикл
Помогите исправить, даже не хнаю как исправить... Если написать не число, а букву допустим, так тогда циклом начинает флудить текстом. И...

Бесконечный цикл при вводе несоответствующего типа данных
Цикл, который просит ввести пользователя число, если это число ни одно из чисел 1, 2 или 3, то цикл повторяется вновь, как только получаем...

Происходит бесконечный цикл при неправильном вводе. Как это исправить?
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double input() { while (true) { double a; cin &gt;&gt;...

При вводе дробного (нецелого) числа программа уходит в бесконечный цикл
при вводе к примеру числа 10,5 в любое значение (r, x, y) программа сразу уходит в бесконечный цикл текст программы: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru