四则运算系统(周娟、郑倩)

组员:周娟、郑倩

题目       

        请编写一个能自动生成小学四则运算题目的 “软件”。让程序能接受用户输入答案,并判断对错,最后统计错题数及正确的题数。

需求分析:

        ●基本功能

              ●实现-100到100以内的加法

              ●实现-100到100以内的减法

              ●实现-100到100以内的乘法

              ●实现100以内的除法

        ●扩展功能

              ●显示答卷

              ●错题正解

              ●系统评估

              ●错题重做

              ●退出系统

        ●新增功能

              ●在之前的四则运算基础上,新增了负数(负整数最小不小于-100)参与加、减、乘的计算,并且有负数出现时,将其加括号显示。

设计:

        ●程序由主函数和七个子函数构成

        ●主函数功能:首先调用calculate子函数,让运用者进入系统做题,题目随机产生(具体实现由相应子函数完成),共10道题。其次对已完成的试卷进行菜单处理(1表示显示答卷,2表示错题正解,3表示系统评估,4表示错题重做,0表示退出系统)       

       ●子函数包括void division(int *s1,int *s2,int *s3);void calculate();char menu();void evaluate();void answer();void Ranswer();void reform();分别用于计算除法、随机产生数学题给用户计算、制作菜单、系统作出评价、显示答卷、错题正解、错题重做。

