Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
1

Переназначить событие клавиши ENTER в консоли

20.09.2013, 13:15. Просмотров 2206. Ответов 18
Метки нет (Все метки)


Добрый день.
У меня есть массив, мне его нужно заполнить числами с клавиатуры. Но этот массив должен заполняться в строчку, а не в столбец.

т.е., когда мы вводим число и нажимаем ENTER, то выходит так:

1
2
3
4
5
...
а нужно, чтобы заполнение шло так:

1 2 3 4 5 ...
при этом, числа отделяются пробелом.


Как сделать такой ввод?

Есть вариант "проще", это использовать строку string или char, потом запустить кучу циклов для считывания и забивания в ДИНАМИЧЕСКИЙ массив.
Есть вариант: изменить событие клавиши на время, т.е., при нажатии ENTER'а мы будем делать пробел. а не вниз -- но такой вариант мне кажется запредельным.
Есть вариант: изменить событие того же энтера, т.е., ввод происходит, а переход на след. строчку нет. Пробел осуществить через cout.

Всё, на этом мои идеи закончились. Что и как сделать? Мне достаточно любого простейшего примера.

Шаблон:


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
#include "stdafx.h"
#include "L1.h"
#include <time.h> 
#include <iostream>
#include <Windows.h>
#include <map>
#include <string>
 
using namespace std;
//пробел VK_SPACE
//Enter VK_RETURN
int main()
{
    int t,i;
    setlocale(0,"");
        cin >> t;
    int *mas = new int[t];
        
        for (i=0; i<t; i++)
{
//заполнение массива в строчку
 
}
 
    cin.get();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2013, 13:15
Ответы с готовыми решениями:

Событие при нажатии клавиши Enter
Как создать событие которое активируется при нажатии клавиши Enter? Или любой другой?

Как переназначить клавиши на клавиатуре?
Кнопка р(h) плохо нажимается. Хочу, чтобы вместо неё пользоваться Caplock. Установил пока что Linux...

Как переназначить клавиши на клавиатуре?
У меня на ноутбуке повысить и снизить громкость F7 и F8, почему то в место F8 работает F9 как...

Переназначить клавиши на клавиатуре. Возможно?
Есть ли какая то возможность с помощью скрипта на VBScript переназначить клавиши на клавиатуре?...

18
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
20.09.2013, 13:23 2
C++
1
2
3
4
int *mas = new int[t];
 
for (i=0; i<t; i++)
    cin >> mas[i];  // можно вводить числа через пробел, можно после каждого числа нажимать Enter. результат будет одинаковым
1
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:25 3
вам нужно вывести массив в строку разделённую пробелами?
C++
1
2
3
4
5
6
7
8
9
10
11
// заполняем
int n;
for(int i=0; i<t; i++) {
   cin>>n;
   mas[i] = n;
}
// выводим
for(int i=0; i<t; i++) {
   cout << mas[i];
   if(i<t-1) cout << " "; // не выводим пробел после последнего символа
}
0
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 13:33  [ТС] 4
хм, хорошо, а если вдруг нажмут энтр -- как изменить событие клавиши?

*дааааа, проверила, всё работает, кошмар как всё просто)))

Добавлено через 3 минуты
Цитата Сообщение от Cynacyn Посмотреть сообщение
вам нужно вывести массив в строку разделённую пробелами?
нет-нет, вывод я и так знаю.

тут такое дело:

заполняем массив целыми числами через пробел
и, как я посмотрела, если делать:

C++
1
2
for (i=0; i<t; i++)
    cin >> mas[i];
и нажимать "пробел", то мы сначала введём числа при i=0, а потом нажмём enter и остальные i досчитает, заполняя массив.

А вдруг нажимать будут enter?
Как тогда изменить "событие" даже простым:

если нажали энтр, то использовали пробел
но делать это так:


C++
1
2
3
4
5
for (i=0; i<t; i++)
{
    cin >> mas[i]; 
если нажали энтр, то использовать пробел
}
0
35 / 35 / 7
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:42 5
Цитата Сообщение от Nullik Посмотреть сообщение
хм, хорошо, а если вдруг нажмут энтр -- как изменить событие клавиши?

*дааааа, проверила, всё работает, кошмар как всё просто)))

Добавлено через 3 минуты


нет-нет, вывод я и так знаю.

тут такое дело:



и, как я посмотрела, если делать:

C++
1
2
for (i=0; i<t; i++)
    cin >> mas[i];
и нажимать "пробел", то мы сначала введём числа при i=0, а потом нажмём enter и остальные i досчитает, заполняя массив.

А вдруг нажимать будут enter?
Как тогда изменить "событие" даже простым:



