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

Реализовать парсер арифметических выражений (файловый ввод/вывод, задача №80 acmp)

06.10.2016, 08:06. Просмотров 2748. Ответов 2
Метки нет (Все метки)

задача №80 acmp

Тождество
(Время: 1 сек. Память: 16 Мб Сложность: 32%)

Вам необходимо проверить домашнюю работу Васи Пупкина, в которой он написал равенство. Например, запись вида «2+3=5» является правильной, а «23*7=421» неверная, но корректная. Корректной записью выражения будем называть последовательность: число, операция («+», «-», «*», «/»), число, знак равенства, число. Т.е. если в записи не хватает цифр или же встречается неизвестный символ. Например, записи «2*=3», «173» и «2+2=a» некорректны.
Входные данные

Входной файл INPUT.TXT состоит из единственной строки, содержащей запись арифметического выражения. Все числа в записи целые и не превышают по абсолютной величине 30000. Длина арифметического выражения может быть от 0 до 100 символов.
Выходные данные

В выходной файл OUTPUT.TXT нужно вывести «YES», если указанная запись правильна (т.е. равенство представляет собой тождество), «NO» - если корректная, но неверная и «ERROR», если в записи присутствуют ошибки.


мой код валится на 42 тесте

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
#include <cstring>
#include <fstream>
int main(){
char s[102], znak;
long a=0,b=0,c=0;
long i,k,x=0;
scanf("%s",&s);
k=strlen(s);
for(i=0;i<k;i++){
if(s[i]<48 || s[i]>58){
if(s[i]!='+' & s[i]!='-' & s[i]!='/' & s[i]!='*' & s[i]!='='){
    printf("ERROR");goto A;
}
}
}
i=0;
/* ***** a ***** */
x=1;
if(s[0]=='-') {x=-1; i++;}
if(s[0]=='+') {x=1; i++;}
 
while(s[i]!='+' & s[i]!='-' & s[i]!='/' & s[i]!='*' & s[i]!='=' & s[i]!=0){
a=a*10;
a=a+s[i]-48;
i++;
}
a=a*x;
 
if(s[i]==0 || s[i]=='='){
    printf("ERROR");goto A;
}
 
 
znak=s[i];
/* ***** b ***** */
i++;
if(s[i]=='/' | s[i]=='*' | s[i]==0 | s[i]=='='){
    printf("ERROR");goto A;
}
x=1;
if(s[i]=='-'){x=-1;i++;}
if(s[i]=='+'){x=1;i++;}
while(s[i]!='=' & s[i]!=0){
if(s[i]=='+' | s[i]=='-' | s[i]=='/' | s[i]=='*' | s[i]==0){
    printf("ERROR");goto A;
}
b=b*10;
b=b+(s[i]-48);
i++;
}
b=b*x;
if(s[i]==0 || s[i]!='='){printf("ERROR");goto A;}
 
/* ***** c ***** */
i++;
x=1;
if(s[i]=='-'){x=-1;i++;}
if(s[i]=='+'){x=1;i++;}
if(s[i]==0){printf("ERROR");goto A;}
while(s[i]!=0&s[i]>=48&s[i]<=58){
c=c*10;
c=c+(s[i]-48);
i++;
}
c=c*x;
/* p*r*o*v*e*r*k*a */
if(znak=='+'){
if(a+b==c){printf("YES");}
else {printf("NO");}
}
if(znak=='-'){
if(a-b==c){printf("YES");}
else {printf("NO");}
}
if(znak=='*'){
if(a*b==c){printf("YES");}
else {printf("NO");}
}
if(znak=='/'){
if(b==0){printf("NO");goto A;}
if(a/b==c & a%b==0){printf("YES");}
else {printf("NO");}
}
A:
return 0;
}
0
Миниатюры
Реализовать парсер арифметических выражений (файловый ввод/вывод, задача №80 acmp)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2016, 08:06
Ответы с готовыми решениями:

Написать парсер строк (файловый ввод/вывод)
Здравствуйте! Подскажите, пожалуйста, каким образом можно считать числа из такого файла: Я...

Написать парсер/счётчик строк (файловый ввод/вывод)
Ребята проблема такова , код ниже должен высчитывать количество логических строк в файле , пустых...

Написать парсер, разделяющий строки на подстроки (файловый ввод/вывод)
Подкиньте пожалуйста идей для решения задачи

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод)
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; ...

2
sourcerer
06.10.2016, 08:17
  #2
 Комментарий модератора 
game1progg, переписывайте условие задачи непосредственно в тело сообщения.
Создавайте темы с осмысленными и понятными названиями.
0
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 112
31.05.2018, 10:12 3
Вот мой код. Проходит все 66 тестов.
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
#include <bits/stdc++.h>
using namespace std;
int l, l2, l3;
main() {
    string a;
    getline(cin, a);
    int i = 0, k = 1, num1 = 0, num2 = 0, num3 = 0;
    char c;
    if (a[0] == '-')k = -1, i = 1;
    while (a[i] > 47 && a[i] < 58 && i < a.size()) {
        l = 1;
        num1 = num1 * 10 + a[i] - '0';
        i++;
    }
    num1 *= k;
    if (i >= a.size()) {
        cout << "ERROR\n";
        return 0;
    }
    if (a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/') {
        c = a[i];
    }
    else {
        cout << "ERROR\n";
        return 0;
    }
    i++;
    k = 1;
    if (a[i] == '-')k = -1, i++;
    while (a[i] > 47 && a[i] < 58 && i < a.size()) {
        l2 = 1;
        num2 = num2 * 10 + a[i] - '0';
        i++;
    }
    num2 *= k;
    if (i >= a.size()) {
        cout << "ERROR\n";
        return 0;
    }
    if (a[i] != '=') {
        cout << "ERROR\n";
        return 0;
    }
    k = 1;
    i++;
    if (a[i] == '-')k = -1, i++;
    while (a[i] > 47 && a[i] < 58 && i < a.size()) {
        l3 = 1;
        num3 = num3 * 10 + a[i] - '0';
        i++;
    }
    if (i < a.size() && (a[i] < 48 || a[i]>57)) {
        cout << "ERROR\n";
        return 0;
    }
    num3 *= k;
    if (!l || !l2 || !l3) {
        cout << "ERROR\n";
        return 0;
    }
    if (c == '+')cout << (num1 + num2 == num3 ? "YES" : "NO");
    if (c == '-')cout << (num1 - num2 == num3 ? "YES" : "NO");
    if (c == '*')cout << (num1 * num2 == num3 ? "YES" : "NO");
    if (c == '/')cout << (num2 != 0 && num3*num2 == num1 ? "YES" : "NO");
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2018, 10:12

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

Написать парсер текста, проверяющий правильность расстановки скобок, используя стек и файловый ввод/вывод
Дан текстовый файл INPUT.TXT. Проверить в тексте файла правильности расстановки открывающих и...

Парсер арифметических выражений
Пишу парсер мат. выражений. Столкнулся с проблемкой: как обозначить унарные операции + и - ? Есть...

Парсер арифметических выражений
Добрый вечер, пишу простенький парсер для разбора выражений, содержащих рациональные числа. Вот...

Реализовать файловый ввод-вывод для задания
Дан целочисленный массив A размера N (≤ 15). Переписать в новый целочисленный массив B все элементы...


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

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

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