Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
#1

Проверка на нажатие стрелок на клавиатуре - C++

18.05.2014, 10:55. Просмотров 2041. Ответов 6
Метки нет (Все метки)

есть такая конструкция

C++
1
2
3
4
5
void func()
{
    char login[10] = {NULL};
    login[i] = _getch();
}
нужно сдалать проверку на ввод стрелочки(любой, в право влево), еслии она была нажата то выйти из функции, сама стрелочка записывается как буква ,,а,, поэтому хз что предпринять, подскажите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 10:55     Проверка на нажатие стрелок на клавиатуре
Посмотрите здесь:
C++ Ввод данных с использованием стрелок на клавиатуре
Проверка, ввел ли пользователь что-нибудь на клавиатуре? C++
C++ Нажатие определенной клавиши на клавиатуре = Запуск определенной функции
Проверка на нажатие клавиш C++
C++ Обработка нажатия клавиш-стрелок
Не обрабатываются нажатия клавиш стрелок C++
C++ Перемещение по списку с использованием стрелок в консоли
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
18.05.2014, 11:07     Проверка на нажатие стрелок на клавиатуре #2
Стрелки клавиатуры в консоли
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
18.05.2014, 11:38     Проверка на нажатие стрелок на клавиатуре #3
у каждой стрелочки есть свой код, вверх это 72, влево 75, вправо 78 или 77, вниз 80, для проверки скомпилируй и запусти, и жми клавишу, код которой хочешь узнать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
char a;
while(true)
{
if(kbhit()) // kbghit() возвращает true, если была нажата хоть какая клавиша
{ // и эта клавиша попадает в a через getch();
a = _getch(); // getch(); не в visual studio этот вариант
std::cout << (int)a << std::endl; //printf("%d\n",a); принтф более предпочтительнее 
}
}
}
Добавлено через 6 минут
вот более оптимальный код:
он лучше, т.к. не нагружает процессор и в прошлом сообщении я код не проверял и не добавил conio.h, а этот код я сам проверил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    char a;
    while((a = getch())!=27) // выходит, если клавиша, которую ввёл равна 27(27 - Esc)
    {
        cout << (int)a << endl; /* выводится код самой клавиши с преобразованием в число, иначе бы вывелись символы H M и что-то ещё, 1ое число будет -37, это означает что какая-то стрелка, а потом даётся код этой стрелки */
    }
}
Думаю в конце твоей программы с switch() у тебя проблем не будет
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
18.05.2014, 23:20  [ТС]     Проверка на нажатие стрелок на клавиатуре #4
а как тут можно сделать несколько условий?
while((a = getch())!=27) чтобы небыло равно 27 и еще паре кнопок? если ж я напишу a = getch())!=27 && a = getch())!=28 и тд то буду несколько раз нажимать? или нет?

Добавлено через 4 часа 35 минут
никто не в курсе?

Добавлено через 1 час 12 минут
while((a = getch())!=27) так не работает, он записывает в массив букву ,,а,, и на сравнние с числом не реагирует
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
19.05.2014, 00:17     Проверка на нажатие стрелок на клавиатуре #5
Цитата Сообщение от mh-coder Посмотреть сообщение
а как тут можно сделать несколько условий?
while((a = getch())!=27) чтобы небыло равно 27 и еще паре кнопок? если ж я напишу a = getch())!=27 && a = getch())!=28 и тд то буду несколько раз нажимать? или нет?
Добавлено через 4 часа 35 минут
никто не в курсе?
Добавлено через 1 час 12 минут
while((a = getch())!=27) так не работает, он записывает в массив букву ,,а,, и на сравнние с числом не реагирует
итак, по порядку

1: сделать while(kbhit()), а в теле переместить в переменную char код от getch(), и через switch его сравнивать, если он равен 27, 28, то break;, альтернатива: while(a=getch()!=27 && a!=28) или for(char a=getch();;a=getch())

2: я в курсе, я ответил

3: работает, нужно вначале проверить, сравнение идёт с числом по коду, у каждого символа есть код от -127 до 127 или от 0 до 255, у esc это 27, и, т.к. 27 не заключены в '' или "", то это считается кодом, чтобы узнать код символа, надо вывести переменную как число, то есть int(cout << (int)a или printf("%d",a))