но делать это так:


C++
1
2
3
4
5
for (i=0; i<t; i++)
{
    cin >> mas[i]; 
если нажали энтр, то использовать пробел
}

Попробуйте создать новую тему, с заглавием типа: "Переназначить значение клавиши в программе", я погуглил, но ничего не нашел.
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
20.09.2013, 13:48 6
Цитата Сообщение от Nullik Посмотреть сообщение
C++
1
2
3
4
5
for (i=0; i<t; i++) 
{ 
   cin >> mas[i]; 
   если нажали энтр, то использовать пробел 
}
я понял что надо сделать, но не знаю как
после cin >> mas[i] и нажатия энтр, курсор сразу же перемещается на начало новой строки
0
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 15:50  [ТС] 7
https://www.cyberforum.ru/cpp-... 58497.html -- "задание".

Добрый день.

Ещё раз напомню:
нужно заполнить массив целыми числами через пробел.

Был вариант "сделать строчку а потом её обрабатывать", но это путь ленивых программистов

поэтому, остановилась на такой мысли:

если делать:
C++
1
2
for (i=0; i<t; i++)
    cin >> mas[i];
и нажимать "пробел", то мы сначала введём числа при i=0, а потом нажмём enter и остальные i досчитает, заполняя массив.

А вдруг нажимать будут enter?
Как тогда изменить "событие" даже простым:
C++
1
2
3
4
5
for (i=0; i<t; i++)
{
    cin >> mas[i]; 
если нажали энтр, то использовать пробел
}
У клавиши ENTER есть такая проблема, что это ВВОД инфы, но так же и перевод на др строчку. А сделать бы так, чтобы был не ввод, а хотя бы пробел НА ВРЕМЯ РАБОТЫ ЦИКЛА, а если и не заменять полностью на пробел, то как заменить функцию "перевода на др. строчку" на "отступ\пробел" или вообще отключить перевод на др. строчку?


Шаблон программы:

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
#include "stdafx.h"
#include "L1.h"
#include <time.h> 
#include <iostream>
#include <Windows.h>
#include <map>
#include <string>
 
using namespace std;
//пробел VK_SPACE
//Enter VK_RETURN
int main()
{
    int t,i;
    setlocale(0,"");
        cin >> t;
    int *mas = new int[t];
        
        for (i=0; i<t; i++)
{
//заполнение массива в строчку
 
}
 
    cin.get();
    return 0;
}
Добавлено через 39 минут
upp
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2013, 16:10 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
#include <conio.h>
...
    char str[15];
    int i = 0;
    while (true)
    {
        str[i] = getch();
        if (str[i] == 10 || str[i] == 13) str[i] = ' ';
        if (str[i] == 27) break; // выход из ввода при нажатии Escape
        cout << str[i];
        ++i;
    }
    str[i] = '\0';
    cout << endl << str << endl;
1
214 / 213 / 114
Регистрация: 14.01.2013
Сообщений: 459
20.09.2013, 16:15 9
Вот как вариант. Выглядеть будет так как вы хотите
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
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
int main()
{
    string s;
    int const n=5;
    int mas[n],i,j;
    char ch;
    s="Введите числа:\n";
    setlocale(LC_ALL,"Russian");
    cout<<s;
    for(i=0;i<n;i++)
    {
        cin>>mas[i];
        ch = cin.get();
        if(ch=='\n') 
        {
            system("cls");
            cout<<s;
            for(j=0;j<=i;j++)
            {
                cout<<mas[j]<<" ";
            }
        }
    }
    cout<<"\nМассив: ";
    for(i=0;i<n;i++)
    {
        cout<<mas[i]<<" ";
    }
    system("PAUSE > void");
    return 0;
}
1
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 19:28  [ТС] 10
alsav22, у меня динамический массив, получается, тогда здесь в переменную char-массив делать тоже динамическим.
*так, надо поразмыслить над кодом.

Добавлено через 2 минуты
es_, ничего себе, какой у вас там замут
*если энтр, то удаляем, перезаписываем, а это не слишком будет грузить прогу, когда, например, будет 1 000 000 элементов для работы с массивом?

А вообще, классная идея))

Добавлено через 3 часа 7 минут
ещё варинт: а можно как-то на время ввода массива отключить ENTER ?
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2013, 20:00 11
Цитата Сообщение от Nullik Посмотреть сообщение
ещё варинт:
Чем не устраивают предложенные?
0
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 20:39  [ТС] 12
alsav22, у вас в вариант неплохо, но вводим строку, строка динамическая получается или как -- потому что у меня нет изначального размера и лишнего не надо. (преподы вредные, а что делать?)

