Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/103: Рейтинг темы: голосов - 103, средняя оценка - 4.57
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

Не работает getch()

27.09.2012, 14:21. Показов 21058. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
не работает задержка по getchar()
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cstdio>
#include <unistd.h>
 
using namespace std;
 
void play_game(int magic_number, int ranMax);
int get_magic_number(int ranMax);
int set_complexity();
 
int main()
{
    unsigned short int option;
    unsigned int ranMax = set_complexity();
    unsigned int magic_number = get_magic_number(ranMax);
 
    do {
        //system("clear");
        do {
            cout << "Выберите пункт меню (1 - 4)\n\n";
            cout << "1 - Генерировать число\n";
            cout << "2 - Начать игру\n";
            cout << "3 - Выбрать сложность\n";
            cout << "4 - Выход\n\n";
            cout << "--> ";
            cin >> option;
        } while((option < 1) && (option > 4));
 
        switch(option) {
            case 1:
                magic_number = get_magic_number(ranMax);
                break;
            case 2:
                play_game(magic_number, ranMax);
                break;
            case 3:
                ranMax  = set_complexity();
                magic_number = get_magic_number(ranMax);
        }
    } while(option != 4);
 
    return 0;
}
 
int get_magic_number(int ranMax) //генерация числа
{
    unsigned int magic_number;
    srand(time(NULL));
    magic_number = 1 + rand() % ranMax;
    cout << "Новое число успешно генерировано!\n";
    sleep(1);
    return magic_number;
}
 
void play_game(int magic_number, int ranMax)  //игра
{
    int guess;
    unsigned int count;
 
    system("clear");   //   выставить clear для linux и clr для windows
    cout << "Компьютер загадал число от 1 до " << ranMax << ".\n";
    cout << "Угадайте его за минимальное количество попыток\n\n";
    do {
        cout << "Ваше число --> ";
        cin >> guess;
        count++;
 
        if (guess > ranMax) {
            cout << "Идиот! Нужно вводить числа от 1 до " << ranMax << "!\n\n";
            continue;
        }
 
        if (guess < magic_number)
            cout << "Загаданное число больше\n\n";
        else if (guess > magic_number)
            cout << "Загаданное число меньше\n\n";
    } while (guess != magic_number);
    cout << "Правильно! Загаданное число действительно равно " << magic_number << "!\n";
    cout << "Вы угадали число за " << count << " попыток.";
    cout << "Нажмите любую клавишу для продолжения...\n";
    char c = getchar();
}
 
int set_complexity()    //выбор сложность
{
    unsigned short int option;
    unsigned int ranMax;
 
    do {
        cout << "Выберите сложность\n\n";
        cout << "1 - Новичек (число не превышает 100)\n";
        cout << "2 - Задрот (число до 1000)\n";
        cout << "3 - Только хардкор!!! (over 1000)\n\n";
        cout << "--> ";
        cin >> option;
    } while((option < 1) && (option > 3));
 
    switch(option) {
        case 1:
            ranMax = 100;
            break;
        case 2:
            ranMax = 1000;
            break;
        case 3:
            ranMax = 10000;
    }
    cout << "Сложность установлена!\n";
    sleep(1);
    return ranMax;
}
84 строка
собственно задержки не происходит.
а вот так все происходит
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
   cout << "Нажмите кнопку для завершения программы";
   char c = getchar();
   return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2012, 14:21
Ответы с готовыми решениями:

Аналог getch или русские буквы в getch
Здравствуйте, уважаемые господа. Существуют ли какие-нибудь аналоги getch () и _getch, которые...

Не работает getch()
Здравствуйте, решил написать первую серьезную программу ,в данном случае змейку, не получается...

не работает ни _getch(), ни getch()
собственно проблема: из консоли невозможно считать клавиши: Esc, Insert, Delete ....... и самое...

Ожидание клавиши Enter - getch не работает
Друзья привет! Спасибо всем, кто откликнется! Мелкий вопрос, но честно, уже голова кругом идет!...

