Вобщем, курсач у меня с такой темой. Вот, прошу помощи.
Подобные темы видел, но они обычно ссылаются на другие сайты с описанием алгоритмов...теория вобщем
С клавиатуры вводится арифметическое выражение. Написанный транслятор должен перевести всё в польскую запись и, если потом потребуется, вычислить. Всё надо сделать с использованием класса.
вот...перевод в польскую запись то я могу сделать, если вводятся числа, буквы или знаки "+", "-", "/", "*"
Но мне надо ещё и функции(такие как синус и прочее).
Проблема заключается вот в чём:
к примеру ввели:a+(b-c)
в постфиксной форме будет:a b c - +
а если ввести:a+sin(bc)
в постфиксной форме будет:a b c sin +
но вот, если a+sin(b)
как будет ?
ведь когда производится вычисление по польской записи, то по сути берётся правая и левая ветка дерева и вычисляется по арифметическому выражению с вершины
но если будет sin(b), то одна из веток будет пустая
я не прошу кода, просто объясните как можно эту проблему преодолеть
плизз, не глумитесь над моей глупостью, если онная имел место (((x
Заранее спасибо ((:
C++ стековый транслятор арифметических выражений
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
мм...уже не надо ((:
сам разобрался
сам разобрался
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
- Контактная информация:
когда долго сидишь над одной проблемой, то тупить начинаю =/
помогите плз
вот кусочек кода
суть в чём, когда вывожу в мсг atof(m), то выводит норм
а если вывожу DELf(&OPERS), то обрезает дробную часть
вот сама процедура удаления
вот структура элемента стека
Что-т не понимаю
помогите плз
вот кусочек кода
Код: Выделить всё
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);
}
а если вывожу 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;
};