Форум программистов, компьютерный форум CyberForum.ru

Подсчет значения арифметического выражения методом рекурсивного спуска! - C++

Восстановить пароль Регистрация
 
Mitchlow
 Аватар для Mitchlow
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 5
18.12.2012, 16:56     Подсчет значения арифметического выражения методом рекурсивного спуска! #1
Здравствуйте! У меня есть такая программа. Выдает ошибку при работе со скобками. 1)Что не так?
2)Как сюда добавить деление и вычитание?

Помогите, пожайлуста

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
#include <iostream>
#include <iostream>
#include <stdio.h>
using namespace std;
typedef char TLexem;
const char _Num = '1',
           _Plus = '+',  
           _Mul = '*',
           _Open = '(',
           _Close = ')',
           _End = '\n';
bool is_error = 0;
void error(TLexem& curlex, int& vl);
int expr(TLexem& curlex, int& vl);
int item(TLexem& curlex, int& vl);
void nextlexem(TLexem& curlex, int& vl);
int mult(TLexem& curlex, int& vl);
int main()
{
    TLexem curlex;
    int vl;
    int v;
    setlocale(LC_ALL, "Russian");
    nextlexem(curlex, vl);
    if(curlex == _End)
        cout << "Введена пустая строка." << endl;
    else
    {   
        v = expr(curlex, vl);
        if(!is_error)
            cout << "Результат = " << v <<endl;
    }
    system("pause");
    return 0;
}
void nextlexem(TLexem& curlex, int& vl)     
{
    char sim;
    sim = cin.get();
    if(isdigit(sim))
    {
        cin.putback(sim);
        cin >> vl;
        curlex = _Num;
    }
    else
        switch(sim)
        {
            case '+':
                curlex = _Plus;
                break;
            case '*':
                curlex = _Mul;
                break;
            case '(':
                curlex = _Open;
                break;
            case ')':
                curlex = _Close;
                break;
            case ' ':                   
                nextlexem(curlex, vl);
                break;
            case '\n':
                curlex = _End;
            default:
                curlex = sim;//записываю сам символ для послед. обработки ошибок
        }
}
int expr(TLexem& curlex, int& vl)
{
    int a;
    a = item(curlex, vl);
    while(curlex == _Plus)
    {
        nextlexem(curlex, vl);
        a+=item(curlex, vl);
    }
    return a;
}
int item(TLexem& curlex, int& vl)
{
    int a;
    a = mult(curlex, vl);
    while(curlex == _Mul)
    {
        nextlexem(curlex, vl);
        a*=mult(curlex, vl);
    }
    return a;
}
int mult(TLexem& curlex, int& vl)
{
int r = 1;//произвольное значение
switch(curlex)
{
case _Num:
r = vl;
nextlexem(curlex, vl);
break;
case _Open:
            r = expr(curlex, vl);
            if(curlex == _Close)
            {
                nextlexem(curlex, vl);
                break;
            }
default:
error(curlex, vl);
}
if(curlex!= _Plus && curlex!= _Mul && curlex!= _End)
error(curlex, vl);
return r;
}
void error(TLexem& sim, int& vl)
{
    if(sim == _Open || sim == _Close)
        cout << "Ошибка: неверная расстановка скобок." << endl;
    else
        cout << "Ошибка: введён символ '" << sim << "' не являющийся частью выражения, или значение которого в данной позиции не определено." << endl;
    is_error = 1;
    while(sim!= _End)
        nextlexem(sim, vl);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 16:56     Подсчет значения арифметического выражения методом рекурсивного спуска!
Посмотрите здесь:

C++ Подсчет среднего арифметического отрицательных элементов массива
Вычисления значения арифметического выражения на C++ C++
C++ Приложение для вычисления значения арифметического выражения
C++ Программа разбора и вычисления значения арифметического выражения
СЛАУ методом градиентного спуска C++
Дописать подсчет среднего арифметического C++
Алгоритм рекурсивного спуска C++
Программа рекурсивного спуска выражения и перевода в постфиксный вид C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 09:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru