软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

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

二、设计思想:

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

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

三、源代码:

  1 //信1201-1   胡亚宝
  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("---------------------------欢迎使用本系统打印题目!----------------------------\n");
 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=\t\t",x1,x2);break;
 99                 case 1:
100                     x3=rand()%9+1;
101                     x4=rand()%9+1;
102                     printf("%d.%d+%d.%d=\t\t",x1,x3,x2,x4);break;
103                 }
104                 break;
105                 
106             case 1:
107                 switch(a[5])
108                 {
109                 case 0:printf("(%d+%d)=\t",x1,x2);break;
110                 case 1:
111                     x3=rand()%9+1;
112                     x4=rand()%9+1;
113                     printf("(%d.%d+%d.%d)=\t",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=\t\t",x1,x2);break;
141                 case 1:
142                     x3=rand()%9+1;
143                     x4=rand()%9+1;
144                     printf("%d.%d-%d.%d=\t\t",x1,x3,x2,x4);break;
145                 }
146                 break;
147                 
148             case 1:
149                 switch(a[5])
150                 {
151                 case 0:printf("(%d-%d)=\t",x1,x2);break;
152                 case 1:
153                     x3=rand()%9+1;
154                     x4=rand()%9+1;
155                     printf("(%d.%d-%d.%d)=\t",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=\t\t",x1,x2);break;
171                 case 1:
172                     x3=rand()%9+1;
173                     x4=rand()%9+1;
174                     printf("%d.%d*%d.%d=\t\t",x1,x3,x2,x4);break;
175                 }
176                 break;
177                 
178             case 1:
179                 switch(a[5])
180                 {
181                 case 0:printf("(%d*%d)=\t",x1,x2);break;
182                 case 1:
183                     x3=rand()%9+1;
184                     x4=rand()%9+1;
185                     printf("(%d.%d*%d.%d)=\t",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=\t\t",x1,x2);break;
212                 case 1:
213                     x3=rand()%9+1;
214                     x4=rand()%9+1;
215                     printf("%d.%d/%d.%d=\t\t",x1,x3,x2,x4);break;
216                 }
217                 break;
218                 
219             case 1:
220                    switch(a[5])
221                 {
222                 case 0:printf("(%d/%d)=\t",x1,x2);break;
223                 case 1:
224                       x3=rand()%9+1;
225                     x4=rand()%9+1;
226                     printf("(%d.%d/%d.%d)=\t",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("正确!\n");
244                 count1++;    
245         }
246         else
247         {
248             printf("错误!\n");
249                 count2++;
250         }
251 
252 
253     }
254     printf("\n正确答案有%d个,",count1);   
255     printf("错误答案有%d个。\n",count2);
256     printf("------------------------------出题完毕,欢迎再次使用!--------------------------\n");
257     return 0;
258 }

四、运行结果:

五、心得体会:

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

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

六、PSP0级相关日志:

1、项目计划日志

周活动总结表

姓名:胡亚宝                                                                    日期:3/20

日期\任务听课    编写程序阅读书本考研复习 安装软件日总计  
周日      
周一      
周二      
周三      
周四 300 50 30 90 80 550
周五 200 60 30   290
周六      
周总结 500 110 60 90 80 840

阶段时间和效率                                                                      周数:1

不包括上一周在内的累计时间                                                                

总计                    
平均     
最大     
最小     

 以前各周的累计时间                                                                         

总计500110609080840
平均5001106090 80840 
最大500110609080840
最小500 11060 90 80840 

2、时间记录日志

学生:胡亚宝                                                                     日期:3/20

教师:王建民                                                                      课程:PSP

日期开始时间结束时间中断时间净时间活动备注
3/1908:0012:0040200听课(嵌入式系统、接口技术)课间休息
 14:0015:5010 100听课(嵌入式软件开发技术)课间休息
 16:0017:30 90考研复习 
 18:3020:001080安装软件休息
 20:1021:00 50编写程序(终极版四则运算) 
 21:0021:30 30阅读(梦断代码) 
 3/2008:0012:0040 200听课(软件工程、操作系统)课间休息 
 14:3015:4010 60编写程序(升级版四则运算)休息、问题 
 21:0021:30 30 阅读(梦断代码)  

3、缺陷记录日志

学生:胡亚宝                                                                日期:3/20

教员:王建民                                                                程序号:02

日期编号类型   引入阶段排除阶段修复阶段修复缺陷
3/19 1 001 设计编译 20min 
描述:判断语句位置错误
 002 编码 编译1min  
描述:使用数组之前没有定义
 3/20 3003 设计编译 5min  
描述:计算数值的算式位置放错

转载于:https://www.cnblogs.com/huyabaoboke/p/4351379.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值