软件工程课堂作业(二)续——升级完整版随机产生四则运算题目(C++)

一、设计思想:

      1、根据题目新设要求,我将它们分为两类:一类是用户输入数目,根据这个数目改变一系列后续问题;另一类是用户输入0或1,分情况解决问题。

      2、针对这两类要求,具体设计思路已在上篇博文中写出。有改动的地方:

          ①避免重复之前想的解决办法是比较,相同则重新产生,这样比较繁琐。经过上网查和询问同学,学到了一个函数,将问题解决了;

          ②是否有括号的问题,可用switch结构,分情况输出即可;

          ③分数和小数问题根本上是一个问题,在这里只说明一个,可以另设两个参数,随机生成作为小数部分,再输出即可;

          ④该程序有很多地方需要用户输入数值,有时会输入不符合逻辑的数,针对这个问题,我在每一次需要用户输入的地方都加了一个while循环语句,若不符合条件则需要重新输入。

二、源代码:

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

三、运行结果:

四、心得体会:

      1、编程过程中,一些基础的内容经常弄错、遗漏,比如输入、函数的定义等,需要练习加以巩固;

      2、开始我想的是将每一个新设功能写一个函数,再用主函数调用,但是真正编写的时候,由于功能之间有交叉,这样变量的引用和调用就出现了问题,最后我将它们都写到主函数中,各个参数都一次声明。这样的优点是编程方便、调用简单,缺点是不够清晰明了,当程序再大一些的时候非常不方便,以后需要找到别的方法去解决这个问题;

      3、我用的语言是C++,它的界面不如C#美观、友好,但是编程简单、方便。

五、PSP0级相关日志

1、项目计划日志:

周活动总结表

姓名:胡亚宝                                                            日期:2015/3/13

日期\任务听课    编写程序阅读书本考研复习 日总计  
周日      
周一      
周二3006060  420
周三100254060 225
周四20021030  440
周五200 30   230
周六      
周总结 800325 130 60  1315 

阶段时间和效率                                                                        周数:1

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

总计                    
平均     
最大     
最小     

以前各周的累计时间                                                                             

总计800 325   13060 1315 
平均800    325  130  60    1315    
最大800325 130 60 1315 
最小800 325130 601315 

2、时间记录日志:

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

          教师:王建民                                                                      课程: PSP          

日期开始时间结束时间中断时间净时间活动备注
3/1008:0012:0040200听课(软件工程、操作系统)课间休息
 14:3015:30 60读书(梦断代码) 
 16:1018:0010100听课(Windows高级编程)课间休息
 19:3021:003060编写程序(升级版四则运算) 
3/1108:0009:5010100听课(计算机网络)课间休息
 10:0011:101060考研复习 
 16:1016:35 25编写程序(升级版四则运算) 
 21:0021:40 40读书(梦断代码) 
3/1209:0009:50 50编写程序(升级版四则运算) 
 10:1012:0010100听课(计算机接口技术)课间休息
 14:0015:5010100听课(嵌入式开发技术)课间休息
 16:1019:5060160编写程序(升级版四则运算)吃饭
 20:3021:00 30读书(梦断代码) 
3/1308:0012:0040200听课(软件工程、操作系统)课间休息
 14:3015:00  30编写程序(升级版四则运算) 

 3、缺陷记录日志:

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

教员:王建民                                                                         程序号:01

日期编号类型   引入阶段排除阶段修复阶段修复缺陷
3/10 1 001 设计编译 10min 
描述:设计程序时调用函数传参错误
 002 设计  编译1min  
描述:使用了某一函数没有它的头文件
 3/11 3003 编码 调试 5min  
描述:使用do while循环时结构用错
 3/12004 编码 编译 1min 
描述: 使用scanf输入时漏掉了“&”
   5 005编码 编译 1min  
描述:使用某一变量没有提前声明      
   6 006编码 编译 2min  
描述:使用数组时 ,整个数组和数组中某一元素弄混,导致出错     
   7 004编码 编译 1min 
描述:使用scanf输入时漏掉了“&”      
  3/13 8007 编码 编译 1min 
描述:判断条件的等于应该是“==”,而我错用了“=”

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值