这个题目的意思是要计算一些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