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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mitchlow
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 5
#1

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

18.12.2012, 16:56. Просмотров 834. Ответов 0
Метки нет (Все метки)

Здравствуйте! У меня есть такая программа. Выдает ошибку при работе со скобками. 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 16:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчет значения арифметического выражения методом рекурсивного спуска! (C++):

Программа рекурсивного спуска выражения и перевода в постфиксный вид - C++
Здраствуйте всем. Задали задание: Написать программу рекурсивного спуска выражения и перевода в постфиксный вид. Столкнулся с кучей ошибок,...

Алгоритм рекурсивного спуска - C++
подскажите что почитать про этот алгоритм? хочу реализовать парсер математических выражений (без переменных, но с функциями типа sin,...

Вычисления значения арифметического выражения на C++ - C++
Помогите, пожалуйста, создать приложение для вычисления значения арифметического выражения, которое может включать в себя действительные...

Написать программу вычисления значения арифметического выражения - C++
Написать программу вычисления значения арифметического выражения, согласно варианта индивидуального задания. Исходные данные a и b...

Приложение для вычисления значения арифметического выражения - C++
Здравствуйте , подскажите пожалуйста как решить вот эту задачу : Создать приложение для вычисления значения арифметического выражения,...

Программа разбора и вычисления значения арифметического выражения - C++
Написать программу разбора и вычисления значения арифметического выражения. На входе программы — строка, содержащая числа, скобки «(» и...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 16:56
Привет! Вот еще темы с ответами:

Решить задачу методом рекурсивного перебора с возвратом - C++
В Волшебной стране используются монетки достоинством A1, A2,..., AM. Волшебный человечек пришел в магазин и обнаружил, что у него есть...

СЛАУ методом градиентного спуска - C++
доброго времени суток! задали ргр по числ.методам: решение СЛАУ методом наискорейшего градиентного спуска. язык- с++, среда...

Поиск минимума функции методом наискорейшего спуска - C++
Добрый день. Передо мной встала задача: реализовать поиск минимума функции градиентным методом наискорейшего спуска. Я программу решила...

Дописать подсчет среднего арифметического - C++
дописать подсчет среднего арифметического, и куда ее вставить в этой программе?? ? { int _w,j; c.n++; ...


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

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

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