для закрепления, скомпилируй и запусти, все коды всех символов:

C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <conio.h>
 
int main()
{
for(int i=-128;i<128;i++,delay(100))
printf("simvol %c imeet code %d",i,i); // %c это выведет перменную как символ, а %d как число(код символа)
getch();
}
Добавлено через 6 минут
вот более правильный код, delay в windows не во всех работает:

C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
int main()
{
for(int i=-128;i<128;i++,Sleep(100))
printf("simvol %c imeet code %d\n",i,i); // %c ГЅГІГ® âûâåäåò ïåðìåГ*Г*ГіГѕ ГЄГ*ГЄ ñèìâîë, Г* %d ГЄГ*ГЄ ÷èñëî(êîä ñèìâîëГ*)
getch();
}
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
19.05.2014, 00:32     Проверка на нажатие стрелок на клавиатуре #6
Не понятно, что ты хочешь. Стрелочка генерирует сразу два символа: "-32" и еще один.

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
char act;  // переменная для считывания ввода пользователя
int ch;    // переменная для хранения приведённого значения переменной act
bool key=1;
 
 
 
while (key)
{
 
 act = _getch();// считываю
 ch = static_cast<int>(act);//привожу к соответствующему коду
 
 switch (ch)
      {
          case -32: // код блока стрелок. просто пропускаем итерацию, а на следующей – обрабатываем уже код самой стрелки.
          break;
          case 27: // Esc - для выхода из цикла
              key=0;
          break;
          case 75:  // влево
                 //...
          break;
          case 77: // вправо
                 //...
          break;
          case 80: // вниз
                  //...
          break;
          case 72: // вверх
                 //...
          break;
      }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 10:48     Проверка на нажатие стрелок на клавиатуре
Еще ссылки по теме:
C++ Определить наименьшее время до совпадения стрелок
C++ Управление курсором мыши с помощью стрелок клавиатуры
C++ Вывод движущегося изображения с управлением при помощи стрелок
Написать программу - анимацию для движения стрелок часов C++
Соло на клавиатуре C++

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

Или воспользуйтесь поиском по форуму:
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
19.05.2014, 10:48     Проверка на нажатие стрелок на клавиатуре #7
я забыл сказать: -32 означает, что была нажата какая-то стрелочка, а 72,75,77,80 это уже код стрелочки, можно сделать так:

C++
1
2
3
4
5
6
7
8
9
if(a=-32)//если была нажата какая-то стрелочка
switch(a) // через switch делаем действия в зависимости от того, какая это стрелочка
{
case 72:
case 75:
case 77:
case 80:
default:
}
Добавлено через 7 минут
Цитата Сообщение от Michall Посмотреть сообщение
Не понятно, что ты хочешь. Стрелочка генерирует сразу два символа: "-32" и еще один.
зачем всё усложнять, создавать отдельную int, хочу сказать, вот есть переменная ch - char в ней хранится какой-либо символ, он в ней хранится в коде, в битах, в 1 байте, то есть имеет 255 разных значений, и этот код может быть от -128 до 127.
захотим ch присвоить символ А: пишем ch = 'A', захотим ему присвоить символ 1 пишем ch = '1', но, если напишем ch = 1, то ch присвоится код 1, который вовсе не обозначает символ 1, если попытаешься его вывести, поэтому, символ будет сравниваться по коду, если то, с чем он сравнивается, не знаключено в ' '
вот код c++, проанализируй его, сравнение в while идёт с кодом 27, а не с символом '27', которого не существует
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    char a;
    while((a = getch())!=27) // выходит, если клавиша, которую ввёл равна 27(27 - Esc)
    {
        cout << (int)a << endl; /* выводится код самой клавиши с преобразованием в число, иначе бы вывелись символы H M и что-то ещё, 1ое число будет -37, это означает что какая-то стрелка, а потом даётся код этой стрелки */
    }
}
Добавлено через 58 секунд
напиши мне в лс позже, обьясню всё
Yandex
Объявления
19.05.2014, 10:48     Проверка на нажатие стрелок на клавиатуре
Ответ Создать тему
Опции темы

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