Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> РЕКУРСИЯ C++, Помогите составить программу на C++ 
:(
    Опции темы
duducai007
Дата 12.12.2012, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.12.2012

Репутация: нет
Всего: нет



Помогите дополнить программу C++ решаюшее примеры ввида (1+2*3)*(4+5)+6*(7+8)+9) используя метод рекурсивного спуска. Операции(лексемы): _Num-число, _Plus-Сложение, _Mul-Умножение, _Open-открыв. скобка, _Close-закрыв. скобка, _End-конец выражения.Проблема в том, что программа выдает ошибку при вычитании, делении, возведении в степень, унарных минусах, дробных числах.
Надо как нибудь дополнить(У меня  не получается(().

А вот и сама программа:

//Грамматика:
//<Выражение> ::= <слагаемое> {+ <слагаемое>}
//<Слагаемое> ::= <множитель> {* <множитель>}
//<Множитель> ::= <число> | (<выражение>)
#include <iostream>
using namespace std;
typedef char TLexem;
const char _Num = '1',
           _Plus = '+',  
           _Mul = '*',
           _Open = '(',
           _Close = ')',
           _End = '\n';
bool is_error = 0; // флаг ошибки
//получение след. лексемы: _Num, _Plus, _Mul, _Open, _Close или _End
void nextlexem(TLexem& curlex, int& vl);
//вычисление выражения
int expr(TLexem& curlex, int& vl);
//вычисление слагаемого
int item(TLexem& curlex, int& vl);
//вычисление множителя
int mult(TLexem& curlex, int& vl);
//обработка ошибок
void error(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)//следующая лексема после множителя не '*' , не '+' и не '\n'
        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);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.