Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
1

Цикл while выполняется два раза подряд

25.05.2017, 12:57. Просмотров 1326. Ответов 9
Метки нет (Все метки)

Есть такой код, у меня этот цикл выполняется 2 раза за одно нажатие клавиши, в чем может проблема?
Тоесть, выводится при первом нажатие 1,2 при втором 3,4 и тд

C++
1
2
3
4
5
6
    while (ch != 27);
    {
        ch = getch();
        k++;
        cout << k << endl;
    }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2017, 12:57
Ответы с готовыми решениями:

Два раза выполняется один и тот же цикл
В данной недопрограмме процесс проходит не совсем так, как предполагалось: действия цикла while,...

Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два раза.
С++. Даден массив. Все четные елементы массива уменьшыть в два раза, а нечетные увеличить в два...

Перечислить все последовательности из n нулей, единиц и двоек, в которых никакая группа цифр не повторяется два раза подряд (нет куска вида XX )
Перечислить все последовательности из n нулей, единиц и двоек, в которых никакая группа цифр не...

Перечислить все последовательности из n нулей, единиц и двоек, в которых никакая группа цифр не повторяется два раза подряд (нет куска вида XX )
Перечислить все последовательности из n нулей, единиц и двоек, в которых никакая группа цифр не...

Файлы. Программа, которая определяет если такой момент, что два раза вошли по одному пропуску или два раза вышли по одному (выводит все время истину)
Всем привет. Смысл задания примерно следующий: Есть файл Input.txt. Содержание его примерное...

9
liv
1168 / 974 / 200
Регистрация: 07.10.2015
Сообщений: 3,119
Завершенные тесты: 1
25.05.2017, 13:14 2
POWERR, что это за точка с запятой после while?
C
1
while (ch != 27);
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
25.05.2017, 13:23  [ТС] 3
_liv_, Случайная) без нее тоже работает не так как надо
0
liv
1168 / 974 / 200
Регистрация: 07.10.2015
Сообщений: 3,119
Завершенные тесты: 1
25.05.2017, 13:32 4
Одновременно с k, выведи и ch. Что покажет?
Кстати, у меня работает без проблем...
0
25.05.2017, 13:32
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
25.05.2017, 13:39  [ТС] 5
_liv_,
C++
1
cout << k <<endl<< int(ch) << endl;
Код
1
-32
2
77

3
-32
4
77
Откуда то -32 значение берется
0
liv
1168 / 974 / 200
Регистрация: 07.10.2015
Сообщений: 3,119
Завершенные тесты: 1
25.05.2017, 13:41 6
Двойное срабатывание может быть от нажатия на функциональные клавиши...
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
25.05.2017, 13:45  [ТС] 7
_liv_,
Цитата Сообщение от _liv_ Посмотреть сообщение
Двойное срабатывание может быть от нажатия на функциональные клавиши...
Ну у меня ноутбук, но стрелочки без доп.функций. И это можно как нибудь исправить?
0
liv
1168 / 974 / 200
Регистрация: 07.10.2015
Сообщений: 3,119
Завершенные тесты: 1
25.05.2017, 13:56 8
Все понятно
Ты жмешь на "серую" "стрелку направо".
Данная управляющая клавиша возвращает ДВА кода 0xE0, 0x4D
При приеме в char (знаковый байт), код 0xE0 интерпретируется, как число -32, а 0x4D будет 77

Добавлено через 1 минуту
Цитата Сообщение от POWERR Посмотреть сообщение
И это можно как нибудь исправить?
Игнорировать код 0xe0 = 224 (беззнаковое число) = -32 (знаковое число)

Добавлено через 4 минуты
Клавиши F1-F12 возвращают первым байтом 0
Можно еще сделать так:
1) вызываешь первый раз getch()
2) проверяешь на 0 и -32, при равенстве любому из них, вызываешь getch() еще раз
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
25.05.2017, 14:06  [ТС] 9
Цитата Сообщение от _liv_ Посмотреть сообщение
2) проверяешь на 0 и -32, при равенстве любому из них, вызываешь getch() еще раз
А почему тогда при втором вызове, опять -32 не будет возвращаться?
0
liv
1168 / 974 / 200
Регистрация: 07.10.2015
Сообщений: 3,119
Завершенные тесты: 1
25.05.2017, 14:25 10
Лучший ответ Сообщение было отмечено POWERR как решение

Решение

После нажатия на данную кнопку в буфер, в памяти компьютера, помещается два кода.
Каждый вызов забирает оттуда по одному коду.

Добавлено через 8 минут
Сделать можно примерно так:
C
1
2
3
4
5
6
7
8
    while (ch != 27)
    {
        ch = getch();
        if ((ch == 0) || (ch == -32))
            continue;
        k++;
        cout << k << " " << ch << endl;
    }
Добавлено через 3 минуты
Это, разумеется, если не надо знать, что нам нужна именно клавиша "стрелка вправо", т.к. тогда ее код совпадет с "M"

Добавлено через 1 минуту
В противном случае, получив код "-32" последующий код надо понимать, как код соответствующей клавиши
1
25.05.2017, 14:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2017, 14:25

Цикл for: зачем использовать разделитель " ; " два раза?
Cмотрите, какой вопрос. for (i = 0; ;i++) Не понимаю, зачем использовать разделитель &quot; ; &quot;...

подскажите что с кодом не так? (просуммировать два раза по два столбца, функция)
Нужно создать функцию для суммирования двух столбцов и просуммировать два раза по два столбца. Сам...

Если ввести один символ, то итерация цикла выполняется сразу два раза подряд
while (getchar()) printf(&quot;Итерация цикла.\n&quot;); Если ввести 1-ин символ, то итерация цикла...


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

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

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