C++ стековый транслятор арифметических выражений

Ответить
Аватара пользователя
un4-funeral
Сообщения: 60
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

Вобщем, курсач у меня с такой темой. Вот, прошу помощи.
Подобные темы видел, но они обычно ссылаются на другие сайты с описанием алгоритмов...теория вобщем

С клавиатуры вводится арифметическое выражение. Написанный транслятор должен перевести всё в польскую запись и, если потом потребуется, вычислить. Всё надо сделать с использованием класса.
вот...перевод в польскую запись то я могу сделать, если вводятся числа, буквы или знаки "+", "-", "/", "*"
Но мне надо ещё и функции(такие как синус и прочее).
Проблема заключается вот в чём:
к примеру ввели:a+(b-c)
в постфиксной форме будет:a b c - +

а если ввести:a+sin(bc)
в постфиксной форме будет:a b c sin +

но вот, если a+sin(b)
как будет ?


ведь когда производится вычисление по польской записи, то по сути берётся правая и левая ветка дерева и вычисляется по арифметическому выражению с вершины
но если будет sin(b), то одна из веток будет пустая


я не прошу кода, просто объясните как можно эту проблему преодолеть
плизз, не глумитесь над моей глупостью, если онная имел место (((x
Заранее спасибо ((:
Аватара пользователя
un4-funeral
Сообщения: 60
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

мм...уже не надо ((:
сам разобрался
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

un4-funeral писал(а):к примеру ввели:a+(b-c)
в постфиксной форме будет:a b c - +

а если ввести:a+sin(bc)
в постфиксной форме будет:a b c sin +

но вот, если a+sin(b)
как будет ?

Учитывая, что синус - это унарная функция, второе выражение имело бы вид a b c * sin +, а третье - a b sin +
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
un4-funeral
Сообщения: 60
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

а третье - a b sin +
эм...эт то да
но когда идёт алгоритм вычисление по польской записи, то берётся два аргумента и вычисляются по последующему знаку
тут так не пойдёт
Аватара пользователя
un4-funeral
Сообщения: 60
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

когда долго сидишь над одной проблемой, то тупить начинаю =/
помогите плз

вот кусочек кода

Код: Выделить всё

if(sym(o.op[i])==0)
                        {
                        char m[80];
                        strcpy(m,o.op[i].c_str());
                        OPERS=pushf(OPERS,atof(m));
                        MessageDlg(atof(m),mtInformation,TMsgDlgButtons()<<mbOK,NULL);
                        MessageDlg(DELf(&OPERS),mtInformation,TMsgDlgButtons()<<mbOK,NULL);
                        }
суть в чём, когда вывожу в мсг atof(m), то выводит норм
а если вывожу DELf(&OPERS), то обрезает дробную часть
вот сама процедура удаления

Код: Выделить всё

float Polsk: :D ELf(stf **HEAD)
{
        stf *PTR;
        char a;
        /*Если стек пуст, то возвращает '\0' */
        if(*HEAD==NULL) return '\0';
        /* в PTR - адрес вершины */
        PTR=*HEAD;
        a=PTR->c;
        /* Имзеняем адрес вершины */
        *HEAD=PTR->next;
        /* Освобождаем память*/
        free(PTR);
        /* возврат символа*/
        return a;                   
}
вот структура элемента стека

Код: Выделить всё

struct stf
        {
                float c;
                stf *next;
        };
Что-т не понимаю
Ответить