В другом варианте много переудалять и записывать -- массив на 1 000 000 элементов что будет делать? -- это не слишком рационально, я считаю. Хотя, разве там так много делается операций и не так быстро... Не забываем про вредных преподов.

Я ещё раз подумала над отключением клавиши или изменения свойств, но пришла к выводу, что там есть некоторые проблемы в плане "если выйдет за границу". Потом я сделала вектор, который нужный и вредный, но и он не совсем то.

В итоге получила: быть мне ленивым программистом и перебрать строчку и забить её в вектор.

*ну или есть ещё варианты, но либо я не вижу и не понимаю их, либо мне не подскажут, либо мистический третий вариант.
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 14:19 13
Цитата Сообщение от Nullik Посмотреть сообщение
но вводим строку, строка динамическая получается или как -- потому что у меня нет изначального размера и лишнего не надо.
В чём проблема, не пойму? В какой тип вводите? В string? В динамический массив?

Добавлено через 6 минут
Вот для string:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    string str;
    
    while (true)
    {
        str.push_back(getch());
        int i = str.size();
        if (str[i - 1] == 10 || str[i - 1] == 13) str[i - 1] = ' ';
        if (str[i - 1] == 27) break; // выход из ввода при нажатии Escape
        cout << str[i - 1];
        
    }
    str.erase(str.size() - 1);
    cout << endl << str << endl;
Добавлено через 17 часов 16 минут

Не по теме:

Безответные посты наводят на размышления...

0
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
21.09.2013, 16:30  [ТС] 14
alsav22, а на что отвечать?

Сегодня выяснила ещё один замечательный факт -- теперь преподу нужна целая командная строчка))) командную строчку мы пишем.

чтобы было так:

>> iterations 10000
у меня правда такой вопрос: вот если использовать "ключевое слово", а потом постаивть пробел и вот... там или надо getline и проверять всю строчку или ещё какой ужос надо выдумывать, но тут надо ещё подумать.

А о чём мне вам ответить? Препод очень удивляется, что мы используем строковые переменные. "Мол, можно ведь ещё как-то то" -- читаем его мысли. То ли он от нас WinAPI хочет, то ли ещё какие знания, но мне не совсем понятно.

теперь я ищу "как делали командную строку", чтобы понять что от меня хотят.

А что мне вам ещё ответит? Да, у вас хороший код, но и это не совсем то, что мне надо. Теперь не совсем то. Или то. Надо сидеть и думать.
0
alsav22
21.09.2013, 17:04
  #15

Не по теме:

Цитата Сообщение от Nullik Посмотреть сообщение
alsav22, а на что отвечать?
Хотя бы на это:
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём проблема, не пойму? В какой тип вводите? В string? В динамический массив?
Цитата Сообщение от Nullik Посмотреть сообщение
Надо сидеть и думать.
Кроме этого, хорошо бы и на вопросы отвечать, если хотите, чтобы с вами вообще имели дело.

0
Nullik
21.09.2013, 20:10  [ТС]
  #16

Не по теме:

В чём проблема, не пойму? В какой тип вводите? В string? В динамический массив?
Надо сидеть и думать.
я отвечаю на вопросы. Если я в одной из тем вам не ответила - не смертельно. К совести не призывайте, ни к чему.

0
alsav22
21.09.2013, 20:22
  #17

Не по теме:

Цитата Сообщение от Nullik Посмотреть сообщение
К совести не призывайте, ни к чему.
Уже понял.

0
3 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 8
25.09.2013, 14:15 18
1
2
3
4
5
6
7
8
9
10
11
12
13



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    string str;
    
    while (true)
    {
        str.push_back(getch());
        int i = str.size();
        if (str[i - 1] == 10 || str[i - 1] == 13) str[i - 1] = ' ';
        if (str[i - 1] == 27) break; // выход из ввода при нажатии Escape
        cout << str[i - 1];
        
    }
    str.erase(str.size() - 1);
    cout << endl << str << endl;
0
44 / 13 / 4
Регистрация: 13.03.2013
Сообщений: 302
25.09.2013, 18:01  [ТС] 19
анюта123, и?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2013, 18:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как переназначить горячие клавиши в Xubuntu?
Всем привет! Сижу я вот сейчас на Xubuntu 14.04, и пытаюсь разобраться с переназначением команды,...

Как переназначить координаты в консоли (Console.SetCursorPosition(x, y))
Здравствуйте! У меня тестовая мини игра. Не получается смайлик сбросить координаты с начальной...

Как при динамическом создании кнопки переназначить OnClick событие
Нужно при создании кнопки переназначить событие OnClick newbutton.OnClick:=MyOnClick Так, чтобы в...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор...


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

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

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