17
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
27.09.2012, 14:23 2
Заменить это:
C++
1
2
 cout << "Нажмите кнопку для завершения программы";
   char c = getchar();
На это:
C++
1
system("pause");
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
27.09.2012, 14:24 3
В потоке ввода есть символы, вероятно, там перенос.
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
27.09.2012, 17:26  [ТС] 4
C++
1
system("pause");
забыл сказать что пишу под linux, тут такое не прокатит

Цитата Сообщение от NoMasters Посмотреть сообщение
В потоке ввода есть символы, вероятно, там перенос.
можно поподробнее?

Добавлено через 2 часа 57 минут
гуглил на счет потока и напоролся на fflush.
попробовал сделать
C++
1
2
3
......
fflush(stdin); fflush(stdout);
char c = getchar();
результат нулевой, жду других идей
или мб есть другие способы приоотановки программы до нажатия клавиши, которые работают в linux?
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
27.09.2012, 17:39 5
поставь std::cin.clear(); std::cin.get().get();
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 17:45 6
C++
1
2
cin.clear(); // на случай ошибки ввода.
while (cin.get() != '\n'); // удаление символов, оставшихся в потоке.
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
27.09.2012, 17:51  [ТС] 7
не помогло. причем все вышеперечисленные способы исправно работают вне данной программы, т.е. создаю "hello world" и добавляю туда char c = getchar() или std::cin.clear(); std::cin.get() и все приостанавливается как положено, но вот в моей программе почему то нет

Добавлено через 4 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
cin.clear(); // на случай ошибки ввода.
while (cin.get() != '\n'); // удаление символов, оставшихся в потоке.
это к сожалению тоже не помогло
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 18:03 8
И в 61 строке инициализируйте count нулём.

Добавлено через 39 секунд
Цитата Сообщение от [WRG
;3494380]это к сожалению тоже не помогло
Быть не может. Код покажите, как делаете.

Добавлено через 1 минуту
Остановки нет, а что происходит?

Добавлено через 1 минуту
Проблема может не в остановке.

Добавлено через 6 минут
В линукс только cin.sync() не работает, остальное должно работать. Может проблема в неинициализированном count? У меня ошибка времени выполнения выскакивала.
1
Чайник
70 / 70 / 9
Регистрация: 15.02.2012
Сообщений: 475
27.09.2012, 18:07 9
На скоко мне помнится, для getch(); нужено подключить conio.h
2
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 18:25 10
Если сделать в 61:
C++
1
unsigned int count = 0;
остановка и в вашем коде нормально работает.
Цитата Сообщение от cactus09 Посмотреть сообщение
На скоко мне помнится, для getch(); нужено подключить conio.h
Тогда бы компилятор ругался. И здесь не getch(), а getchar().
2
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
27.09.2012, 18:45  [ТС] 11
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cstdio>
#include <unistd.h>
 
using namespace std;
 
void play_game(int magic_number, int ranMax);
int get_magic_number(int ranMax);
int set_complexity();
 
int main()
{
    unsigned short int option;
    unsigned int ranMax = set_complexity();
    unsigned int magic_number = get_magic_number(ranMax);
 
    do {
        //system("clear");
        do {
            cout << "Выберите пункт меню (1 - 4)\n\n";
            cout << "1 - Генерировать число\n";
            cout << "2 - Начать игру\n";
            cout << "3 - Выбрать сложность\n";
            cout << "4 - Выход\n\n";
            cout << "--> ";
            cin >> option;
        } while((option < 1) && (option > 4));
 
        switch(option) {
            case 1:
                magic_number = get_magic_number(ranMax);
                break;
            case 2:
                play_game(magic_number, ranMax);
                break;
            case 3:
                ranMax  = set_complexity();
                magic_number = get_magic_number(ranMax);
        }
    } while(option != 4);
 
    return 0;
}
 
