软件工程课堂作业(二)续——升级完整版随机产生四则运算题目(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("---------------------------欢迎使用本系统打印题目!----------------------------
");
 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=		",x1,x2);break;
 93                 case 1:
 94                     x3=rand()%9+1;
 95                     x4=rand()%9+1;
 96                     printf("%d.%d+%d.%d=		",x1,x3,x2,x4);break;
 97                 }
 98                 break;
 99                 
100             case 1:
101                 switch(a[5])
102                 {
103                 case 0:printf("(%d+%d)=	",x1,x2);break;
104                 case 1:
105                     x3=rand()%9+1;
106                     x4=rand()%9+1;
107                     printf("(%d.%d+%d.%d)=	",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=		",x1,x2);break;
133                 case 1:
134                     x3=rand()%9+1;
135                     x4=rand()%9+1;
136                     printf("%d.%d-%d.%d=		",x1,x3,x2,x4);break;
137                 }
138                 break;
139                 
140             case 1:
141                 switch(a[5])
142                 {
143                 case 0:printf("(%d-%d)=	",x1,x2);break;
144                 case 1:
145                     x3=rand()%9+1;
146                     x4=rand()%9+1;
147                     printf("(%d.%d-%d.%d)=	",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=		",x1,x2);break;
159                 case 1:
160                     x3=rand()%9+1;
161                     x4=rand()%9+1;
162                     printf("%d.%d*%d.%d=		",x1,x3,x2,x4);break;
163                 }
164                 break;
165                 
166             case 1:
167                 switch(a[5])
168                 {
169                 case 0:printf("(%d*%d)=	",x1,x2);break;
170                 case 1:
171                     x3=rand()%9+1;
172                     x4=rand()%9+1;
173                     printf("(%d.%d*%d.%d)=	",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=		",x1,x2);break;
197                 case 1:
198                     x3=rand()%9+1;
199                     x4=rand()%9+1;
200                     printf("%d.%d/%d.%d=		",x1,x3,x2,x4);break;
201                 }
202                 break;
203                 
204             case 1:
205                 switch(a[5])
206                 {
207                 case 0:printf("(%d/%d)=	",x1,x2);break;
208                 case 1:
209                     x3=rand()%9+1;
210                     x4=rand()%9+1;
211                     printf("(%d.%d/%d.%d)=	",x1,x3,x2,x4);break;
212                 }
213                 break;
214             }
215         }
216     }
217 
218     printf("------------------------------出题完毕,欢迎再次使用!--------------------------
");
219 
220     return 0;
221 }

三、运行结果:

四、心得体会:

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

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

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

五、PSP0级相关日志

1、项目计划日志:

周活动总结表

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

日期任务 听课     编写程序 阅读书本 考研复习   日总计  
周日            
周一            
周二 300 60 60     420
周三 100 25 40 60   225
周四 200 210 30     440
周五 200  30       230
周六            
周总结  800 325  130  60    1315 

阶段时间和效率                                                                        周数:1

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

总计                         
平均          
最大          
最小          

以前各周的累计时间                                                                             

总计 800  325    130 60  1315 
平均 800     325   130   60     1315    
最大 800 325  130  60  1315 
最小 800  325 130  60 1315 

2、时间记录日志:

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

          教师:王建民                                                                      课程: PSP          

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/10 08:00 12:00 40 200 听课(软件工程、操作系统) 课间休息
  14:30 15:30   60 读书(梦断代码)  
  16:10 18:00 10 100 听课(Windows高级编程) 课间休息
  19:30 21:00 30 60 编写程序(升级版四则运算)  
3/11 08:00 09:50 10 100 听课(计算机网络) 课间休息
  10:00 11:10 10 60 考研复习  
  16:10 16:35   25 编写程序(升级版四则运算)  
  21:00 21:40   40 读书(梦断代码)  
3/12 09:00 09:50   50 编写程序(升级版四则运算)  
  10:10 12:00 10 100 听课(计算机接口技术) 课间休息
  14:00 15:50 10 100 听课(嵌入式开发技术) 课间休息
  16:10 19:50 60 160 编写程序(升级版四则运算) 吃饭
  20:30 21:00   30 读书(梦断代码)  
3/13 08:00 12:00 40 200 听课(软件工程、操作系统) 课间休息
  14:30 15:00    30 编写程序(升级版四则运算)  

 3、缺陷记录日志:

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

教员:王建民                                                                         程序号:01

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