IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Вычисление выражения в постфиксной форме.
Krjuger
сообщение 17.12.2009 0:04
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +



#include <iostream>
#include <conio.h>

struct stek
{
int d;
struct stek *next; //указатель на следующий элемент списка (стека)
};

void push(stek **netx, int d); //функция будет помещать элемент в стек
// next – указатель на вершину стека
int pop(stek **netx); //функция будет извлекать элемент их стека
//вершина которого - next

void push(stek **next, int d)
{ stek *pv = new stek; //объявляем новую динамическую переменную типа stek
pv->d=d; //записываем значение, которое помещается в стек
pv->next=*next; //связываем новый элемент стека с предыдущим
*next=pv; //новый элемент стека становится его вершиной
}

int pop(stek **next)
{ int temp=(*next)->d; //извлекаем в переменную temp значение в вершине стека
stek *pv=*next; //запоминаем указатель на вершину стека, чтобы затем
//освободить выделенную под него память
*next=(*next)->next; //вершиной становится предшествующий top элемент
delete pv; //освобождаем память, тем самым удалили вершину
return temp; //возвращаем значение, которое было в вершине
}


int main()
{
char v[25]="5 9 8 + 4 6 * * 7 + * ";
stek *next=0;
int a,b;
int i=0;
while (v[i]!='\0')
{
if (v[i] == '+') push(&next,pop(&next)+pop(&next));
if (v[i] == '*') push(&next,pop(&next)*pop(&next));
if (v[i] == '-') push(&next,-(pop(&next)-pop(&next)));
if ((v[i]>='0') && (v[i]<='9')) push(&next,0);
while ((v[i]>='0')&&(v[i]<='9')) push(&next,10*pop(&next)+(v[i++]-'0'));
i++;
}
printf("\n %i \n",pop(&next));
return 0;
}


Проблема в том,что я не знаю как реализовать операцию деления,потому что стек построен таким образом что
1 2 \ выдаст мне не 0.5,как должно а выдаст 2,потому что будет поделено не 1 на 2,а 2 на 1 изза того что двойка будет выше по стеку.С + и * не имеет значение положение,с - просто беру обратное число,а вот что с делением сделать ума не приложу.Еще мне не очень нравится,как выглядить эта прога,поэтому хотелось бы чтобы дали советы как это реализовать по другому,чтобы поэффективнее было.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Krjuger
сообщение 17.12.2009 16:09
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Цитата

удивляется, почему же из стека сначала читается последнее число

во первых, я не удивляюсь,если ты не заметил, то я сам объяснил проблему моих затруднейний при данной реализации.Если бы я знал, что можно создавать такие конструкции, как (((a = pop(opers)), (b = pop(opers)), b / a),у меня бы таких вопросов вообще не возникло бы.
Цитата
Был бы постоянный доступ к компьютеру и Интернету - ничего б из меня не получилось.

Ага, ты бы щас сидел и так же, как и многие, изобретал бы свои корявые функции вместо использования библиотечных.Более того, о том как ты обучался...... тогда языки были не настолько высокоуровневы,там был десяток другой функций (утрировано) и в основном решались задачи,требовавшие только вычислительных действий.высчитать какой нибудь полином,найти корни какого нибудь класса уравнений или функций и т.д.Поэтому требования в знанию специфики самого языка были меньше, чем сейчас,зато была большая привязанность в умению составлять алгоритмы.

Так же наверно у нас с вами разное представление понятия "алгоритм",все, что вы мне исправили было не неправильностью алгоритма,а не совсем верным выбором пути реализации.
Цитата
А качество программ все ниже и ниже

Качество ниже,потому что щас заставляют писать программы всех подрят и зачастую людям,которые далеки от математики и не обладают соответствующим складом ума приходится этим заниматься.
Ну, а что поделаеш,раньше на асм писали, по перфакартам отлаживали,а теперь представь все это сейчас.Серьезные задачи решались бы годами.Зато был бы один плюс,в институтах было всего пара групп которые бы этим занимались,существовало бы лиш избранное количество программистов(причем много меньше чем сейчас).
По хорошему ты сам пользуешся средствами ,которые были написаны людьми,которые либо умнее тебя,либо додумались до этого и реализовали это раньше тебя(тот же билдер и дугие редакторы).А теперь представь чо ты вернешся во времена своего обучения,когда ничего этого не было,в итоге каждый раз для своих целей будет изобретать очередной велосипед,это будет занимать уйму времени,но ты будеш прекрасно знать работу самого процессора да и все функционирование системы,плюс очень хорошо будет разбираться в алгоритмах.

Короче на данном этапе развития знание семантики и синтаксиса языка очень сильно влияет на стабильность, скорость работы программы
while(isdigit(v[i]))-библиотечная функция.
while ((v[i]>='0')&&(v[i]<='9')) мой вариант.
Выполняют они абсолютно одно и тоже с точки зрения аглоритма,но 1 вариант придумал человеком,который уж явно умнее меня и наверно продумал варианты,когда мой варинат будет некорректно работать.В итоге использование библиотечной функции повышаеть стабильность программы.А в конце концов,чем все это было вызвано...тем,что я просто не знал о существовании такой функции.
Кстати о птичках,эта реализация взята из книги Страуструпа.....

Кстати я нашел реализованную на С++ постфиксную запись и вычисление,но знаеш почему я ее не использовал?Да потому что от меня не требуется хорошо копаться в интернете и предоставить отлично работающую программу написанную методами,которые мне неизвестны,а мне надо создать свой собственный еле едущий велосипед,чтобы показать, что я не простой пользователь,нажимающий на иконки,когда кто то другой все сделал за меня,а челвоек,который способен сам сделать что либо.И к вам я обращаюсь с целью либо посоветовать реализацию,либо помоч исправиль ошибку,которую я сам исправить не могу из-за отсутствия необходимых знаний.Я не разу не просил скинуть мне готовый код того чего я хочу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 13:51
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"