代码实现:

 1.cc.cpp文件

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 #include <ctype.h> 
  5 
  6 int sy[10],sr[10],jd[10],jg[10];                                                                       
  7 int fs=0;                 
  8 char fh[10];               
  9 
 10 void division(int *s1,int *s2,int *s3);
 11 void calculate();
 12 char menu();
 13 void evaluate();
 14 void answer();
 15 void Ranswer();
 16 void reform();
 17 
 18 void main()
 19 {
 20     int key=1;
 21     calculate();
 22     while(key)
 23     {
 24         switch(menu())
 25         {
 26         case  '1':  
 27             {  
 28                 printf("\n\n\n");
 29                 answer();   
 30             }   
 31             break;
 32         case  '2':  
 33             {  
 34                 printf("\n\n\n");
 35                 Ranswer();  
 36             }     
 37             break;
 38         case  '3':  
 39             {   
 40                 printf("\n\n\n");
 41                 evaluate(); 
 42             }  
 43             break;
 44         case  '4':  
 45             {  
 46                 printf("\n\n\n");
 47                 reform();
 48             }     
 49             break;
 50         case  '0':   
 51             {   
 52                 printf("\n您已退出四则运算系统,谢谢支持!\n\n");
 53                 key=0;
 54             }
 55         }
 56     }
 57 }
 58 
 59 
 60 void division(int *s1,int *s2,int *s3)
 61 {
 62     int i,b=1,c,jg;         
 63     int cs[20]={0},sy,sr;         
 64     srand( (unsigned)time( NULL ) );
 65 fa: sy=rand()%100;
 66     if(sy==0)   
 67     {
 68         goto fa;
 69     }
 70     for(i=1;i<=sy;i++)         
 71     {    
 72         if(sy%i==0)  
 73         {  
 74             cs[b]=i;  b++;
 75         }
 76         else  continue;
 77     }                          
 78     c=rand()%b;            
 79     if(c==0)  
 80     {
 81         c=c+1;
 82     }
 83     sr=cs[c];
 84     jg=sy/sr;
 85     *s1=sy;                    
 86     *s2=sr;
 87     *s3=jg;
 88 }
 89 
 90 
 91 void calculate()
 92 {    
 93     int p;                    
 94     int i,gh;                 
 95     printf("欢迎来到四则运算测试系统!\n\n您将进行四则运算!Are you ready?Go!\n\n");
 96     srand( (unsigned)time( NULL ) ); 
 97     
 98     
 99     for(i=0;i<10;i++)
100     {
101         sy[i]=rand()%201-100;              
102         sr[i]=rand()%201-100;             
103         p=rand()%4;                   
104         
105         if(p==0)                    
106         {    
107             fh[i]='+';
108             if(sy[i]<0&&sr[i]>0)
109             {
110                 jg[i]=(sy[i])+sr[i];
111             }
112             else if(sy[i]>0&&sr[i]<0)
113             {
114                 jg[i]=sy[i]+(sr[i]);
115             }
116             else if(sy[i]<0&&sr[i]<0)
117             {
118                 jg[i]=(sy[i])+(sr[i]);
119             }
120             else
121             {
122                 jg[i]=sy[i]+sr[i]; 
123             }
124         }        
125         else  if(p==1)                  
126         {
127             fh[i]='-'; 
128             if(sy[i]<0&&sr[i]>0)
129             {
130                 jg[i]=(sy[i])-sr[i];
131             }
132             else if(sy[i]>0&&sr[i]<0)
133             {
134                 jg[i]=sy[i]-(sr[i]);
135             }
136             else if(sy[i]<0&&sr[i]<0)
137             {
138                 jg[i]=(sy[i])-(sr[i]);
139             }
140             else
141             {
142                 jg[i]=sy[i]-sr[i];
143             }
144         }
145         else  if(p==2)                  
146         {   fh[i]='*'; 
147         if(sy[i]<0&&sr[i]>0)
148         {
149             jg[i]=(sy[i])*sr[i];
150         }
151         else if(sy[i]>0&&sr[i]<0)
152         {
153             jg[i]=sy[i]*(sr[i]);
154         }
155         else if(sy[i]<0&&sr[i]<0)
156         {
157             jg[i]=(sy[i])*(sr[i]);
158         }
159         else
160         {
161             jg[i]=sy[i]*sr[i];
162         } 
163         }                   
164         else  if(p==3)
165         {   
166             fh[i]='/';                  
167             division(&sy[i],&sr[i],&jg[i]);  
168         }
169         if(sy[i]<0&&sr[i]<0)
170         {
171             printf("第%2d题:(%2d) %c (%2d) = ",i+1,sy[i],fh[i],sr[i]);
172         }
173         if(sy[i]<0&&sr[i]>0)
174         {
175             printf("第%2d题:(%2d) %c %2d = ",i+1,sy[i],fh[i],sr[i]);
176         }
177         if(sy[i]>0&&sr[i]<0)
178         {
179             printf("第%2d题:%2d %c (%2d) = ",i+1,sy[i],fh[i],sr[i]);
180         }
181         if(sy[i]>0&&sr[i]>0)
182         {
183             printf("第%2d题:%2d %c %2d = ",i+1,sy[i],fh[i],sr[i]);
184         }
185         scanf("%d",&jd[i]);              
186         if(jd[i]==jg[i]) 
187         {
188             fs+=10;
189         }
190     }                                    
191     printf("\n测试结束!\n\n");    
192 }
193 
194 
195 char menu()
196 {
197     char  c='0';                    
198     printf("\n************ 四则运算测试系统 **************\n\n\n");
199     printf("          1.显示答卷        2.错题正解\n\n");
200     printf("          3.系统评估        4.错题重做\n\n");
201     printf("          0.退出系统\n\n"); 
202     printf("\n********************************************");
203     printf("\n请输入选项(0-4):");      
204     do
205     {   scanf("%c",&c);   }          
206     while(!(c>='0'&&c<='4'));              
207     return c;                        
208 }
209 
210 
211 void evaluate()
212 {
213     printf("您的成绩是%d分.\n",fs);  
214     switch(fs)                                      
215     {  case  100: printf("Very good!不要骄傲哦!\n");  break;
216        case  90:  printf("优秀!恭喜您取得了好成绩!\n");  break;
217        case  80:
218        case  70:  printf("良好!请继续努力,下次取得更好的成绩!\n");  break;
219        case  60:  printf("及格!成绩不太理想哟!再接再励吧!\n");  break;
220        case  50:
221        case  40:
222        case  30:
223        case  20:
224        case  10:  printf("多花点功夫吧,不然你会后悔的!!\n");  break;
225        case  0:   printf("太差劲了!再不努力的话,会后悔的哦!再做一次吧!!!!\n");  break;
226     }
227     printf("\n\n");
228 }           
229 
230 
231 void answer()
232 {
233     int j;
234     printf("您的答卷为:\n");
235     for(j=0;j<10;j++)
236     {
237         if(sy[j]<0&&sr[j]<0&&jd[j]<0)
238         {
239             printf("(%2d) %c (%2d) = (%2d)\n",sy[j],fh[j],sr[j],jd[j]);
240         }
241         if(sy[j]<0&&sr[j]<0&&jd[j]>0)
242         {
243             printf("(%2d) %c (%2d) = %2d\n",sy[j],fh[j],sr[j],jd[j]);
244         }
245         if(sy[j]<0&&sr[j]>0&&jd[j]<0)
246         {
247             printf("(%2d) %c %2d = (%2d)\n",sy[j],fh[j],sr[j],jd[j]);
248         }
249         if(sy[j]>0&&sr[j]<0&&jd[j]<0)
250         {
251             printf("%2d %c (%2d) = (%2d)\n",sy[j],fh[j],sr[j],jd[j]);
252         }
253         if(sy[j]>0&&sr[j]>0&&jd[j]<0)
254         {
255             printf("%2d %c %2d = (%2d)\n",sy[j],fh[j],sr[j],jd[j]);
256         }
257         if(sy[j]>0&&sr[j]<0&&jd[j]>0)
258         {
259             printf("%2d %c (%2d) = %2d\n",sy[j],fh[j],sr[j],jd[j]);
260         }
261         if(sy[j]<0&&sr[j]>0&&jd[j]>0)
262         {
263             printf("(%2d) %c %2d = %2d\n",sy[j],fh[j],sr[j],jd[j]);
264         }
265         if(sy[j]>0&&sr[j]>0&&jd[j]>0)
266         {
267             printf("%2d %c %2d = %2d\n",sy[j],fh[j],sr[j],jd[j]);
268         }
269     }
270     printf("\n\n");
271 }
272 
273 
274 void Ranswer()
275 {
276     int k;
277     printf("您答错的题的正确答案为:\n");
278     for(k=0;k<10;k++)
279     {   
280         if(jd[k]==jg[k])  
281         {
282             continue;
283         }
284         else
285         {
286             if(sy[k]<0&&sr[k]<0&&jg[k]<0)
287             {
288                 printf("(%2d) %c (%2d) = (%2d)\n",sy[k],fh[k],sr[k],jg[k]);
289             }
290             if(sy[k]<0&&sr[k]<0&&jg[k]>0)
291             {
292                 printf("(%2d) %c (%2d) = %2d\n",sy[k],fh[k],sr[k],jg[k]);
293             }
294             if(sy[k]<0&&sr[k]>0&&jg[k]<0)
295             {
296                 printf("(%2d) %c %2d = (%2d)\n",sy[k],fh[k],sr[k],jg[k]);
297             }
298             if(sy[k]>0&&sr[k]<0&&jg[k]<0)
299             {
300                 printf("%2d %c (%2d) = (%2d)\n",sy[k],fh[k],sr[k],jg[k]);
301             }
302             if(sy[k]>0&&sr[k]>0&&jg[k]<0)
303             {
304                 printf("%2d %c %2d = (%2d)\n",sy[k],fh[k],sr[k],jg[k]);
305             }
306             if(sy[k]>0&&sr[k]<0&&jg[k]>0)
307             {
308                 printf("%2d %c (%2d) = %2d\n",sy[k],fh[k],sr[k],jg[k]);
309             }
310             if(sy[k]<0&&sr[k]>0&&jg[k]>0)
311             {
312                 printf("(%2d) %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]);
313             }
314             if(sy[k]>0&&sr[k]>0&&jg[k]>0)
315             {
316                 printf("%2d %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]);
317             }
318             
319         }
320     }
321     printf("\n\n");
322 }
323 
324 
325 void reform()
326 {
327     int m,n;
328     printf("以下是您做错的题,请重做:\n");
329     for(m=0;m<10;m++)                      
330         if(jd[m]==jg[m]) 
331         {
332             continue;  
333         }
334         else  
335         {  
336             if(sy[m]<0&&sr[m]<0)
337             {
338                 printf("(%2d) %c (%2d) = ",sy[m],fh[m],sr[m]);
339             }
340             if(sy[m]<0&&sr[m]>0)
341             {
342                 printf("(%2d) %c %2d = ",sy[m],fh[m],sr[m]);
343             }
344             if(sy[m]>0&&sr[m]<0)
345             {
346                 printf("%2d %c (%2d) = ",sy[m],fh[m],sr[m]);
347             }
348             if(sy[m]>0&&sr[m]>0)
349             {
350                 printf("%2d %c %2d = ",sy[m],fh[m],sr[m]);
351             }
352             scanf("%d",&jd[m]);
353             if(jd[m]==jg[m]) 
354             {
355                 printf("恭喜!您做对了!\n");
356             }
357             else                                        
358             {   
359                 for(n=0;n<3;n++)
360                 {  printf("仍未做对!您只有%d次机会了哦:   ",2-n);
361                 if(sy[m]<0&&sr[m]<0)
362                 {
363                     printf("(%2d) %c (%2d) = ",sy[m],fh[m],sr[m]);
364                 }
365                 if(sy[m]<0&&sr[m]>0)
366                 {
367                     printf("(%2d) %c %2d = ",sy[m],fh[m],sr[m]);
368                 }
369                 if(sy[m]>0&&sr[m]<0)
370                 {
371                     printf("%2d %c (%2d) = ",sy[m],fh[m],sr[m]);
372                 }
373                 if(sy[m]>0&&sr[m]>0)
374                 {
375                     printf("%2d %c %2d = ",sy[m],fh[m],sr[m]);
376                 }
377                 
378                 scanf("%d",&jd[m]);                         
379                 if(jd[m]==jg[m])   
380                 { 
381                     printf("恭喜!您做对了!\n");  break;
382                 }
383                 }
384                 
385             }                                       
386         }                                                
387         printf("\n\n");
388 }

 

 2.cc.h文件 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #include <ctype.h>
 5 
 6 int sy[10],sr[10],jd[10],jg[10]; 
 7 int fs=0; 
 8 char fh[10];
 9 
10 void division(int *s1,int *s2,int *s3);
11 void calculate();
12 char menu();
13 void evaluate();
14 void answer();
15 void Ranswer();
16 void reform();

 

 

 程序截图:

 

 

分析与总结:

         ●PSP耗时与总结

PSP Personal Software Process Stage Time(h) Time(%)
●Design ●具体设计 5 9.7
●Coding ●具体编码 26 50.5
●Code Review ●代码复审 5 9.7
●Test ●测试(自测,修改代码) 12 23.3

●Postmortem & Process

Improvement Plan

●事后总结,并提出过程改进计划 3.5 6.8

 

 

 

 

 

 

 

         ●分析

                ●针对四则运算的计算,采用随机数产生参与运算的数和运算符(见代码101-102行),每一次自动生成10道数学题目,运算完成后进入菜单选项,对答卷做相应的操作。

                ●对于加法、减法和乘法新增的负数参与计算。

         ●总结

                ●在原代码的基础上新增负数功能的时候,小组二人认真讨论,精诚合作,在一个小时左右将代码完善,调整缩进,使其符合代码规范。但是,对于单元测试我们还是不懂,看书也不明白该怎么做。

posted @ 2015-04-09 20:44  周娟*  阅读(400)  评论(2编辑  收藏  举报