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

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

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

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

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

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

C++
1
2
3
4
5
void func()
{
    char login[10] = {NULL};
    login[i] = _getch();
}
нужно сдалать проверку на ввод стрелочки(любой, в право влево), еслии она была нажата то выйти из функции, сама стрелочка записывается как буква ,,а,, поэтому хз что предпринять, подскажите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 10:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на нажатие стрелок на клавиатуре (C++):

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

Проверка, ввел ли пользователь что-нибудь на клавиатуре? - C++
Надо узнавать каждую 1/10 сек, ввел ли пользователь что-нибудь на клаве. В VC++ 6. Не имею представления, как это сделать в консольном...

Нажатие определенной клавиши на клавиатуре = Запуск определенной функции - C++
Здравствуйте. У меня такой вопрос: как при нажатии, к примеру, клавиши "1" на клавиатуре запустить нужную мне функцию (Окно с меню...

Проверка на нажатие клавиш - C++
Пишу в MS Visual C++ программу. Суть такова, что у меня есть функция_1, которая выполняется при нажатии клавиши(Enter, например) Далее...

Не обрабатывается нажатие кнопок (стрелок) на клавиатуре - C#
Нашел в интернете код для обработки нажатия стрелок на клавиатуре, но он работает только если на форме нету кнопок и текстбоксов. Иначе при...

TButton - нажатие кнопок на форме при нажатии стрелок на клавиатуре - C++ Builder
Подскажите пожалуйста, мне нужно что-бы при нажатии стрелок на клавиатуре нажимались кнопки на форме. Ставлю Keypriview = true на форме...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
18.05.2014, 11:07 #2
Стрелки клавиатуры в консоли
0
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() у тебя проблем не будет
0
mh-coder
-4 / 26 / 3
Регистрация: 01.02.2014
Сообщений: 813
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) так не работает, он записывает в массив букву ,,а,, и на сравнние с числом не реагирует
0
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();
}
0
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 54
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;
      }
}
0
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 секунд
напиши мне в лс позже, обьясню всё
0
19.05.2014, 10:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 10:48
Привет! Вот еще темы с ответами:

Движение Image при нажатии стрелок на клавиатуре - Delphi
Здравствуйте. Помогите пожалуйста. У меня есть Image1 я хочу что бы при нажатии стрелок на клавиатуре он двигался. Если стрелка нажата...

Переключение страниц при нажатии стрелок на клавиатуре - jQuery
Есть такой HTML код: &lt;div class='next1'&gt; &lt;?php previous_post_link('%link', '&lt;img src=&quot;#&quot; width=&quot;45&quot; height=&quot;35&quot; alt=&quot;previous&quot; /&gt;');...

Звездочка перемещается по экрану при нажатии стрелок на клавиатуре - Assembler
Помогите пожалуйста решить такую задачу. С ассемблером чет туго.. В центре экрана печатается звездочка. С помощью клавиш-стрелок можно...

Перемещение картинки по форме при нажатии на клавиши стрелок на клавиатуре - Delphi
Хочу, чтобы при нажатии на клавиши стрелок на клавиатуре картинка двигалась. Какое событие позволит это сделать? Пробовал OnKeyPress,...


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

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

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