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

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

Восстановить пароль Регистрация
 
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
20.09.2013, 13:15     Переназначить событие клавиши ENTER в консоли #1
Добрый день.
У меня есть массив, мне его нужно заполнить числами с клавиатуры. Но этот массив должен заполняться в строчку, а не в столбец.

т.е., когда мы вводим число и нажимаем 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 13:23     Переназначить событие клавиши ENTER в консоли #2
C++
1
2
3
4
int *mas = new int[t];
 
for (i=0; i<t; i++)
    cin >> mas[i];  // можно вводить числа через пробел, можно после каждого числа нажимать Enter. результат будет одинаковым
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:25     Переназначить событие клавиши ENTER в консоли #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 << " "; // не выводим пробел после последнего символа
}
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
20.09.2013, 13:33  [ТС]     Переназначить событие клавиши ENTER в консоли #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]; 
если нажали энтр, то использовать пробел
}
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 13:42     Переназначить событие клавиши ENTER в консоли #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]; 
если нажали энтр, то использовать пробел
}

Попробуйте создать новую тему, с заглавием типа: "Переназначить значение клавиши в программе", я погуглил, но ничего не нашел.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 13:48     Переназначить событие клавиши ENTER в консоли #6
Цитата Сообщение от Nullik Посмотреть сообщение
C++
1
2
3
4
5
for (i=0; i<t; i++) 
{ 
   cin >> mas[i]; 
   если нажали энтр, то использовать пробел 
}
я понял что надо сделать, но не знаю как
после cin >> mas[i] и нажатия энтр, курсор сразу же перемещается на начало новой строки
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
20.09.2013, 15:50  [ТС]     Переназначить событие клавиши ENTER в консоли #7
http://www.cyberforum.ru/cpp-beginne...ead958497.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
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2013, 16:10     Переназначить событие клавиши ENTER в консоли #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;
es_
 Аватар для es_
198 / 198 / 46
Регистрация: 14.01.2013
Сообщений: 446
20.09.2013, 16:15     Переназначить событие клавиши ENTER в консоли #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;
}
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
20.09.2013, 19:28  [ТС]     Переназначить событие клавиши ENTER в консоли #10
alsav22, у меня динамический массив, получается, тогда здесь в переменную char-массив делать тоже динамическим.
*так, надо поразмыслить над кодом.

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

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

Добавлено через 3 часа 7 минут
ещё варинт: а можно как-то на время ввода массива отключить ENTER ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2013, 20:00     Переназначить событие клавиши ENTER в консоли #11
Цитата Сообщение от Nullik Посмотреть сообщение
ещё варинт:
Чем не устраивают предложенные?
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
20.09.2013, 20:39  [ТС]     Переназначить событие клавиши ENTER в консоли #12
alsav22, у вас в вариант неплохо, но вводим строку, строка динамическая получается или как -- потому что у меня нет изначального размера и лишнего не надо. (преподы вредные, а что делать?)

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

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

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

*ну или есть ещё варианты, но либо я не вижу и не понимаю их, либо мне не подскажут, либо мистический третий вариант.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 14:19     Переназначить событие клавиши ENTER в консоли #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 минут

Не по теме:

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

Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
21.09.2013, 16:30  [ТС]     Переназначить событие клавиши ENTER в консоли #14
alsav22, а на что отвечать?

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

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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

alsav22
21.09.2013, 20:22
  #17

Не по теме:

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

анюта123
3 / 0 / 1
Регистрация: 16.09.2013
Сообщений: 8
25.09.2013, 14:15     Переназначить событие клавиши ENTER в консоли #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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2013, 18:01     Переназначить событие клавиши ENTER в консоли
Еще ссылки по теме:

C++ Нажатие клавиши без ожидания Enter
Убрать ожидание нажатия клавиши Enter при выводе C++

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

Или воспользуйтесь поиском по форуму:
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
25.09.2013, 18:01  [ТС]     Переназначить событие клавиши ENTER в консоли #19
анюта123, и?
Yandex
Объявления
25.09.2013, 18:01     Переназначить событие клавиши ENTER в консоли
Ответ Создать тему
Опции темы

Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru