四则运算三

一、升级要求:让程序能接受用户输入答案,并判定对错。最后给出总共对/错的数量。

二、设计思想:

      1、首先输入答案并判断对错。我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案。每输出一道题目,就算出该题目正确答案存入数组中,当所有题目出完,用户输入结果时,再将结果与答案对比,并为用户输出提示,提醒正确或错误。

      2、最后给出总共对/错的数量。在比较用户输入的结果和答案时,若相等,输出提示时,将正确计数器加1;若不等,将错误提示器加1。最后输出两个计数器的值,并提示用户正确/错误的数值。

三、源代码

  1 //信1301-2   胡金辉
  2 
  3 #include "stdafx.h"
  4 #include "stdlib.h"
  5 #include <time.h>
  6 
  7 int _tmain(int argc, _TCHAR* argv[])
  8 {
  9     srand(time(NULL)); //避免题目重复
 10 //存放正确答案和用户结果的数组
 11     int daan[100000],jieguo[100000];
 12     int x1,x2,flag,i,j,k;
 13     int x3,x4;
 14 //正确计数器和错误计数器
 15     int count1=0;
 16     int count2=0;
 17     int a[10];
 18     printf("---------------------------欢迎使用本系统打印题目!----------------------------
");
 19     //可定制打印的题目数
 20     printf("请输入要打印的题目数:");   
 21     scanf("%d",&a[0]);
 22     while(a[0]<=0)  //题目数必须为正数
 23     {
 24         printf("请重新输入有效的题目数:");
 25         scanf("%d",&a[0]);
 26     };
 27     //可定制运算数的范围
 28     printf("请输入运算数的范围:");
 29     scanf("%d",&a[2]);
 30     while(a[2]<=0)  //运算数必须为正数
 31     {
 32         printf("请重新输入有效的范围:");
 33         scanf("%d",&a[2]);
 34     };
 35     //可定制题目中是否有乘除法
 36     printf("请选择否有乘除法(是->1;否->0):");
 37     scanf("%d",&a[1]);
 38     while((a[1]!=1)&(a[1]!=0)) //只能选择1或0
 39     {
 40         printf("请重新输入有效的数值:");
 41         scanf("%d",&a[1]);
 42     };
 43     //可定制题目结果是否有负数
 44     printf("请选择结果有无负数(是->1;否->0):");
 45     scanf("%d",&a[3]);
 46     while((a[3]!=1)&(a[3]!=0))  //只能选择1或0
 47     {
 48         printf("请重新输入有效的数值:");
 49         scanf("%d",&a[3]);
 50     };
 51     //可定制结果是否有余数
 52     printf("请选择结果有无余数(是->1;否->0):");
 53     scanf("%d",&a[4]);
 54     while((a[4]!=1)&(a[4]!=0))  //只能选择1或0
 55     {
 56         printf("请重新输入有效的数值:");
 57         scanf("%d",&a[4]);
 58     };
 59     
 60     //可定制是否支持小数
 61     printf("请选择是否支持小数(是->1;否->0):");
 62     scanf("%d",&a[5]);
 63     while((a[5]!=1)&(a[5]!=0))  //只能选择1或0
 64     {
 65         printf("请重新输入有效的数值:");
 66         scanf("%d",&a[5]);
 67     };
 68     
 69     //可定制是否加括号
 70     printf("请选择是否加括号(是->1;否->0):");
 71     scanf("%d",&a[6]);
 72     while((a[6]!=1)&(a[6]!=0))  //只能选择1或0
 73     {
 74         printf("请重新输入有效的数值:");
 75         scanf("%d",&a[6]);
 76     };
 77 
 78     //循环打印符合要求的题目
 79     for(i=0;i<a[0];i++)
 80     {
 81         switch(a[1]) 
 82         {
 83         case 1:j=rand()%4;break;  //有乘除法
 84             case 0:j=rand()%2;break;  //无乘除法
 85             }
 86             x1=rand()%a[2]+1;
 87                 x2=rand()%a[2]+1;
 88           
 89         //循环打印
 90             if(j==0)
 91         {
 92             
 93             switch(a[6])
 94             {
 95             case 0:
 96                 switch(a[5])
 97                 {
 98                 case 0:printf("%d+%d=		",x1,x2);break;
 99                 case 1:
100                     x3=rand()%9+1;
101                     x4=rand()%9+1;
102                     printf("%d.%d+%d.%d=		",x1,x3,x2,x4);break;
103                 }
104                 break;
105                 
106             case 1:
107                 switch(a[5])
108                 {
109                 case 0:printf("(%d+%d)=	",x1,x2);break;
110                 case 1:
111                     x3=rand()%9+1;
112                     x4=rand()%9+1;
113                     printf("(%d.%d+%d.%d)=	",x1,x3,x2,x4);break;
114                 }
115                 break;
116             }
117 //计算当运算法则为加法时的正确结果,并存入数组
118             jieguo[i]=x1+x2;
119         }
120         if(j==1)
121         {
122                         switch(a[3])
123                         {
124                 case 1: 
125                                 break;
126                     case 0:                   //结果无负数
127                             if(x1<x2)            //被减数比减数小则交换
128                             {
129                                 flag=x1;
130                                 x1=x2;
131                                 x2=flag;
132                              }
133                         break;
134                     }
135             switch(a[6])
136             {
137             case 0:
138                 switch(a[5])
139                 {
140                 case 0:printf("%d-%d=		",x1,x2);break;
141                 case 1:
142                     x3=rand()%9+1;
143                     x4=rand()%9+1;
144                     printf("%d.%d-%d.%d=		",x1,x3,x2,x4);break;
145                 }
146                 break;
147                 
148             case 1:
149                 switch(a[5])
150                 {
151                 case 0:printf("(%d-%d)=	",x1,x2);break;
152                 case 1:
153                     x3=rand()%9+1;
154                     x4=rand()%9+1;
155                     printf("(%d.%d-%d.%d)=	",x1,x3,x2,x4);break;
156                 }
157                 break;
158             }
159 //计算当运算法则为减法时的正确结果,并存入数组
160             jieguo[i]=x1-x2;
161         }
162         if(j==2)
163         {
164             
165             switch(a[6])
166             {
167             case 0:
168                 switch(a[5])
169                 {
170                 case 0:printf("%d*%d=		",x1,x2);break;
171                 case 1:
172                     x3=rand()%9+1;
173                     x4=rand()%9+1;
174                     printf("%d.%d*%d.%d=		",x1,x3,x2,x4);break;
175                 }
176                 break;
177                 
178             case 1:
179                 switch(a[5])
180                 {
181                 case 0:printf("(%d*%d)=	",x1,x2);break;
182                 case 1:
183                     x3=rand()%9+1;
184                     x4=rand()%9+1;
185                     printf("(%d.%d*%d.%d)=	",x1,x3,x2,x4);break;
186                 }
187                 break;
188             }
189 //计算当运算法则为乘法时的正确结果,并存入数组
190             jieguo[i]=x1*x2;
191         }
192         if(j==3)
193         {    
194             switch(a[4])
195             {
196             case 1:                         //结果可有余数
197                 break;
198             case 0:                        //结果无余数
199                 while(x1%x2!=0)            //如果不能整除,则重新生成
200                 {
201                     x1=rand()%a[2]+1;   
202                     x2=rand()%a[2]+1; 
203                    };
204                 break;
205                }
206             switch(a[6])
207             {
208             case 0:
209                 switch(a[5])
210                 {
211                 case 0:printf("%d/%d=		",x1,x2);break;
212                 case 1:
213                     x3=rand()%9+1;
214                     x4=rand()%9+1;
215                     printf("%d.%d/%d.%d=		",x1,x3,x2,x4);break;
216                 }
217                 break;
218                 
219             case 1:
220                    switch(a[5])
221                 {
222                 case 0:printf("(%d/%d)=	",x1,x2);break;
223                 case 1:
224                       x3=rand()%9+1;
225                     x4=rand()%9+1;
226                     printf("(%d.%d/%d.%d)=	",x1,x3,x2,x4);break;
227                   }
228                 break;
229             }
230 //计算当运算法则为除法时的正确结果,并存入数组
231             jieguo[i]=x1/x2;
232         }
233     }
234 
235     for(k=0;k<a[0];k++)
236     {
237         
238         printf("请输入第%d个答案:",k+1);
239         scanf("%d",&daan[k]);
240 //比较结果是否正确,并计数
241         if(daan[k]==jieguo[k])
242         {
243             printf("正确!
");
244                 count1++;    
245         }
246         else
247         {
248             printf("错误!
");
249                 count2++;
250         }
251 
252 
253     }
254     printf("
正确答案有%d个,",count1);   
255     printf("错误答案有%d个。
",count2);
256     printf("------------------------------出题完毕,欢迎再次使用!--------------------------
");
257     return 0;
258 }

运行结果截图:

五、心得体会:

      1、首先看到这个要求时,我首先想到的是在现有的循环中加判断条件,每确定一种运算法则就计算出结果并比较,但是在实现的过程中,我发现这样非常繁琐,而且输出时每出一道题就会要求输出答案,这样页面很不美观。于是我新加了for循环,在所有题目出完后,一起写答案。

      2、我发现在代码编写的过程中,出现的语法问题大大减少,并不像开始的时候那样有很多细小错误,之前出现的错误我也有意识注意。但是还是有两个小问题:使用数组没有提前定义、计算数值的算式位置放错,通过编译也都解决。

六、PSP0级相关日志:

1、项目计划日志

周活动总结表

姓名:李青                                                                   日期:3/19

日期任务 听课 编程 阅读相关书籍 网上查找资料 日总计
周一 100   20   100
周二       20 20
周三     30   30
周四 100 50     150
周五   60 20   80
周六     20 20 20
周日          
周总结 200 110 90 40 460

时间记录日志:

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/14 14:00 15:50 10 100 听课 软件工程上课
  16:00 16:20   20 阅读相关书籍 《构建之法》
3/15 19:00 19:20   20 网上查找资料  
3/16 19:00 19:40 10 30 阅读相关书籍 《梦断代码》
3/17 14:00 15:50 10 100 听课 软件工程上课
  20:10 21:00   50 编程  
3/18 14:30 15:40 10 60 编程  
  19:00 19:20   20 阅读相关书籍 《构建之法》
3/19 8:00 8:20   20 阅读相关书籍 《梦断代码》
  8:40 9:00   20 网上查找资料  

缺陷记录日志:

日期 编号 类型 引入阶段 排除阶段 修复时间 备注
3/17 1 001 设计 编译 20min  判断语句位置错误
  2 002 编码 编译 1min 使用数组之前没有定义
3/18 3 003 设计 编译 5min 计算数值的算式位置放错

          结对编程伙伴:胡金辉  http://www.cnblogs.com/hujinhui/

工作照:

原文地址:https://www.cnblogs.com/liqing1/p/5296009.html