int get_magic_number(int ranMax) //генерация числа
{
    unsigned int magic_number;
    srand(time(NULL));
    magic_number = 1 + rand() % ranMax;
    cout << "Новое число успешно генерировано!\n";
    sleep(1);
    return magic_number;
}
 
void play_game(int magic_number, int ranMax)  //игра
{
    int guess;
    unsigned int count = 0;
 
    system("clear");   //   выставить clear для linux и clr для windows
    cout << "Компьютер загадал число от 1 до " << ranMax << ".\n";
    cout << "Угадайте его за минимальное количество попыток\n\n";
    do {
        cout << "Ваше число --> ";
        cin >> guess;
        count = count + 1;
 
        if (guess > ranMax) {
            cout << "Идиот! Нужно вводить числа от 1 до " << ranMax << "!\n\n";
            continue;
        }
 
        if (guess < magic_number)
            cout << "Загаданное число больше\n\n";
        else if (guess > magic_number)
            cout << "Загаданное число меньше\n\n";
    } while (guess != magic_number);
    cout << "Правильно! Загаданное число действительно равно " << magic_number << "!\n";
    cout << "Вы угадали число за " << count << " попыток.";
    cout << "Нажмите любую клавишу для продолжения...";
    //flush(); //flush();
    getchar();
 
    //cin.clear(); cin.get();
 
//    cin.clear(); // на случай ошибки ввода.
//    while (cin.get() != '\n');  // удаление символов, оставшихся в потоке
}
 
int set_complexity()    //выбор сложность
{
    unsigned short int option;
    unsigned int ranMax;
 
    do {
        cout << "Выберите сложность\n\n";
        cout << "1 - Новичек (число не превышает 100)\n";
        cout << "2 - Задрот (число до 1000)\n";
        cout << "3 - Только хардкор!!! (over 1000)\n\n";
        cout << "--> ";
        cin >> option;
    } while((option < 1) && (option > 3));
 
    switch(option) {
        case 1:
            ranMax = 100;
            break;
        case 2:
            ranMax = 1000;
            break;
        case 3:
            ranMax = 10000;
    }
    cout << "Сложность установлена!\n";
    sleep(1);
 
    return ranMax;
}
вот, по прежнему не фурычит
делаю все в codeblocks, пробовал также из консольки компилить, эффекта ноль

Добавлено через 2 минуты
остановки нет, программа работает так, словно и нету там getch()
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 19:53 12
Конструкцию для очистки потока нужно перед getchar() ставить, а не после. Вот этот код нормально работает (sleep() убрано и #include <unistd.h>):
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cstdio>
//#include <unistd.h>
 
using namespace std;
 
void play_game(int magic_number, int ranMax);
int get_magic_number(int ranMax);
int set_complexity();
 
int main()
{
    setlocale(0, "");
    
    unsigned short int option;
    unsigned int ranMax = set_complexity();
    unsigned int magic_number = get_magic_number(ranMax);
 
    do {
        //system("clear");
        do {
            cout << "Выберите пункт меню (1 - 4)\n\n";
            cout << "1 - Генерировать число\n";
            cout << "2 - Начать игру\n";
            cout << "3 - Выбрать сложность\n";
            cout << "4 - Выход\n\n";
            cout << "--> ";
            cin >> option;
        } while((option < 1) && (option > 4));
 
        switch(option) {
            case 1:
                magic_number = get_magic_number(ranMax);
                break;
            case 2:
                play_game(magic_number, ranMax);
                break;
            case 3:
                ranMax  = set_complexity();
                magic_number = get_magic_number(ranMax);
        }
    } while(option != 4);
 
    return 0;
}
 
int get_magic_number(int ranMax) //генерация числа
{
    unsigned int magic_number;
    srand(time(NULL));
    magic_number = 1 + rand() % ranMax;
    cout << "Новое число успешно генерировано!\n";
   // sleep(1);
    return magic_number;
}
 
void play_game(int magic_number, int ranMax)  //игра
{
    int guess;
    unsigned int count = 0;
 
    //system("clear");   //   выставить clear для linux и clr для windows
    cout << "Компьютер загадал число от 1 до " << ranMax << ".\n";
    cout << "Угадайте его за минимальное количество попыток\n\n";
    do {
        cout << "Ваше число --> ";
        cin >> guess;
        count = count + 1;
 
        if (guess > ranMax) {
            cout << "Идиот! Нужно вводить числа от 1 до " << ranMax << "!\n\n";
            continue;
        }
 
        if (guess < magic_number)
            cout << "Загаданное число больше\n\n";
        else if (guess > magic_number)
            cout << "Загаданное число меньше\n\n";
    } while (guess != magic_number);
    cout << "Правильно! Загаданное число действительно равно " << magic_number << "!\n";
    cout << "Вы угадали число за " << count << " попыток.";
    cout << "Нажмите любую клавишу для продолжения...";
    
    cin.clear(); // на случай ошибки ввода.
    while (cin.get() != '\n');  // удаление символов, оставшихся в потоке
    
    getchar();
 
}
 
int set_complexity()    //выбор сложность
{
    unsigned short int option;
    unsigned int ranMax;
 
    do {
        cout << "Выберите сложность\n\n";
        cout << "1 - Новичек (число не превышает 100)\n";
        cout << "2 - Задрот (число до 1000)\n";
        cout << "3 - Только хардкор!!! (over 1000)\n\n";
        cout << "--> ";
        cin >> option;
    } while((option < 1) && (option > 3));
 
    switch(option) {
        case 1:
            ranMax = 100;
            break;
        case 2:
            ranMax = 1000;
            break;
        case 3:
            ranMax = 10000;
    }
    cout << "Сложность установлена!\n";
    //sleep(1);
 
    return ranMax;
}
Миниатюры
Не работает getch()  
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
27.09.2012, 20:11  [ТС] 13
благодарствую, затупил, ошибку не заметил
можете объяснить как это работает?
C++
1
2
    cin.clear();
    while (cin.get() != '\n');
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 20:21 14
C++
1
2
3
4
cin.clear(); // сброс флага ошибки потока ввода.
while (cin.get() != '\n'); // cin.get() будет извлекать символы из потока
                           // пока не извлечёт '\n'(вставляется в поток при нажатии Enter, 
                           // остался в потоке от предшествующего cin >> guess;)
После этого поток ввода будет чист.
В данном случае должен сработать и просто:
C++
1
2
cin.get();
getchar();
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
27.09.2012, 20:28  [ТС] 15
еще раз благодарю, теперь понятно
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 20:35 16
Проскакивание ожидания ввода (паузы) происходит из-за того, что в потоке ввода, после предшествующего ввода, остаются символы. Чаще всего, остаётся символ новой строки '\n', который попадает в поток при нажатии Enter. cin >> его просто игнорирует, а такие функции, как getchar(), cin.get() и пр. считывют его, как первый символ в потоке и код идёт дальше. Ожидания ввода символа не происходит. Поэтому, перед применением этих функций поток нужно очищать.
0
4 / 4 / 1
Регистрация: 25.09.2012
Сообщений: 70
27.09.2012, 20:49 17
компилятор ругается на
C++
1
sleep(1);
что это может быть.
Работаю в dev c++
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2012, 20:56 18
Скорее всего, это не для Windows.
0
27.09.2012, 20:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2012, 20:56
Помогаю со студенческими работами здесь

Как работает функция getch() и какая библиотека нужна?
Ребят подскажите пожалуйста в C++ как работает функция getch() и какая библиотека нужна ?

Программа не работает когда пишу "getch()", исправьте ошибки
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; using namespace std; int...

getch
Недавно начал изучать си++. Что-то написал, не знаю по какой причине не компилирует. Прошу помочь....

getch()
с помощью функции getch() узнал код клавиш... int n; n = getch(); cout &lt;&lt; n;


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru