Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26

Проверка ввода

27.06.2017, 18:35. Показов 1786. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите, пожалуйста, написать функцию для обработки неправильного ввода символов. Программа для высчитывания логических выражений, считает вроде корректно, но нету защиты от дурака и неправильно вводимых символов.
Можно вводить 1,0, ()&^|! а остальное должно быть запрещено, т.е выходить надпись что " вы ввели не корректно" или что то похожее.

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
#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
using namespace std;
 
int number()
{
    int res = 0;
    for (;;)
    {
        char c = cin.get();
        if (c >= '0' && c <= '1')
            res = res * 10 + c - '0';
        else
        {
            cin.putback(c);
            return res;
        }
    }
}
 
float expr();
 
int skobki()
{
    char c = cin.get();
    if (c == '(')
    {
        int x = expr();
        cin.get();
        return x;
    }
    else
    {
        cin.putback(c);
        return number();
    }
}
 
int otric()
{
    int x = skobki();
    for (;;)
    {
        char c = cin.get();
        switch (c)
        {
        case '!':
            x = !skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
 
    }
 
}
 
 
int factor()
{
    int x = otric();
    for (;;)
    {
        char c = cin.get();
        switch (c)
        {
        case '&':
            x = x & skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
float expr()
{
    int x = factor();
    for (;;)
    {
        char c = cin.get();
        switch (c)
        {
        case '^':
            x = x ^ factor();
            break;
        case '|':
            x = x | factor();
            break;
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    cout << " Введите выражение:" << endl;
    int res = expr();
    cout << "Результат: " << res << endl;
    _getch();
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2017, 18:35
Ответы с готовыми решениями:

Visual C++ проверка ввода на число, проверка на кирилицу
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. Этот код проверяет на буквы и знаки,...

Проверка ввода
Как можно проверить вводимые данные, являются ли они числом. Допустим если ввели &quot;08098рррр9&quot; - запросить повторный ввод, а...

Проверка ввода
Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так...

13
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
27.06.2017, 18:57
Если уверены, что программа работает корректно, то можете добавить эту функцию и вызывать ее проверяя конкретный char после каждого считывания. Выглядит как костыль, но к этому коду я затрудняюсь придумать что-то лучше.

C++
1
2
3
4
5
6
7
8
9
10
int test(char x) {
    if (x == 1 || x == 0 || x == '(' || x == ')' || x == '&' || x == '^' || x == '|' || x == '!') {
        return 0;
    }
    else {
        cout << endl << "Некорректный ввод!" << endl;
        system("pause");
        exit(1);
    }
}
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
27.06.2017, 19:11  [ТС]
А не подскажете, в каком точно месте вставлятЬ?
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
27.06.2017, 19:15
После каждой строчки где считывается char
C++
1
2
char c = cin.get();
test(с);
Там раза три или четыре это встречается, проверьте.
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
27.06.2017, 19:26  [ТС]
Программа всегда, даже при правильном вводе выводит, что ввели неправильно.
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
27.06.2017, 19:29
Что конкретно вы вводите?) Вы программу сами вообще писали?
C++
1
if (x == 1 || x == 0 || x == '(' || x == ')' || x == '&' || x == '^' || x == '|' || x == '!')
Вот в этой строчке в теле моей функции вручную перечислены допустимые символы. Если есть пробел или еще что-то - добавляйте сюда..)
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
27.06.2017, 19:36  [ТС]
я вводил банальное выражение: 1&1
должно было вывести 1
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
27.06.2017, 19:54
Лучший ответ Сообщение было отмечено ArtemJkee43 как решение

Решение

не учел символ переноса каретки '\n', добавил в условие, пользуйтесь)
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
122
123
124
125
126
#include <iostream> 
#include <conio.h> 
using namespace std;
 
int test(char x);
 
int number()
{
    int res = 0;
    for (;;)
    {
        char c = cin.get();
        test(c);
        if (c >= '0' && c <= '1')
            res = res * 10 + c - '0';
        else
        {
            cin.putback(c);
            return res;
        }
    }
}
 
float expr();
 
int skobki()
{
    char c = cin.get();
    test(c);
    if (c == '(')
    {
        int x = expr();
        cin.get();
        return x;
    }
    else
    {
        cin.putback(c);
        return number();
    }
}
 
int otric()
{
    int x = skobki();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '!':
            x = !skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
 
    }
 
}
 
 
int factor()
{
    int x = otric();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '&':
            x = x & skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
float expr()
{
    int x = factor();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '^':
            x = x ^ factor();
            break;
        case '|':
            x = x | factor();
            break;
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
int test(char x) {
    if (x == '1' || x == '0' || x == '(' || x == ')' || x == '&' || x == '^' || x == '|' || x == '!' || x == '\n') {
        return 0;
    }
    else {
        cout << endl << "Некорректный ввод!" << endl;
        system("pause");
        exit(1);
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    cout << " Введите выражение:" << endl;
    int res = expr();
    cout << "Результат: " << res << endl;
    _getch();
}
1
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
27.06.2017, 20:10  [ТС]
Спасибо!
1
28.06.2017, 13:47
 Комментарий модератора 
ArtemJkee43, запрещено дублировать темы.
Продолжайте обсуждение в этой.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.06.2017, 13:54
YarRainbow,
Цитата Сообщение от YarRainbow
C++
1
if (x == 1 || x == 0 || ... )
Может, '1', '2'?
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
28.06.2017, 13:57
Captain Maxee, Это я тоже подправил в последнем листинге, мог бы и заметить..)
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
28.06.2017, 14:48  [ТС]
Попрошу ещё помощи, как сделать сообщение о некорректном вводе если, например, ввели так:
1&&0 или (1^0)1
чтобы если так ввести то выходило сообщение о неправильном вводе, а не считало как сейчас?
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
122
123
124
125
126
127
128
129
130
131
132
133
// Курсовая.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
using namespace std;
 
int test(char x);
 
bool number()
{
    bool res = 0;
    for (;;)
    {
    
        char c = cin.get();
        test(c);
        if (c >= '0' && c <= '1')
            res = res * 10 + c - '0';
        else
        {
            cin.putback(c);
            return res;
        }
    }
}
 
bool expr();
 
bool skobki()
{
    char c = cin.get();
    test(c);
    if (c == '(')
    {
        int x = expr();
        cin.get();
        return x;
    }
    else
    {
        cin.putback(c);
        return number();
    }
}
 
bool otric()
{
    int x = skobki();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '!':
            x = !skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
 
    }
 
}
 
 
bool vtor()
{
    int x = otric();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '&':
            x = x & skobki();
            break;
 
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
bool expr()
{
    int x = vtor();
    for (;;)
    {
        char c = cin.get();
        test(c);
        switch (c)
        {
        case '^':
            x = x ^ vtor();
            break;
        case '|':
            x = x | vtor();
            break;
        default:
            cin.putback(c);
            return x;
        }
    }
}
 
int test(char x) {
    if (x == '1' || x == '0' || x == '(' || x == ')' || x == '&' || x == '^' || x == '|' || x == '!' || x == '\n') {
        return 0;
    }
    else {
        cout << endl << "Некорректный ввод!" << endl;
        system("pause");
        exit(1);
    }
}
 
int main()
{
 
    setlocale(LC_ALL, "rus");
    cout << "Можно вводить цифры и символы:" << endl << "0,1,(,)" << endl << "! - не, & - и, | - или, ^ - xor" << endl;
    cout << "Введите выражение:" << endl;
    int res = expr();
    cout << "Результат: " << res << endl;
    _getch();
}
0
68 / 51 / 27
Регистрация: 27.04.2015
Сообщений: 203
28.06.2017, 14:56
Начинается...)
Добавить проверку, чтобы операции чередовались со значениями.

PS А вообще, правильное планирование - залог успеха. Я бы все эти проверки делал с какой-нибудь строкой, а потом ее уже бы считывал посимвольно (хотя я вообще не уверен, что данный алгоритм работает верно, потому что при помощи скобок можно сместить порядок выполнения операций, а здесь же вычисления идут линейно, если я правильно оценил беглым взглядом)
Переписывать непродуманную программу целиком (или тем более - писать под нее костыли) сейчас нет времени и желания, no offence..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2017, 14:56
Помогаю со студенческими работами здесь

gets() проверка ввода
возникло слабое звено в программке ... max_length = 100; line = new char; ... gets(line); ... вопрос такой: как...

Проверка ввода
Как ограничить ввод символов в программе!!!! На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб...

Проверка ввода
Здравствуйте! Не нашёл тему, где могут задавать простые вопросы начинающие(если есть такая, подскажите куда писать в следующий раз) ,...

Проверка ввода
Доброго вам времени суток. Бывалые, подскажите неопытному, как лучше писать? И если несложно, то скажите почему. for(;;) { ...

Проверка ввода
Всем добрый день! В данный момент пишу фрагмент кода , вот в чем его суть : пользователь может вводить только буквы английкого...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru