C++程序设计原理与实践 第七章部分答案

  1 //原书本代码
  2 #include "../../st.h"
  3 
  4 const char number='8';
  5 const char quit = 'q';
  6 const char print=';';
  7 const char name = 'a';
  8 const char let ='L';
  9 const string declkey="let";
 10 
 11 class Variable{
 12 public:
 13     string name;
 14     double value;
 15     Variable(string n,double v):name(n),value(v){}
 16 };
 17 
 18 vector<Variable> var_table;
 19 
 20 double get_value(string s)
 21 {
 22     for(int i=0;i<var_table.size();++i)
 23         if(var_table[i].name==s)
 24             return var_table[i].value;
 25     error("get:undefined variable",s);
 26 }
 27 
 28 
 29 
 30 class Token{
 31 public:
 32     char kind;
 33     double value;
 34     string name;
 35     Token(char ch)
 36         :kind(ch),value(0){}
 37     Token(char ch,double val)
 38         :kind(ch),value(val){}
 39     Token(char ch,string n)
 40         :kind(ch),name(n){}
 41 };
 42 
 43 class Token_stream{
 44 public:
 45     Token_stream();
 46     Token get();
 47     void putback(Token t);
 48     void ignore(char c);
 49 private:
 50     bool full;
 51     Token buffer;
 52 };
 53 
 54 Token_stream::Token_stream()
 55     :full(false),buffer(0)
 56 {
 57 }
 58 
 59 void Token_stream::putback(Token t)
 60 {
 61     if(full) error("putback() into a full buffer");
 62     buffer=t;
 63     full=true;
 64 }
 65 
 66 Token Token_stream::get()
 67 {
 68     if(full){
 69         full=false;
 70         return buffer;
 71     }
 72     char ch;
 73     cin>>ch;
 74     switch(ch){
 75     case print: case quit: case '(': case ')': case '{':
 76     case '}':  case '+': case '-': case '*': case '/':
 77     case '!':case '%': case '=':
 78         return Token(ch);
 79     case '.':
 80     case '0': case '1': case '2': case '3': case '4':
 81     case '5': case '6': case '7': case '8': case '9':
 82         { 
 83             cin.putback(ch);
 84             double val;
 85             cin>>val;
 86             return Token(number,val);
 87         }
 88     default:
 89         if(isalpha(ch))
 90         {
 91             string s;
 92             s+=ch;
 93             while(cin.get(ch)&&(isalpha(ch)||isdigit(ch)))    //检查ch是否为字母或数字
 94                 s+=ch;
 95             cin.putback(ch);
 96             if(s==declkey)
 97                 return Token(let);
 98             return Token(name,s);
 99 
100         }
101         error("bad token");
102     }
103 }
104 
105 void Token_stream::ignore(char c)
106 {
107     if(full&&c==buffer.kind)
108     {
109         full=false;
110         return;
111     }
112     full=false;
113     char ch=0;
114     while(cin>>ch)
115         if(ch==c)
116             return;
117 }
118 
119 Token_stream ts;
120 double expression();
121 
122 
123 
124 double primary()
125 {
126 
127     Token t=ts.get();
128     switch(t.kind){
129     case '(':
130     {
131         double d=expression();
132         t=ts.get();
133         if(t.kind!=')')  
134             error("')'expected");
135         return d;
136     }
137     case number:
138         return t.value;
139     case name:                  //书里没这个
140         return get_value(t.name);
141     case '-':
142         return -primary();
143     case '+':
144         return +primary();
145     default:
146         error("primary expected");
147     }
148 }
149 
150 double primary1()
151 {
152     Token t=ts.get();
153     while(true)
154     {
155         switch(t.kind){
156         case '{':
157         {
158             double d=expression();
159             t=ts.get();
160             if(t.kind!='}')  
161                 error("'}'expected");
162             return d;
163         }
164         default:
165             ts.putback(t);
166             return primary();
167         }
168     }
169     
170 
171 }
172 
173 double primary2()
174 {
175     double left=primary1();
176     Token t=ts.get();
177     while(true)
178     {
179         if(t.kind=='!')
180         {
181             if(left==0)
182                 left=1;
183             for(int i=left-1;i>0;i--)
184                 left*=i;
185             t=ts.get();
186         }
187         else
188         {
189             ts.putback(t);
190             return left;
191         }
192     }
193 }
194 
195 double term()
196 {
197     double left=primary2();
198     Token t=ts.get();
199 
200     while(true){
201         switch(t.kind){
202         
203         case '*':
204             left*=primary2();
205             t=ts.get();
206             break;
207         case '/':
208             {
209                 double d=primary2();
210                 if(d==0)
211                     error ("divide by 0");
212                 left /=d;
213                 t=ts.get();
214                 break;
215             }
216         case '%':
217             {
218             int i1=narrow_cast<int>(left);
219             int i2=narrow_cast<int>(term());
220             left=i1%i2;
221             t=ts.get();
222             break;
223             }
224         default:
225             ts.putback(t);
226             return left;
227         }
228     }
229 }
230 
231 double expression()
232 {
233     double left=term();
234     Token t=ts.get();
235     while(true){
236         switch(t.kind){
237         case '+':
238             left+=term();
239             t=ts.get();
240             break;
241         case '-':
242             left-=term();
243             t=ts.get();
244             break;
245         default:
246             ts.putback(t);
247             return left;
248         }
249     }
250 }
251 
252 void clean_up_mess()
253 {
254     ts.ignore(print);
255 }
256 
257 bool is_declared(string var)
258 {
259     for(int i=0;i<var_table.size();++i)
260         if(var_table[i].name==var)
261             return true;
262     return false;
263 }
264 
265 double define_name(string var,double val)
266 {
267     if(is_declared(var))
268         error(var,"  declared twice");
269     var_table.push_back(Variable(var,val));
270     return val;
271 }
272 
273 double declaration()
274 {
275     Token t=ts.get();
276     if(t.kind!=name)
277         error("name expected in declaration");
278     string var_name=t.name;
279 
280     Token t2=ts.get();
281     if(t2.kind!='=')
282         error("=missing in declaration of",var_name);
283 
284     double d=expression();
285     define_name(var_name,d);
286     return d;
287 
288 }
289 
290 double statement()
291 {
292     Token t=ts.get();
293     switch(t.kind)
294     {
295     case let:
296         return declaration();
297     default:
298         ts.putback(t);
299         return expression();
300     }
301 }
302 
303 void calculate()
304 {
305     while(cin)
306     try{
307         cout<<"> ";
308         Token t=ts.get();
309         while(t.kind==print)
310             t=ts.get();
311         if(t.kind==quit)
312         {
313             keep_window_open();
314             return;
315         }
316         ts.putback(t);
317         cout<<"="<<statement()<<endl;
318         }
319     catch(exception&e){
320         cerr<<e.what()<<endl;
321         clean_up_mess();
322     }
323 }
324 
325 int main()
326 {
327     try{
328         calculate();
329         keep_window_open();
330         return 0;
331 
332     }
333 
334 catch(exception&e){
335     cerr<<e.what()<<endl;
336     //cout<<"please enter the character ~ to close the window\n";
337     //char ch;
338     //while(cin>>ch)
339     //    if(ch=='~')
340     //        return 1;
341     keep_window_open("~~");
342     return 1;
343 }
344 
345 catch(...){
346     cerr<<"exception\n";
347     keep_window_open("~~");
348     return 2;
349 }
350     
351 }
书本 改进后计算器
  1 //还有添加了简单练习7 8 9题
  2 #include "../../st.h"
  3 
  4 const char number='8';
  5 const char quit = 'q';
  6 
  7 const char print=';';
  8 const char name = 'a';
  9 const char let ='L';
 10 const char const_='c';
 11 const string declkey1="const";
 12 //const string declkey="let";
 13 const string sqrt_ ="sqrt";
 14 const string pow_="pow";
 15 
 16 class Variable{
 17 public:
 18     string name;
 19     double value;
 20     bool is_const;
 21     Variable(string n,double v,bool b):name(n),value(v),is_const(b){}
 22 };
 23 
 24 vector<Variable> var_table;
 25 
 26 double get_value(string s)
 27 {
 28     for(int i=0;i<var_table.size();++i)
 29         if(var_table[i].name==s)
 30             return var_table[i].value;
 31     error("get:undefined variable",s);
 32 }
 33 
 34 bool get_bool(string s)
 35 {
 36     for(int i=0;i<var_table.size();++i)
 37         if(var_table[i].name==s)
 38             return var_table[i].is_const;
 39     error("get:undefined bool",s);
 40 }
 41 
 42 void set_value(string s,double d)
 43 {
 44     for(int i=0;i<var_table.size();++i)
 45         if(var_table[i].name==s){
 46             var_table[i].value=d;
 47             return;
 48         }
 49         error("set:undefined variable",s);
 50 }
 51 
 52 class Token{
 53 public:
 54     char kind;
 55     double value;
 56     string name;
 57     Token(char ch)
 58         :kind(ch),value(0){}
 59     Token(char ch,double val)
 60         :kind(ch),value(val){}
 61     Token(char ch,string n)
 62         :kind(ch),name(n){}
 63 };
 64 
 65 class Token_stream{
 66 public:
 67     Token_stream();
 68     Token get();
 69     void putback(Token t);
 70     void ignore(char c);
 71 private:
 72     bool full;
 73     Token buffer;
 74 };
 75 
 76 Token_stream::Token_stream()
 77     :full(false),buffer(0)
 78 {
 79 }
 80 
 81 void Token_stream::putback(Token t)
 82 {
 83     if(full) error("putback() into a full buffer");
 84     buffer=t;
 85     full=true;
 86 }
 87 
 88 Token Token_stream::get()
 89 {
 90     if(full){
 91         full=false;
 92         return buffer;
 93     }
 94     char ch;
 95     cin>>ch;
 96     switch(ch){
 97     case print:  case '(': case ')': case '{':
 98     case '}':    case '+':case '-': case '*': case '/':
 99     case '!':case '%': case '=':case ',':
100         //case quit:
101         return Token(ch);
102     case '.':
103     case '0': case '1': case '2': case '3': case '4':
104     case '5': case '6': case '7': case '8': case '9':
105         { 
106             cin.putback(ch);
107             double val;
108             cin>>val;
109             return Token(number,val);
110         }
111     default:
112         if(isalpha(ch)||ch=='#')
113         {
114             if(ch=='#')
115                 return Token(let);
116             string s;
117             s+=ch;
118             while(cin.get(ch)&&(isalpha(ch)||isdigit(ch)||ch=='_'))    //检查ch是否为字母或数字
119                 s+=ch;
120             cin.putback(ch);
121             //if(s==declkey)
122                 //return Token(let);
123             if(s==declkey1)
124                 return Token(const_);
125             if(s==sqrt_)
126                 return Token('s');
127             else if(s==pow_)
128                 return Token('p');
129             if(s=="exit")
130                 return Token(quit);
131             return Token(name,s);
132 
133         }
134         error("bad token");
135     }
136 }
137 
138 void Token_stream::ignore(char c)
139 {
140     if(full&&c==buffer.kind)
141     {
142         full=false;
143         return;
144     }
145     full=false;
146     char ch=0;
147     while(cin>>ch)
148         if(ch==c)
149             return;
150 }
151 
152 Token_stream ts;
153 double expression();
154 
155 
156 
157 double primary()
158 {
159 
160     Token t=ts.get();
161     switch(t.kind){
162     case '(':
163     {
164         double d=expression();
165         t=ts.get();
166         if(t.kind!=')')  
167             error("')'expected");
168         return d;
169     }
170     case number:
171         return t.value;
172     case name:                  //书里没这个
173         {
174             string s1=t.name;
175             t=ts.get();
176             if(t.kind=='=')
177             {
178                 if(!get_bool(s1))
179                 {
180                     double d=expression();
181                     set_value(s1,d);
182                     return d;
183                 }
184                 if(get_bool(s1))
185                     error("the number is const");
186             }
187             else
188             {
189                 ts.putback(t);
190                 return get_value(s1);
191             }
192         }
193             
194     case '-':
195         return -primary();
196     case '+':
197         return +primary();
198     default:
199         error("primary expected");
200     }
201 }
202 
203 double primary1()
204 {
205     Token t=ts.get();
206     while(true)
207     {
208         switch(t.kind){
209         case '{':
210         {
211             double d=expression();
212             t=ts.get();
213             if(t.kind!='}')  
214                 error("'}'expected");
215             return d;
216         }
217         default:
218             ts.putback(t);
219             return primary();
220         }
221     }
222     
223 
224 }
225 
226 double primary2()
227 {
228     double left=primary1();
229     Token t=ts.get();
230     while(true)
231     {
232         if(t.kind=='!')
233         {
234             if(left==0)
235                 left=1;
236             for(int i=left-1;i>0;i--)
237                 left*=i;
238             t=ts.get();
239         }
240         else
241         {
242             ts.putback(t);
243             return left;
244         }
245     }
246 }
247 
248 double term()
249 {
250     double left=primary2();
251     Token t=ts.get();
252 
253     while(true){
254         switch(t.kind){
255         
256         case '*':
257             left*=primary2();
258             t=ts.get();
259             break;
260         case '/':
261             {
262                 double d=primary2();
263                 if(d==0)
264                     error ("divide by 0");
265                 left /=d;
266                 t=ts.get();
267                 break;
268             }
269         case '%':
270             {
271             int i1=narrow_cast<int>(left);
272             int i2=narrow_cast<int>(term());
273             left=i1%i2;
274             t=ts.get();
275             break;
276             }
277         default:
278             ts.putback(t);
279             return left;
280         }
281     }
282 }
283 
284 double expression()
285 {
286     double left=term();
287     Token t=ts.get();
288     while(true){
289         switch(t.kind){
290         case '+':
291             left+=term();
292             t=ts.get();
293             break;
294         case '-':
295             left-=term();
296             t=ts.get();
297             break;
298         default:
299             ts.putback(t);
300             return left;
301         }
302     }
303 }
304 
305 void clean_up_mess()
306 {
307     ts.ignore(print);
308 }
309 
310 bool is_declared(string var)
311 {
312     for(int i=0;i<var_table.size();++i)
313         if(var_table[i].name==var)
314             return true;
315     return false;
316 }
317 
318 double define_name(string var,double val,bool b)
319 {
320     if(is_declared(var))
321         error(var,"  declared twice");
322     var_table.push_back(Variable(var,val,b));
323     return val;
324 }
325 
326 double declaration()
327 {
328     Token t=ts.get();
329     if(t.kind!=name)
330         error("name expected in declaration");
331     string var_name=t.name;
332 
333     Token t2=ts.get();
334     if(t2.kind!='=')
335         error("=missing in declaration of",var_name);
336 
337     double d=expression();
338     define_name(var_name,d,false);
339     return d;
340 
341 }
342 
343 
344 
345 double declaration1()
346 {
347     Token t=ts.get();
348     if(t.kind!=name)
349         error("name expected in declaration");
350     string var_name=t.name;
351 
352     Token t2=ts.get();
353     if(t2.kind!='=')
354         error("=missing in declaration of",var_name);
355 
356     double d=expression();
357     define_name(var_name,d,true);
358     return d;
359 
360 }
361 
362 
363 
364 double sqrt1()                      //第七章简单练习7
365 {
366     Token t=ts.get();
367     switch(t.kind){
368     case '(':
369         {
370             double d=expression();
371             t=ts.get();
372             if(t.kind!=')')  
373                 error("')'expected");
374             if(d<0)                 //第七章简单练习8
375                 error("sqrt error");
376             return sqrt(d);
377         }
378     }
379 }
380 
381 double pow1()                  //第七章简单练习9
382 {
383     Token t=ts.get();
384     switch(t.kind){
385     case '(':
386         {
387             double d=expression();
388             t=ts.get();
389             if(t.kind==',')
390             {
391                 int i2=narrow_cast<int>(expression());
392                 t=ts.get();
393                 if(t.kind!=')')  
394                     error("')'expected");
395                 return pow(d,i2);
396             }
397             else
398                 error(", loss");
399         }
400     }
401 }
402 
403 double statement()
404 {
405     Token t=ts.get();
406     switch(t.kind)
407     {
408     case let:
409         return declaration();
410     case const_:
411         return declaration1();
412     case 's':
413         return sqrt1();
414     case 'p':
415         return pow1();
416     default:
417         ts.putback(t);
418         return expression();
419     }
420 }
421 
422 void calculate()
423 {
424     while(cin)
425     try{
426         cout<<"> ";
427         Token t=ts.get();
428         while(t.kind==print)
429             t=ts.get();
430         if(t.kind==quit)
431             return;
432         ts.putback(t);
433         cout<<"="<<statement()<<endl;
434         }
435     catch(exception&e){
436         cerr<<e.what()<<endl;
437         clean_up_mess();
438     }
439 }
440 
441 int main()
442 {
443     try{
444         calculate();
445         keep_window_open();
446         return 0;
447 
448     }
449 
450 catch(exception&e){
451     cerr<<e.what()<<endl;
452     //cout<<"please enter the character ~ to close the window\n";
453     //char ch;
454     //while(cin>>ch)
455     //    if(ch=='~')
456     //        return 1;
457     keep_window_open("~~");
458     return 1;
459 }
460 
461 catch(...){
462     cerr<<"exception\n";
463     keep_window_open("~~");
464     return 2;
465 }
466     
467 }
第3题
  习题4
  1 //去掉结束符号  用过行号取代
  2 #include "../../st.h"
  3 
  4 const char number='8';
  5 const char quit = 'q';
  6 
  7 const char print=';';
  8 const char name = 'a';
  9 const char let ='L';
 10 const char const_='c';
 11 const string declkey1="const";
 12 //const string declkey="let";
 13 const string sqrt_ ="sqrt";
 14 const string pow_="pow";
 15 
 16 class Variable{
 17 public:
 18     string name;
 19     double value;
 20     bool is_const;
 21     Variable(string n,double v,bool b):name(n),value(v),is_const(b){}
 22 };
 23 
 24 class Symbol_table{
 25 public:
 26     vector<Variable> var_table;
 27     double get(string s);
 28     void set(string s,double d);
 29     bool get_bool(string s);
 30     bool is_declared(string var);
 31     double define_name(string var,double val,bool b);
 32 };
 33 
 34 Symbol_table st;
 35 
 36 double Symbol_table::get(string s)
 37 {
 38     for(int i=0;i<var_table.size();++i)
 39         if(var_table[i].name==s)
 40             return var_table[i].value;
 41     error("get:undefined variable",s);
 42 }
 43 
 44 bool Symbol_table::get_bool(string s)
 45 {
 46     for(int i=0;i<var_table.size();++i)
 47         if(var_table[i].name==s)
 48             return var_table[i].is_const;
 49     error("get:undefined bool",s);
 50 }
 51 
 52 
 53 void Symbol_table::set(string s,double d)
 54 {
 55     for(int i=0;i<var_table.size();++i)
 56         if(var_table[i].name==s){
 57             var_table[i].value=d;
 58             return;
 59         }
 60         error("set:undefined variable",s);
 61 }
 62 
 63 bool Symbol_table::is_declared(string var)
 64 {
 65     for(int i=0;i<var_table.size();++i)
 66         if(var_table[i].name==var)
 67             return true;
 68     return false;
 69 }
 70 
 71 double Symbol_table::define_name(string var,double val,bool b)
 72 {
 73     if(is_declared(var))
 74         error(var,"  declared twice");
 75     var_table.push_back(Variable(var,val,b));
 76     return val;
 77 }
 78 
 79 
 80 
 81 
 82 //vector<Variable> var_table;
 83 
 84 /*double get_value(string s)///
 85 {
 86     for(int i=0;i<var_table.size();++i)
 87         if(var_table[i].name==s)
 88             return var_table[i].value;
 89     error("get:undefined variable",s);
 90 }
 91 
 92 bool get_bool(string s)///
 93 {
 94     for(int i=0;i<var_table.size();++i)
 95         if(var_table[i].name==s)
 96             return var_table[i].is_const;
 97     error("get:undefined bool",s);
 98 }
 99 
100 void set_value(string s,double d)/
101 {
102     for(int i=0;i<var_table.size();++i)
103         if(var_table[i].name==s){
104             var_table[i].value=d;
105             return;
106         }
107         error("set:undefined variable",s);
108 }*/
109 
110 class Token{
111 public:
112     char kind;
113     double value;
114     string name;
115     Token(char ch)
116         :kind(ch),value(0){}
117     Token(char ch,double val)
118         :kind(ch),value(val){}
119     Token(char ch,string n)
120         :kind(ch),name(n){}
121 };
122 
123 class Token_stream{
124 public:
125     Token_stream();
126     Token get();
127     void putback(Token t);
128     void ignore(char c);
129 private:
130     bool full;
131     Token buffer;
132 };
133 
134 Token_stream::Token_stream()
135     :full(false),buffer(0)
136 {
137 }
138 
139 void Token_stream::putback(Token t)
140 {
141     if(full) error("putback() into a full buffer");
142     buffer=t;
143     full=true;
144 }
145 
146 Token Token_stream::get()
147 {
148     if(full){
149         full=false;
150         return buffer;
151     }
152     char ch;
153     cin.get(ch);
154     switch(ch){
155     
156     case '\n':                        //第七章  习题5
157         return Token(print);
158     //case print:  
159     case '(': case ')': case '{':
160     case '}':    case '+':case '-': case '*': case '/':
161     case '!':case '%': case '=':case ',':
162         //case quit:
163         return Token(ch);
164     case '.':
165     case '0': case '1': case '2': case '3': case '4':
166     case '5': case '6': case '7': case '8': case '9':
167         { 
168             cin.putback(ch);
169             double val;
170             cin>>val;
171             return Token(number,val);
172         }
173     case ' ':                         //第七章  习题5
174     {
175         while(isspace(ch))
176             cin>>ch;
177         if(ch=='\n')
178             return Token(print);
179     }
180     default:
181         if(isalpha(ch)||ch=='#')
182         {
183             if(ch=='#')
184                 return Token(let);
185             string s;
186             s+=ch;
187             while(cin.get(ch)&&(isalpha(ch)||isdigit(ch)||ch=='_'))    //检查ch是否为字母或数字
188                 s+=ch;
189             cin.putback(ch);
190             //if(s==declkey)
191                 //return Token(let);
192             if(s==declkey1)
193                 return Token(const_);
194             if(s==sqrt_)
195                 return Token('s');
196             else if(s==pow_)
197                 return Token('p');
198             if(s=="exit")
199                 return Token(quit);
200             return Token(name,s);
201 
202         }
203         error("bad token");
204     }
205 }
206 
207 void Token_stream::ignore(char c)
208 {
209     if(full&&c==buffer.kind)
210     {
211         full=false;
212         return;
213     }
214     full=false;
215     char ch=0;
216     while(cin>>ch)
217         if(ch==c)
218             return;
219 }
220 
221 Token_stream ts;
222 double expression();
223 
224 
225 
226 double primary()
227 {
228 
229     Token t=ts.get();
230     switch(t.kind){
231     case '(':
232     {
233         double d=expression();
234         t=ts.get();
235         if(t.kind!=')')  
236             error("')'expected");
237         return d;
238     }
239     case number:
240         return t.value;
241     case name:                  //书里没这个
242         {
243             string s1=t.name;
244             t=ts.get();
245             if(t.kind=='=')
246             {
247                 if(!st.get_bool(s1))
248                 {
249                     double d=expression();
250                     st.set(s1,d);
251                     return d;
252                 }
253                 if(st.get_bool(s1))
254                     error("the number is const");
255             }
256             else
257             {
258                 ts.putback(t);
259                 return st.get(s1);
260             }
261         }
262             
263     case '-':
264         return -primary();
265     case '+':
266         return +primary();
267     default:
268         error("primary expected");
269     }
270 }
271 
272 double primary1()
273 {
274     Token t=ts.get();
275     while(true)
276     {
277         switch(t.kind){
278         case '{':
279         {
280             double d=expression();
281             t=ts.get();
282             if(t.kind!='}')  
283                 error("'}'expected");
284             return d;
285         }
286         default:
287             ts.putback(t);
288             return primary();
289         }
290     }
291     
292 
293 }
294 
295 double primary2()
296 {
297     double left=primary1();
298     Token t=ts.get();
299     while(true)
300     {
301         if(t.kind=='!')
302         {
303             if(left==0)
304                 left=1;
305             for(int i=left-1;i>0;i--)
306                 left*=i;
307             t=ts.get();
308         }
309         else
310         {
311             ts.putback(t);
312             return left;
313         }
314     }
315 }
316 
317 double term()
318 {
319     double left=primary2();
320     Token t=ts.get();
321 
322     while(true){
323         switch(t.kind){
324         
325         case '*':
326             left*=primary2();
327             t=ts.get();
328             break;
329         case '/':
330             {
331                 double d=primary2();
332                 if(d==0)
333                     error ("divide by 0");
334                 left /=d;
335                 t=ts.get();
336                 break;
337             }
338         case '%':
339             {
340             int i1=narrow_cast<int>(left);
341             int i2=narrow_cast<int>(term());
342             left=i1%i2;
343             t=ts.get();
344             break;
345             }
346         default:
347             ts.putback(t);
348             return left;
349         }
350     }
351 }
352 
353 double expression()
354 {
355     double left=term();
356     Token t=ts.get();
357     while(true){
358         switch(t.kind){
359         case '+':
360             left+=term();
361             t=ts.get();
362             break;
363         case '-':
364             left-=term();
365             t=ts.get();
366             break;
367         default:
368             ts.putback(t);
369             return left;
370         }
371     }
372 }
373 
374 void clean_up_mess()
375 {
376     ts.ignore(print);
377 }
378 
379 /*bool is_declared(string var)
380 {
381     for(int i=0;i<var_table.size();++i)
382         if(var_table[i].name==var)
383             return true;
384     return false;
385 }
386 
387 double define_name(string var,double val,bool b)
388 {
389     if(is_declared(var))
390         error(var,"  declared twice");
391     var_table.push_back(Variable(var,val,b));
392     return val;
393 }*/
394 
395 double declaration()
396 {
397     Token t=ts.get();
398     if(t.kind!=name)
399         error("name expected in declaration");
400     string var_name=t.name;
401 
402     Token t2=ts.get();
403     if(t2.kind!='=')
404         error("=missing in declaration of",var_name);
405 
406     double d=expression();
407     st.define_name(var_name,d,false);
408     return d;
409 
410 }
411 
412 
413 
414 double declaration1()
415 {
416     Token t=ts.get();
417     if(t.kind!=name)
418         error("name expected in declaration");
419     string var_name=t.name;
420 
421     Token t2=ts.get();
422     if(t2.kind!='=')
423         error("=missing in declaration of",var_name);
424 
425     double d=expression();
426     st.define_name(var_name,d,true);
427     return d;
428 
429 }
430 
431 
432 
433 double sqrt1()                      //第七章简单练习7
434 {
435     Token t=ts.get();
436     switch(t.kind){
437     case '(':
438         {
439             double d=expression();
440             t=ts.get();
441             if(t.kind!=')')  
442                 error("')'expected");
443             if(d<0)                 //第七章简单练习8
444                 error("sqrt error");
445             return sqrt(d);
446         }
447     }
448 }
449 
450 double pow1()                  //第七章简单练习9
451 {
452     Token t=ts.get();
453     switch(t.kind){
454     case '(':
455         {
456             double d=expression();
457             t=ts.get();
458             if(t.kind==',')
459             {
460                 int i2=narrow_cast<int>(expression());
461                 t=ts.get();
462                 if(t.kind!=')')  
463                     error("')'expected");
464                 return pow(d,i2);
465             }
466             else
467                 error(", loss");
468         }
469     }
470 }
471 
472 double statement()
473 {
474     Token t=ts.get();
475     switch(t.kind)
476     {
477     case let:
478         return declaration();
479     case const_:
480         return declaration1();
481     case 's':
482         return sqrt1();
483     case 'p':
484         return pow1();
485     default:
486         ts.putback(t);
487         return expression();
488     }
489 }
490 
491 void calculate()
492 {
493     while(cin)
494     try{
495         cout<<"> ";
496         Token t=ts.get();
497         while(t.kind==print)
498             t=ts.get();
499         if(t.kind==quit)
500             return;
501         ts.putback(t);
502         cout<<"="<<statement()<<endl;
503         }
504     catch(exception&e){
505         cerr<<e.what()<<endl;
506         clean_up_mess();
507     }
508 }
509 
510 int main()
511 {
512     try{
513         calculate();
514         keep_window_open();
515         return 0;
516 
517     }
518 
519 catch(exception&e){
520     cerr<<e.what()<<endl;
521     //cout<<"please enter the character ~ to close the window\n";
522     //char ch;
523     //while(cin>>ch)
524     //    if(ch=='~')
525     //        return 1;
526     keep_window_open("~~");
527     return 1;
528 }
529 
530 catch(...){
531     cerr<<"exception\n";
532     keep_window_open("~~");
533     return 2;
534 }
535     
536 }
习题5

 

 本章的计算机  是前九章最经典的  好好了解 特别是文法结构

转载于:https://www.cnblogs.com/yueba/p/4088264.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值