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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> parse it, ch-0 
:(
    Опции темы
observateur
Дата 13.10.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код


#include <iostream>
#include <cstring>                   //for strlen(), etc
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      char st[MAX];                  //stack: array of chars
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(char var)            //put char on stack
         { st[++top] = var; }
      char pop()                     //take char off stack
         { return st[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
class express                        //expression class
   {
   private:
      Stack s;                       //stack for analysis
      char* pStr;                    //pointer to input string
      int len;                       //length of input string
   public:
      express(char* ptr)             //constructor
         {
         pStr = ptr;                 //set pointer to string
         len = strlen(pStr);         //set length
         }
      void parse();                  //parse the input string
      int solve();                   //evaluate the stack
   };
//--------------------------------------------------------------
void express::parse()                //add items to stack
   {
   char ch;                          //char from input string
   char lastval;                     //last value
   char lastop;                      //last operator

   for(int j=0; j<len; j++)          //for each input character
      {
      ch = pStr[j];                  //get next character

      if(ch>='0' && ch<='9')         //if it's a digit,
         s.push(ch-'0');             //save numerical value
                                     //if it's operator
      else if(ch=='+' || ch=='-' || ch=='*' || ch=='/')
         {
         if(s.gettop()==1)           //if it's first operator
            s.push(ch);              //put on stack
         else                        //not first operator
            {
            lastval = s.pop();       //get previous digit
            lastop = s.pop();        //get previous operator
            //if this is * or / AND last operator was + or -
            if( (ch=='*' || ch=='/') &&
                (lastop=='+' || lastop=='-') )
               {
               s.push(lastop);       //restore last two pops
               s.push(lastval);
               }
            else                     //in all other cases
               {
               switch(lastop)        //do last operation
                  {                  //push result on stack
                  case '+': s.push(s.pop() + lastval); break;
                  case '-': s.push(s.pop() - lastval); break;
                  case '*': s.push(s.pop() * lastval); break;
                  case '/': s.push(s.pop() / lastval); break;
                  default:  cout << "\nUnknown oper"; exit(1);
                  }  //end switch
               }  //end else, in all other cases
            s.push(ch);              //put current op on stack
            }  //end else, not first operator
         }  //end else if, it's an operator
      else                           //not a known character
         { cout << "\nUnknown input character"; exit(1); }
      }  //end for
   }  //end parse()
//--------------------------------------------------------------
int express::solve()                 //remove items from stack
   {
   char lastval;                     //previous value

   while(s.gettop() > 1)
      {
      lastval = s.pop();             //get previous value
      switch( s.pop() )              //get previous operator
         {                           //do operation, push answer
         case '+': s.push(s.pop() + lastval); break;
         case '-': s.push(s.pop() - lastval); break;
         case '*': s.push(s.pop() * lastval); break;
         case '/': s.push(s.pop() / lastval); break;
         default:  cout << "\nUnknown operator"; exit(1);
         }  //end switch
      }  //end while
   return int( s.pop() );            //last item on stack is ans
   }  //end solve()
////////////////////////////////////////////////////////////////
int main()
   {
   char ans;                         //'y' or 'n'
   char string[LEN];                 //input string from user
   
   cout << "\nEnter an arithmetic expression"
           "\nof the form 2+3*4/3-2."
           "\nNo number may have more than one digit."
           "\nDon't use any spaces or parentheses.";
   do {
      cout << "\nEnter expresssion: ";
      cin >> string;                        //input from user
      express* eptr = new express(string);  //make expression
      eptr->parse();                        //parse it
      cout << "\nThe numerical value is: " 
           << eptr->solve();                //solve it
      delete eptr;                          //delete expression
      cout << "\nDo another (Enter y or n)? ";
      cin >> ans;
      } while(ans == 'y');
   return 0;
   }

Помогите  мне пожалуйста  у меня одна  программа которая я должен сделать кое-какие упражнении над нем. Я тщательно рассматривал программу. Мне трудно понять эту фразу что это означает ? 
Код

      if(ch>='0' && ch<='9')         //if it's a digit,
         s.push(ch-'0');             //save numerical value

почему здесь минус?  
заранее спасибо
 

PM MAIL   Вверх
Daevaorn
Дата 13.10.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(observateur @  13.10.2006,  20:39 Найти цитируемый пост)
почему здесь минус?  

Это такое преобразование символа числа непосредствено в  число.
http://en.wikipedia.org/wiki/Ascii
PM MAIL WWW   Вверх
sergejzr
Дата 13.10.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Потому что 0 и '0' это две разных вещи первое - число, а второе - буква. 
Вот например кодировка.

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Видим, что: на нулевой позиции стоит '!', на первой - " итд.

Получается:
0='!', 1='"', 2='#',.... '0'=16,'1'=17 итд.

Поэтому с буквами возможны арифметические операции типа:
'0'+1='1', 'G'+1='H', а '9'+1=':'

'0'+8='8' следовательно '8'-'0' =8


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bsa
Дата 13.10.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



на самом деле, восклицательный знак имеет код 0x21 (33), а '0' - 0x30 (48).
PM   Вверх
Kuvaldis
Дата 13.10.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

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



Самое главное то, что цифры в кодировочной таблице идут в непрерывном массиве, т.е. последовательно. В частности, в ASCII (да и в ANSI) коды цифр (а это символы (!) '0' .. '9') начинаются с позиции, равной 48. 
Поэтому, чтобы получить значение (!) из кода, необходимо из кода цифры вычесть номер ее позиции в таблице.
Т.е. если у нуля код - 48, то вычитая 48, и получим 0. Аналогично для других цифр.

Но в целях переносимости и назависимости от реализации (ведь совсем не обязательно, что дядькам (а может и тетькам) с IBM не захочется сделать так, чтобы коды цифр начинались с других позиций)
Вычитая из кода цифры '0', ты об этом не задумываешься (вычитается именно то, что нужно)

Это правило хорошего тона, аналогичное тому, что нужно использовать sizeof и константу EOF (а не явно -1) 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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