Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
#1

Цикл не прерывается при вводе Enter - C++

27.05.2014, 10:16. Просмотров 1396. Ответов 34
Метки нет (Все метки)

Хотелось бы узнать почему цикл while не прерывается при введение enter. Переписал код всеми доступными мне способами. вроде бы нет ошибок но не работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <conio.h>
#include <vector>
int main()
{
    setlocale( LC_ALL, "Russian");
    std::vector<int> num;
    int a;
    char s = '\n';
std::cout << "Введите несколько чисел: \n";
while(std::cin >> a && a != s)
a % 2 != 0 ? num.push_back(a): num.push_back(a*2);
for(int r = 0; r < num.size(); r++)
    std::cout << r << " Элемент вектора: " << num[r] << std::endl;
_getch();
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2014, 10:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Цикл не прерывается при вводе Enter (C++):

Как остановить цикл при вводе enter? - C++
#include &lt;iostream&gt; using namespace std; int main() { for (;;) { //как остановить цикл при вводе enter ...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? - C++
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; } ...

Ошибка с массивом: программа при вводе "ступорится" при нажатии клавиши Enter - C++
Задание: Напишите программу, используя указатели, которая вычисляет адреса чётных элементов массива, состоящего из 10 чисел типа float. ...

Как сделать, чтобы при вводе в консоли <Enter> не переводил курсор на начало следующей строки? - C++
Есть некий ввод символов, организованный через cin.get(char &amp;), или через cin.get(char &amp;, int), или через cin.getline(char &amp;, int)....

Завершить игровой цикл при вводе нуля - C++
Задание. Создать программу со структурой player. Структура должна содержать поля level - для сохранения уровня игрока (начальное...

Как прервать цикл при вводе 0, и начать расчет - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() { setlocale(LC_ALL,...

34
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 11:08 #2
Вводить надо не enter а ctrl+Z
0
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 11:25  [ТС] #3
Цитата Сообщение от zss Посмотреть сообщение
Вводить надо не enter а ctrl+Z
Не понял. Причем тут контрол +з?
Ввожу несколько чисел жму энтер не чего не произходит. Ввожу любой другой символ потом ентер программа работает
0
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 12:08 #4
ctrl+Z - это признак конца файла.
0
Изображения
 
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 13:35  [ТС] #5
Народ помогите мне. Прошу. В чем моя ошибка? Не чего не могу придумать. Цикл while должен остановится если условия цикла не верны. При вводе enter переменная "а" получает значение '\n'. Что делает условия цикла не верным.
C++
1
2
char s = '\n';
while(std::cin >> a && a != s)
Цикл должен прекратится при получение a = '\n';

Пробовал следующие варианты чтоб остановит цикл при нажатие энтер.
C++
1
2
3
4
5
6
7
char s = '\n';
while(std::cin >>a)
{
if( a == s)
break;
else
....}
Не работает. Цикл должен прекратится если условия оператора if верны (а == s)

C++
1
2
3
4
5
std::cin >> a;
    do  
        a % 2 != 0 ? num.push_back(a*2): num.push_back(a);
        while( a == s)
            break;
Выдает ошибку типа перед break; должен быт ";" Не знаю в чем проблема. Но цикл должен прекратится.

C++
1
2
3
4
std::cin >> a;
    while( a != s)
        {
    a % 2 != 0 ? num.push_back(a*2): num.push_back(a);}
Не работает. Цикл должен проверит условие a != s и продолжит своею работу если резулmтат условия true.

Добавлено через 4 минуты
zss, условия цикла требует чтоб цикл остановился при получение символа новой строки. Потом причем тут контрол +з? Цикль завершаеться при получение любого символа который отличается от int. Но надо чтоб программа работала правильно. Это похоже на остановку машины без тормозов.

Добавлено через 14 минут
Тема актуальна. Мне все еще нужна помощь. Уже 2 дня проверяю этот код.

Добавлено через 34 минуты
Тема актуальна. Мне все еще нужна помощь.
0
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 14:04 #6
Цитата Сообщение от Altair42 Посмотреть сообщение
while(std::cin >>a)
Поскольку a имеет тип int, то при вводе все пробельные символы пропускаются
(в т.ч. и '\n'). А чем Вас не устраивает ctrl+Z ? Это общеизвестный способ завершения консольного ввода.
В посте №4 я продемонстрировал, что на Вашей программе он прекрасно срабатывает.
0
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 14:33  [ТС] #7
zss, я знаю что он работает. Так же как и ввод любого символа. Но это не этично ввести ошибочный символ чтоб завершит цикл. Может быт для вас это в порядке вещей. Но представте что вы пишете программу для кого та. Пользователь нажимает энтер но не чего не произходит. Пользователь не должен знать что если ввести ошибочный символ программа заработает. Язык С++ предоставляет возможности завершит цикл. Вам бы понравилось если бы на вашей машине не работали тормоза и каждый раз чтоб тормозит вам пришлось бы врезаться об стену?
Да все пробельные символы пропускаются но сим вол новой строки инициализирован. Я так делал в других программах все работало норм.
Если символ новый строки пропускаеться как и пробел то почему работает этот код?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    setlocale (LC_ALL, "Russian");
    vector<int> num;
    std::cout << " Введите несколько чисел : "  <<std::endl;
    int a;
    char s='\n';
    while (std::cin >> a && a != s)
     {   num.push_back(a);
    
    
    int *ar = new int [num.size()];
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar + 1 << std::endl;}
     delete [] ar;
    }
        _getch();
            return 0;
    }
Разница в цикле while только в том что в коде котором я показал на первом посте за 1 шаг цикла делаеться несколько операциий. А на этом коде только 1.

Добавлено через 8 минут
И еще. Если дат условие чтоб цикл завершился при получение символа пробела то он должен завершится. Не имеет значение какой символ если в условие написано что надо завершит цикл при получение хз какого та там символа то цикл должен завершится.

Добавлено через 1 минуту
Прошу прошение в этом коде несколько операций. Забыл про фигурные скобки
0
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 15:45 #8
ctrl+Z это не ошибочный символ. это признак конца ввода.
Но если Вас не устраивает, то читайте в текстовую строку,
а потом переводите в целое число:
C++
1
2
3
char buf[100];
cin.getline(buf,100);
int a=atoi(buf);
Цитата Сообщение от Altair42 Посмотреть сообщение
while (std::cin >> a && a != s) { num.push_back(a);}
Есть один выход из этого цикла- ввод числа 10, тогда 10=='\n' истина.
Но как оператор до такого догадается? А то, что ctrl+Z - конец ввода почти все знают
(наверное кроме Вас).
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
27.05.2014, 16:19 #9
C++
1
int a ;
При вводе чисел разделители игнорируются(пробелы, табуляция, переводы строк), так что
C++
1
std::cin >> a && a!= s;
будет истинно пока не будет введено число, равное коду '\n'(char s = '\n'), или пока не произойдет ошибка чтения числа(например, наткнется на букву)
0
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 16:44  [ТС] #10
Croessmah я это понял н огда почему следующая программа работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    setlocale (LC_ALL, "Russian");
    vector<int> num;
    std::cout << " Введите несколько чисел : "  <<std::endl;
    int a;
    char s='\n';
    while (std::cin >> a && a != s)
     {   num.push_back(a);
    
    
    int *ar = new int [num.size()];
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar + 1 << std::endl;}
     delete [] ar;
    }
        _getch();
            return 0;
    }
