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

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

27.06.2017, 18:35. Просмотров 1135. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2017, 18:35
Ответы с готовыми решениями:

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

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

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

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

13
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
27.06.2017, 18:57 2
Если уверены, что программа работает корректно, то можете добавить эту функцию и вызывать ее проверяя конкретный 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  [ТС] 3
А не подскажете, в каком точно месте вставлятЬ?
0
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
27.06.2017, 19:15 4
После каждой строчки где считывается char
C++
1
2
char c = cin.get();
test(с);
Там раза три или четыре это встречается, проверьте.
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
27.06.2017, 19:26  [ТС] 5
Программа всегда, даже при правильном вводе выводит, что ввели неправильно.
0
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
27.06.2017, 19:29 6
Что конкретно вы вводите?) Вы программу сами вообще писали?
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  [ТС] 7
я вводил банальное выражение: 1&1
должно было вывести 1
0
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
27.06.2017, 19:54 8
Лучший ответ Сообщение было отмечено 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  [ТС] 9
Спасибо!
1
MrGluck
28.06.2017, 13:47
  #10
 Комментарий модератора 
ArtemJkee43, запрещено дублировать темы.
Продолжайте обсуждение в этой.
0
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.06.2017, 13:54 11
YarRainbow,
Цитата Сообщение от YarRainbow
C++
1
if (x == 1 || x == 0 || ... )
Может, '1', '2'?
0
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
28.06.2017, 13:57 12
Captain Maxee, Это я тоже подправил в последнем листинге, мог бы и заметить..)
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 26
28.06.2017, 14:48  [ТС] 13
Попрошу ещё помощи, как сделать сообщение о некорректном вводе если, например, ввели так:
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
66 / 49 / 27
Регистрация: 27.04.2015
Сообщений: 201
28.06.2017, 14:56 14
Начинается...)
Добавить проверку, чтобы операции чередовались со значениями.

PS А вообще, правильное планирование - залог успеха. Я бы все эти проверки делал с какой-нибудь строкой, а потом ее уже бы считывал посимвольно (хотя я вообще не уверен, что данный алгоритм работает верно, потому что при помощи скобок можно сместить порядок выполнения операций, а здесь же вычисления идут линейно, если я правильно оценил беглым взглядом)
Переписывать непродуманную программу целиком (или тем более - писать под нее костыли) сейчас нет времени и желания, no offence..)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2017, 14:56

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

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

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

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

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


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

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

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