Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2008, 18:41   #1
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию Вычисление постфиксного выр-я на С++

Скопировал из книги Бьярна Страустропа вот этот исходник, проверял несколько раз - вроде все правильно, но в качестве значения постфиксного выражения программа упрямо выдает ноль. Пмогите разобраться, почему? И объясните, пожалуйста,что делают операторы в строках 39, 40, 41

Код:
#include <iostream.h>                                                         
#include <conio.h>                                                            
struct Node                                                                   
   {                                                                          
   int d;                                                                     
   Node *p;                                                                   
   };                                                                         
void push (Node **top, int d);                                                
int pop (Node **top);                                                         
                                                                              
void push (Node **top, int d)                                                 
   {                                                                          
   Node *pv = new Node;                                                       
   pv -> d = d;                                                               
   pv -> p = (*top);                                                          
   *top = pv;                                                                 
   }                                                                          
                                                                              
int pop (Node **top)                                                          
   {                                                                          
   int temp = (*top) -> d;                                                    
   Node *pv = (*top);                                                         
   *top = (*top) -> p;                                                        
   delete pv;                                                                 
   return temp; 
   }  
                                                                              
int main() 
   {                                                                          
   char v[24] = "25 10 7 3 * + 1 1 + * + ";                                   
   clrscr();                                                                  
   Node *top = 0;                                                             
                                                                              
   for (int i = 0; i <= 23; i++)                                              
      {                                                                       
      if (v[i] == '+') push (&top, pop (&top) + pop (&top));                  
      if (v[i] == '*') push (&top, pop (&top) * pop (&top));                  
      if ((v[i] >= '0') && (v[i] <= 9)) push (&top, 0);                       
      while ((v[i] >= '0') && (v[i] <= '9'))                                  
         push (&top, 10 * pop (&top) + (v[i++] - '0'));                       
      }                                                                       
   cout << pop (&top);                                                        
   return 0;                                                                  
   }

Последний раз редактировалось Go6a; 19.04.2008 в 18:44.
Go6a вне форума Ответить с цитированием
Старый 19.04.2008, 23:33   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Go6a Посмотреть сообщение
Скопировал из книги Бьярна Страустропа вот этот исходник, проверял несколько раз - вроде все правильно, но в качестве значения постфиксного выражения программа упрямо выдает ноль. Пмогите разобраться, почему? И объясните, пожалуйста,что делают операторы в строках 39, 40, 41
Долго пытался понять, что Вы хотите сказать, но так и не осилил. К тому же в листинге встречаются ошибки, включая неверное указание размера массива v, а при выполнении начинаются обращения по NULL-пойнтерам. Что Вы имеете в виду?
B_N вне форума Ответить с цитированием
Старый 19.04.2008, 23:51   #3
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

вот ссылка http://mf.grsu.by/Kafedry/kaf001/aca...ec_012?dwnld=1
4.2 Пример:вычисление постфиксного выражения
Go6a вне форума Ответить с цитированием
Старый 20.04.2008, 00:03   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Go6a Посмотреть сообщение
вот ссылка http://mf.grsu.by/Kafedry/kaf001/aca...ec_012?dwnld=1
4.2 Пример:вычисление постфиксного выражения
Тот вариант работает. Даёт в результате 87.
B_N вне форума Ответить с цитированием
Старый 20.04.2008, 00:09   #5
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

Буду проверять дальше,
объясните, пожалуйста, что делают операторы:
if ((v[i]>='0') && (v[i]<='9')) push(&top,0);
while ((v[i]>='0')&&(v[i]<='9')) push(&top,10*pop(&top)+(v[i++]-'0'))
Go6a вне форума Ответить с цитированием
Старый 20.04.2008, 00:22   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Go6a Посмотреть сообщение
Буду проверять дальше,
объясните, пожалуйста, что делают операторы:
if ((v[i]>='0') && (v[i]<='9')) push(&top,0);
while ((v[i]>='0')&&(v[i]<='9')) push(&top,10*pop(&top)+(v[i++]-'0'))
Go6a, простите, не совсем понял. Я здесь вижу только "больше или равно", "меньше или равно", конъюнкцию - логическое И, сложение, умножение и постинкремент.... Ну ещё взятие адреса... О чём Вы?
B_N вне форума Ответить с цитированием
Старый 20.04.2008, 00:27   #7
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

Для чего нужны эти операторы в указанном выше исходнике программы по вычислению постфиксного выражения?
if ((v[i]>='0') && (v[i]<='9')) push(&top,0);
while ((v[i]>='0')&&(v[i]<='9')) push(&top,10*pop(&top)+(v[i++]-'0'));
Можете объяснить, что они делают и для чего нужны конкретно в этой программе?
Go6a вне форума Ответить с цитированием
Старый 20.04.2008, 00:32   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Go6a Посмотреть сообщение
Для чего нужны эти операторы в указанном выше исходнике программы по вычислению постфиксного выражения?
Это просто такой своеобразный перевод строки в число. В стэк поразрядно заталкиваются цифры из строки, превращаемые в число (цифра - '0' даёт число, которое ей соотвтствует).
B_N вне форума Ответить с цитированием
Старый 20.04.2008, 00:47   #9
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

Вобщем, я весь запутался.
push(&top,0) /* заталкивает в стек переменную типа Node, поле данных которой равно нулю*/
10*pop(&top)/*затем функция pop выталкивает этот ноль, который умножается на 10,*/
(v[i++]-'0'));/*и зачем из следующего элемента массива вычитать ноль? от вычитания ноля ничего ж не меняется*/
Go6a вне форума Ответить с цитированием
Старый 20.04.2008, 00:54   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Go6a Посмотреть сообщение
Вобщем, я весь запутался.
push(&top,0) /* заталкивает в стек переменную типа Node, поле данных которой равно нулю*/
Это только при встрече нового числа - в стэке резервируется "пустое" место, естественно, это 0.
Цитата:
Сообщение от Go6a Посмотреть сообщение
10*pop(&top)/*затем функция pop выталкивает этот ноль, который умножается на 10,*/
Умножается на 10 уже вовсе не 0, а число, которое там постепенно образуется в цикле - оно сдвигается на один десятичный разряд влево по мере прохождения строки с записью числа.
Цитата:
Сообщение от Go6a Посмотреть сообщение
(v[i++]-'0'));/*и зачем из следующего элемента массива вычитать ноль? от вычитания ноля ничего ж не меняется*/
Не ноль, а символ '0'! '9'-'0' = 9 - обратите внимание на апострофы!
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление полинома file Паскаль, Turbo Pascal, PascalABC.NET 5 29.05.2008 21:00
Паскаль. Вычисление функции СТАС48 Помощь студентам 0 30.11.2007 07:44
Вычисление интреграла Kiedis Помощь студентам 19 23.05.2007 19:41
Вычисление Exp Mickle Общие вопросы Delphi 1 26.04.2007 09:34
TDBGrid. Вычисление Nic-x БД в Delphi 8 17.04.2007 08:19