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

 1 //想了许久
 2 #include "../../st.h"
 3 
 4 int f=0;   //判断句子是否正确
 5 
 6 void sent();
 7 
 8 void conj()
 9 {
10     string st;
11     cin>>st;
12     if(st=="and"||st=="or"||st=="but")
13         sent();
14 
15 }
16 
17 void verb()
18 {
19     string st;
20     cin>>st;
21     char c;
22     if(st=="rules"||st=="fly"||st=="swim")
23     {
24         c=getchar();
25         if(c=='.')
26         {
27             f=1;
28             return;
29         }
30         else if(c=='\n')
31         {
32             f=0;return;
33         }
34         else
35         {
36             cin.putback(c);
37             conj();
38         }
39     }
40 
41 }
42 
43 void noun()
44 {
45     string st;
46     cin>>st;
47     if(st=="birds"||st=="fish"||st=="c++")
48         verb();
49 }
50 
51 void sent()
52 {
53     string st;
54     cin>>st;
55     if(st=="the"||st=="an"||st=="a")
56         noun();
57     else if(st=="birds"||st=="fish"||st=="c++")
58         verb();
59     
60 }
61 
62 int main()
63 {
64     sent();
65     if(f==1)
66         cout<<"OK";
67     else
68         cout<<"no ok";
69     while(1);
70     return 1;
71 }
第6题
 1 #include "../../st.h"
 2 
 3 double p(int a,int b)
 4 {
 5     int i;
 6     int j=a-b;
 7     for(i=a-1;i>0;i--)
 8         a*=i;
 9     for(i=j-1;i>0;i--)
10         j*=i;
11     return a/j;
12 }
13 
14 double c(int a,int b)
15 {
16     int i;
17     int j=b;
18     for(i=j-1;i>0;i--)
19         j*=i;
20     return p(a,b)/j;
21 }
22 
23 int main()
24 {
25     int a,b;
26     cin>>a>>b;
27     while(a<b)
28     {
29         cout<<"a should >=b"<<endl;
30         cout<<"enter a and b:"<<endl;
31         cin>>a>>b;
32     }
33     char ch;
34     cout<<"input c or p:"<<endl;
35     cin>>ch;
36     if(ch=='p')
37         cout<<"p "<<p(a,b)<<endl;
38     else 
39         cout<<"c "<<c(a,b)<<endl;
40     while(1);
41     return 0;
42 }
第10题
  1 #include "../../st.h"
  2 
  3 class Token{
  4 public:
  5     char kind;
  6     double value;
  7     Token(char ch)
  8         :kind(ch),value(0){}
  9     Token(char ch,double val)
 10         :kind(ch),value(val){}
 11 };
 12 
 13 class Token_stream{
 14 public:
 15     Token_stream();
 16     Token get();
 17     void putback(Token t);
 18 private:
 19     bool full;
 20     Token buffer;
 21 };
 22 
 23 Token_stream::Token_stream()
 24     :full(false),buffer(0)
 25 {
 26 }
 27 
 28 void Token_stream::putback(Token t)
 29 {
 30     if(full) error("putback() into a full buffer");
 31     buffer=t;
 32     full=true;
 33 }
 34 
 35 Token Token_stream::get()
 36 {
 37     if(full){
 38         full=false;
 39         return buffer;
 40     }
 41     char ch;
 42     cin>>ch;
 43     switch(ch){
 44     case '=': case 'q': case '(': case ')': case '{':
 45     case '}':  case '+': case '-': case '*': case '/':
 46     case '!':
 47         return Token(ch);
 48     case '.':
 49     case '0': case '1': case '2': case '3': case '4':
 50     case '5': case '6': case '7': case '8': case '9':
 51         { 
 52             cin.putback(ch);
 53             double val;
 54             cin>>val;
 55             return Token('8',val);
 56         }
 57     default:
 58         error("bad token");
 59     }
 60 }
 61 
 62 Token_stream ts;
 63 double expression();
 64 
 65 
 66 
 67 double primary()
 68 {
 69 
 70     Token t=ts.get();
 71     switch(t.kind){
 72     case '(':
 73     {
 74         double d=expression();
 75         t=ts.get();
 76         if(t.kind!=')')  
 77             error("')'expected");
 78         return d;
 79     }
 80     case '8':
 81         return t.value;
 82     default:
 83         error("primary expected");
 84     }
 85 }
 86 
 87 double primary1()
 88 {
 89     Token t=ts.get();
 90     while(true)
 91     {
 92         switch(t.kind){
 93         case '{':
 94         {
 95             double d=expression();
 96             t=ts.get();
 97             if(t.kind!='}')  
 98                 error("'}'expected");
 99             return d;
100         }
101         default:
102             ts.putback(t);
103             return primary();
104         }
105     }
106     
107 
108 }
109 
110 double primary2()
111 {
112     double left=primary1();
113     Token t=ts.get();
114     while(true)
115     {
116         if(t.kind=='!')
117         {
118             if(left==0)
119                 left=1;
120             for(int i=left-1;i>0;i--)
121                 left*=i;
122             t=ts.get();
123         }
124         else
125         {
126             ts.putback(t);
127             return left;
128         }
129     }
130 }
131 
132 double term()
133 {
134     double left=primary2();
135     Token t=ts.get();
136 
137     while(true){
138         switch(t.kind){
139         
140         case '*':
141             left*=primary2();
142             t=ts.get();
143             break;
144         case '/':
145             {
146                 double d=primary2();
147                 if(d==0)
148                     error ("divide by 0");
149                 left /=d;
150                 t=ts.get();
151                 break;
152             }
153         default:
154             ts.putback(t);
155             return left;
156         }
157     }
158 }
159 
160 double expression()
161 {
162     double left=term();
163     Token t=ts.get();
164     while(true){
165         switch(t.kind){
166         case '+':
167             left+=term();
168             t=ts.get();
169             break;
170         case '-':
171             left-=term();
172             t=ts.get();
173             break;
174         default:
175             ts.putback(t);
176             return left;
177         }
178     }
179 }
180 
181 int main()
182 {
183     try{
184     double val=0;
185     while(cin){
186         Token t=ts.get();
187         if(t.kind=='q') break;
188         if(t.kind=='=')
189             cout<<val<<'\n';
190         else
191             ts.putback(t);
192         val=expression();
193         }
194 
195     }
196 
197 catch(exception&e){
198     cerr<<e.what()<<endl;
199     while(1);
200     return 1;
201 }
202 
203 catch(...){
204     cerr<<"exception\n";
205     while(1);
206     return 2;
207 }
208     
209 }
第2 3题
  1 #include "../../st.h"
  2 
  3 class Token{
  4 public:
  5     char kind;
  6     int value;
  7     Token(char ch)
  8         :kind(ch),value(0){}
  9     Token(char ch,int val)
 10         :kind(ch),value(val){}
 11 };
 12 
 13 class Token_stream{
 14 public:
 15     Token_stream();
 16     Token get();
 17     void putback(Token t);
 18 private:
 19     bool full;
 20     Token buffer;
 21 };
 22 
 23 Token_stream::Token_stream()
 24     :full(false),buffer(0)
 25 {
 26 }
 27 
 28 void Token_stream::putback(Token t)
 29 {
 30     if(full) error("putback() into a full buffer");
 31     buffer=t;
 32     full=true;
 33 }
 34 
 35 Token Token_stream::get()
 36 {
 37     if(full){
 38         full=false;
 39         return buffer;
 40     }
 41     char ch;
 42     cin>>ch;
 43     switch(ch){
 44     case '=': case 'q': case '(': case ')': case '{':
 45     case '}':  case '&': case '^': case '|': case '~':
 46     case '!':
 47         return Token(ch);
 48     case '-':
 49     case '0': case '1': case '2': case '3': case '4':
 50     case '5': case '6': case '7': case '8': case '9':
 51         { 
 52             cin.putback(ch);
 53             int val;
 54             cin>>val;
 55             return Token('8',val);
 56         }
 57     default:
 58         error("bad token");
 59     }
 60 }
 61 
 62 Token_stream ts;
 63 int term2();
 64 
 65 
 66 int primary()
 67 {
 68 
 69     Token t=ts.get();
 70     switch(t.kind){
 71     case '(':
 72     {
 73         int d=term2();
 74         t=ts.get();
 75         if(t.kind!=')')  
 76             error("')'expected");
 77         return d;
 78     }
 79     case '8':
 80         return t.value;
 81     default:
 82         error("primary expected");
 83     }
 84 }
 85 
 86 int primary1()
 87 {
 88     Token t=ts.get();
 89     while(true)
 90     {
 91         switch(t.kind){
 92         case '{':
 93         {
 94             int d=term2();
 95             t=ts.get();
 96             if(t.kind!='}')  
 97                 error("'}'expected");
 98             return d;
 99         }
100         default:
101             ts.putback(t);
102             return primary();
103         }
104     }
105     
106 
107 }
108 
109 int primary2()
110 {
111     
112     Token t=ts.get();
113     if(t.kind!='!'&&t.kind!='~'){
114         ts.putback(t);
115         int left=primary1();
116         return left;
117     }
118     int left=primary1();
119     while(true)
120     {
121         if(t.kind=='!')
122         {
123             left=!left;
124             t=ts.get();
125         }
126         else if(t.kind=='~')
127         {
128             left=~left;
129             t=ts.get();
130         }
131         else
132         {
133             ts.putback(t);
134             return left;
135         }
136     }
137 }
138 
139 int term()
140 {
141     int left=primary2();
142     Token t=ts.get();
143 
144     while(true){
145         switch(t.kind){
146         
147         case '&':
148             left&=primary2();
149             t=ts.get();
150             break;
151         default:
152             ts.putback(t);
153             return left;
154         }
155     }
156 }
157 
158 int term1()
159 {
160     int left=term();
161     Token t=ts.get();
162 
163     while(true){
164         switch(t.kind){
165         
166         case '^':
167             left^=term();
168             t=ts.get();
169             break;
170         default:
171             ts.putback(t);
172             return left;
173         }
174     }
175 }
176 
177 int term2()
178 {
179     int left=term1();
180     Token t=ts.get();
181 
182     while(true){
183         switch(t.kind){
184         
185         case '|':
186             left|=term1();
187             t=ts.get();
188             break;
189         default:
190             ts.putback(t);
191             return left;
192         }
193     }
194 }
195 
196 
197 int main()
198 {
199     try{
200     int val=0;
201     while(cin){
202         Token t=ts.get();
203         if(t.kind=='q') break;
204         if(t.kind=='=')
205             cout<<val<<'\n';
206         else
207             ts.putback(t);
208         val=term2();
209         }
210 
211     }
212 
213 catch(exception&e){
214     cerr<<e.what()<<endl;
215     while(1);
216     return 1;
217 }
218 
219 catch(...){
220     cerr<<"exception\n";
221     while(1);
222     return 2;
223 }
224     
225 }
第7题

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值