uva 327 - Evaluating Simple C Expressions

uva 327 - Evaluating Simple C Expressions

   这个题目的意思是要计算一些c语言表达式的值。这些表达式有+-还有++,--操作符与a-z这些变量组合而成。a-z的权值是1-26。
比如,表达式  c+f--+--a,得出值是9,其它变量的值也需要计算出来。   
   这个题目感觉比较麻烦,刚开始一点思路也没有,还写了个错误的方法,浪费了时间。
   后面我的思路是 (+,-) (--,++)(变量)(--,++),这个匹配式子的意思是先处理二元操作符,然后处理前置,再处理变量,
再处理后置,如果发现没有后置操作符,则把读取的数据重新写回数据流里面,下次再处理。

   代码如下:  
   1 #include <stdio.h> 
  2 #include < string.h>
  3 #include <sstream>
  4 #include <algorithm>
  5  using  namespace std;
  6  struct INFO
  7 {
  8      char ch;
  9      int nValue;
 10      char chAdd;
 11      bool  operator < ( const INFO& info)  const
 12     {
 13          return ch < info.ch;
 14     }
 15 };
 16 
 17 INFO infos[200];
 18  char szLine[200];
 19 
 20  bool GetNextChar(stringstream& ss,  char& ch)
 21 {
 22      while (ss >> ch)
 23     {
 24          if (ch != ' ');
 25         {
 26              return  true;
 27         }
 28     }
 29      return  false;
 30 }
 31 
 32  int main()
 33 {
 34      while (gets(szLine))
 35     {
 36         printf("Expression: %s\n", szLine);
 37         memset(infos, 0,  sizeof(infos));
 38         stringstream ss(szLine);
 39          char ch;
 40          int nNum = 0;
 41          int nValue = 0;
 42          char chOper;
 43          bool bOk =  true;
 44          bool bFirst =  true;
 45          while (1)
 46         {
 47              if (bFirst)
 48             {
 49                 chOper = '+';
 50                 bFirst =  false;
 51             }
 52              else
 53             {
 54                 bOk = GetNextChar(ss, ch);
 55                  if (!bOk)  break;
 56                 chOper = ch;
 57             }
 58 
 59             bOk = GetNextChar(ss, ch);
 60              if (!bOk)  break;
 61 
 62              if (ch == '-') // 前置--
 63              {
 64                 bOk = GetNextChar(ss, ch);
 65                  if (!bOk)  break; // -
 66                  bOk = GetNextChar(ss, ch);
 67                  if (!bOk)  break; // 读取字母
 68 
 69                 infos[nNum].ch = ch;
 70                 infos[nNum].nValue = ch - 'a';
 71 
 72                  if (chOper == '+')
 73                 {
 74                     nValue += infos[nNum].nValue;
 75                 }
 76                  else
 77                 {
 78                     nValue -= infos[nNum].nValue;
 79                 }
 80                 ++nNum;
 81             }
 82              else  if (ch == '+') // 前置++
 83              {
 84                 bOk = GetNextChar(ss, ch);
 85                  if (!bOk)  break; // +
 86                  bOk = GetNextChar(ss, ch);
 87                  if (!bOk)  break; // 读取字母
 88 
 89                 infos[nNum].ch = ch;
 90                 infos[nNum].nValue = ch - 'a' + 2;
 91 
 92                  if (chOper == '+')
 93                 {
 94                     nValue += infos[nNum].nValue;
 95                 }
 96                  else
 97                 {
 98                     nValue -= infos[nNum].nValue;
 99                 }
100                 ++nNum;
101             }
102              else
103             {
104                 infos[nNum].ch = ch;
105                 infos[nNum].nValue = ch - 'a' + 1;
106 
107                  if (chOper == '+')
108                 {
109                     nValue += infos[nNum].nValue;
110                 }
111                  else
112                 {
113                     nValue -= infos[nNum].nValue;
114                 }
115 
116                  // 读取后置操作符
117                   char chOne;
118                  char chTwo;
119                 bOk = GetNextChar(ss, chOne);
120                  if (!bOk)
121                 {
122                     ++nNum;
123                      break;
124                 }
125                 bOk = GetNextChar(ss, chTwo);
126                  if (!bOk)
127                 {
128                     ++nNum;
129                      break;
130                 }
131 
132                  if (chOne == chTwo)
133                 {
134                      if (chOne == '+')
135                     {
136                         infos[nNum].chAdd = '+';
137                     }
138                      else
139                     {
140                         infos[nNum].chAdd = '-';
141                     }
142                 }
143                  else
144                 {
145                     ss.putback(chTwo);
146                     ss.putback(chOne);
147                 }
148                 ++nNum;
149             }
150         }
151 
152         printf("    value = %d\n", nValue);
153         sort(infos, infos + nNum);
154          for ( int i = 0; i < nNum; ++i)
155         {
156              if (infos[i].chAdd == '+')
157             {
158                 infos[i].nValue++;
159             }
160              else  if (infos[i].chAdd == '-')
161             {
162                 infos[i].nValue--;
163             }
164             printf("    %c = %d\n", infos[i].ch, infos[i].nValue);
165         }
166     }
167 
168      return 0;
169 }
170 

你可能感兴趣的:(uva 327 - Evaluating Simple C Expressions)