0
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 16:49 #11
Цитата Сообщение от Altair42 Посмотреть сообщение
почему следующая программа работает?
Еще раз повторяю - она точно так же работает как и предыдущая.
Цикл while заканчивается в 2 случаях
1. При вводе числа 10
2. При вводе ctrl+Z.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
27.05.2014, 16:50 #12
Цитата Сообщение от Altair42 Посмотреть сообщение
Croessmah я это понял н огда почему следующая программа работает?
Распишем по пунктам:
1. Считываем число в a
2. Добавляем число в вектор
3. Выделяем память под int'ы
4. Не понятные циклы с выводом
5. Освобождение памяти
6. Переходим к пункту один.

Получаем такое же поведение.
0
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 17:02  [ТС] #13
zss, в второй программе выход из цикла по нажатию энтер , при вводе 10 и при вводе любого символа.

Цикл не прерывается при вводе Enter
0
zss
Модератор
Эксперт С++
6526 / 6088 / 2003
Регистрация: 18.12.2011
Сообщений: 15,840
Завершенные тесты: 1
27.05.2014, 17:05 #14
Это не выход из цикла, а ожидание следующей порции ввода.
Посмотрите в отладчике.
0
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 346
27.05.2014, 17:05  [ТС] #15
zss, я не говорил что вы не правы и т.п. Я вижу что 1 программа так работает а другой нет.

Цитата Сообщение от Croessmah Посмотреть сообщение
Получаем такое же поведение.
Не совсем такое. Эта программа при нажатие энтер выходит из цикла.
0
27.05.2014, 17:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2014, 17:05
Привет! Вот еще темы с ответами:

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

Завершить цикл при вводе значения первой переменной - C++
Сама задача: Водителям небезразличен пробег их автомобилей. Один водитель записал данные о нескольких заправках своей машины, записывая...

Цикл for на 5 итераций прерывается после 1-ой, 2-ой или 3-ей - C++
Собственно, вся проблема в заголовке. Цикл, тело которого должно вызываться 5 раз, обрывается после первого или второго вызова, когда как,...

После первого scanf выводятся сразу все оставшиеся printf и цикл прерывается - C++
Только начал изучать структуры и не могу сообразить почему у меня криво работает цикл. После первого scanf выводятся сразу все оставшиеся...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru