С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/56: Рейтинг темы: голосов - 56, средняя оценка - 4.52
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173

Ввод цифры без нажатия Enter'a, использование _getch()

27.01.2011, 18:36. Показов 12116. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток.
проблема вот в чем: написал простенькую программу, она высчитывает дискриминант и корни уравнения. попробовал сделать так, чтобы по завершении вычислений можно было либо выйти, либо повторить расчеты. всё работает, только вот нужно нажимать 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
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
 
using namespace std;
 
float discr(float a, float b, float c);   \\тут объявления функций для вычисления корней
float x_one (float d,float a,float b,float c);\\ и дискриминанта
float x_two (float d, float a, float b, float c);
float square (float x);
 
int main ()
{
    loop1:
    setlocale (LC_ALL,"rus");
    float va, vb, vc; int q=0; float one=0;float two=0;
    printf("Введите a, b и c \n");
    cin >> va >>vb>>vc;
    float vd=0;
    vd=discr(va,vb,vc);
    one=x_one(vd,va,vb,vc);
    two=x_two(vd,va,vb,vc);
    printf("\nДескрименант = ");
    cout << vd;
    if (vd>=0)
    {
    printf("\nx1 = ");
    cout << one;
    printf("\nx2 = ");
    cout << two;
    } else {
        printf("\nДескрименант меньше нуля, нет корней \n");
    }
 
    printf("\n0 - Выход \n1 - Повторить расчеты\n\n");
    cin >> q;
    switch (q)
    {
        
    case 0:
        {system("exit");
        break;}
    case 1:
        {goto loop1;
        break;}
    default:
        {printf("\nОшибка \n");
        break;
        }
 
    }
    
    return EXIT_SUCCESS;
}
пробовал пихать _getch(); в самые разные места программы, но всё равно не работает. объясните что нужно сделать
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2011, 18:36
Ответы с готовыми решениями:

Ввод символов без нажатия Enter'а
Подскажите пожалуйста, как реализовать считывание символов (одного или нескольких) без нажатия Enter'а.

Ввод данных без нажатия Enter
Здравствуйте. Допустим, у меня есть такое: char ololo; cin &gt;&gt; ololo; Тут мне надо ввести символ и нажать Enter. Как сделать...

Ввод данных без нажатия «Enter»
Добрый день Интересует такой вопрос После ввода числа нужно нажимать клавишу ENTER Как можно добится того, чтобы после ввода числа...

8
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 18:43
Цитата Сообщение от maks_IQ Посмотреть сообщение
пробовал пихать _getch(); в самые разные места программы, но всё равно не работает. объясните что нужно сделать
Куда ты их пихал? Показывай
0
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173
27.01.2011, 18:56  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
printf("\n0 - Выход \n1 - Повторить расчеты\n\n");
    cin >> q; q=_getch(); // тут пробовал
    switch (q)
    {// и тут  тоже
        
    case 0:
        {system("exit");
        break;}
    case 1:
        {goto loop1;
        break;}
    default:
        {printf("\nОшибка \n");
        break;
        }
 
    }
также пробовал заменять cin >> q на q=_getch(), - не работает.
мб можно както сделать без switch?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 19:45
Вместе cin и _getch в данном случае использовать не надо, а нужно использовать _getch примерно так (попутно избавляемся от безусловного перехода по метке, чтобы дяди-программисты не засмеяли)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while(1)
{
    /* Тут код, который выполняет необходимую работу */
 
    puts("Press 1 to repeat, 0 to exit");
    c = _getch(); // с - int
 
    switch(c)
    {
    case 0:
    exit(0);
 
    case 1: break;
    
    default:
    fputs("Invalid key\n", stderr);
    break;
    }
}
 
 
exit(1); /* Возвращаем тут код ошибки, т.к. наша программа
      * никогда не должна достигнуть этой строки */
А если нас не устраивает мелкомягкий и однозначно непереносимый _getch(), то можно написать для него альтернативу.
0
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173
27.01.2011, 19:54  [ТС]
спасибо. а можно поподробнее про exit(1); ?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 20:09
maks_IQ, конечно можно:
Многабукв
Code
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
EXIT(3)                                          Linux Programmer's Manual                                         EXIT(3)
 
NAME
       exit - cause normal process termination
 
SYNOPSIS
       #include <stdlib.h>
 
       void exit(int status);
 
DESCRIPTION
       The exit() function causes normal process termination and the value of status & 0377 is returned to the parent (see
       wait(2)).
 
       All functions registered with atexit(3) and on_exit(3) are called, in the reverse order of their registration.  (It
       is possible for one of these functions to use atexit(3) or on_exit(3) to register an additional function to be exe‐
       cuted during exit processing; the new registration is added to the front of the list of functions that remain to be
       called.)   If one of these functions does not return (e.g., it calls _exit(2), or kills itself with a signal), then
       none of the remaining functions is called, and  further  exit  processing  (in  particular,  flushing  of  stdio(3)
       streams)  is abandoned.  If a function has been registered multiple times using atexit(3) or on_exit(3), then it is
       called as many times as it was registered.
 
       All open stdio(3) streams are flushed and closed.  Files created by tmpfile(3) are removed.
 
       The C standard specifies two constants, EXIT_SUCCESS and EXIT_FAILURE, that may be passed  to  exit()  to  indicate
       successful or unsuccessful termination, respectively.
RETURN VALUE
       The exit() function does not return.

А если вкратце, вызов exit(code) эквивалентен оператору return code внутри тела main (по крайней мере в сишке).
0
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173
27.01.2011, 20:26  [ТС]
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
int main ()
{
    setlocale (LC_ALL,"rus");
    while(1)
    {
    float va, vb, vc; int q; float one=0;float two=0;
    printf("Введите a, b и c \n");
    cin >> va >>vb>>vc;
    float vd=0;
    vd=discr(va,vb,vc);
    one=x_one(vd,va,vb,vc);
    two=x_two(vd,va,vb,vc);
    printf("\nДескрименант = ");
    cout << vd;
    if (vd>=0)
    {
    printf("\nx1 = ");
    cout << one;
    printf("\nx2 = ");
    cout << two;
    } else {
        printf("\nДескрименант меньше нуля, нет корней \n");
    }
 
    printf("\n0 - Выход \n1 - Повторить расчеты\n\n");
    q=_getch();
    switch (q)
    {
    case 0:
        exit(0);
    case 1: break;
    default:
        fputs("Неверный символ\n", stderr);
        break;
    }
    }
    return EXIT_SUCCESS;
}
теперь проблема в том, что какую бы клавишу не нажимал, пишет "неверный символ" и повторяет прогу заново. что за баг?

проблема походу в том, что свич не считывает символ и сразу переходит к условию дефолт. как исправить, и в чем конкретно ошибка кода?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.01.2011, 20:37
Хе, надо было сравнивать не с цифрой, а символом. Попробуй сделать следующее. Замени объявление int q на char q. А это
C
1
2
3
4
5
6
7
8
9
        switch (q)
        {
        case 0:
                exit(0);
        case 1: break;
        default:
                fputs("Неверный символ\n", stderr);
                break;
        }
Замени на это:
C
1
2
3
4
5
6
7
8
9
        switch (q)
        {
        case '0':
                exit(0);
        case '1': break;
        default:
                fputs("Неверный символ\n", stderr);
                break;
        }
1
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173
27.01.2011, 20:46  [ТС]
Оо
все работает, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.01.2011, 20:46
Помогаю со студенческими работами здесь

Ввод символа в консоль без нажатия enter
Программа должна считывать символ не дожидаясь нажатия enter. Как это можно реализовать?

Закрыть ввод без нажатия enter, возможно ли?
Подскажите, возможно ли это? Консольнный ввод элементов массива в одну строку. После того как я ввел количество элементов, равное...

Реагирование textBox2 на ввод значение textBox1 без нажатия buttom
Здравствуйте, подскажите как сделать, что бы при вводе в поле textBox1 значение сразу появлялось в textBox2 без нажатия кнопки Например...

Использование getch()
Я написал программу на c++ в Visual Studio(по учебнику). Суть программы в том, что в начале программы в консоли появляется текст...

Использование getch() место GetAsyncKeyState
Прощу подсказать. Работает как надо, но как можно сделать то-же самое, но без GetAsyncKeyState а с kbhit() и getch() ? Мне фактически...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru