一、设计思想
1、避免重复:输出时,确定了运算符号,两个运算数都相同时,重新随机产生操作数,再循环重新产生式子。
2、可定制:设计菜单,可选择数目,也可进行下列各项的选择。
3、是否有乘除法:菜单中选择了有乘除法,则无需修改;无乘除法,则随机产生的运算符号中就去除产生乘除的数字的可能。
4、是否有括号:如果选择了有括号的,可像运算符号那样,产生1-2随机数,根据随机数产生左右括号。
5、数值范围:在菜单中可选择是50以内、100以内等的选项,可在产生随机数中确定两个运算数的范围。
6、加减有无负数:若选择有负数,则无需修改;若选择无负数,则当运算符号为减号时,要判断第一个运算数是否比第二个大,是,则可以,否则,交换两个数。
7、除法有无余数:可以有余数,则无需修改;要求无余数,则进行除法时,计算结果,若有余数,重新产生,用循环进行。
8、是否支持分数:若不支持分数,则无需修改;若支持分数在产生运算数时,多加1-2个参数,用来作为分数的分子/分母。
9、是否支持小数:若不支持小数,则无需修改;若支持小数,则可增加参数,用来最为小数和小数点的确定。
二、源代码
1 //信1301-2班——胡金辉 随机生成四则运算题目 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、项目计划日志:
周活动总结表
姓名:胡金辉 日期:2016/3/11
日期任务 |
听课 |
编写程序 |
阅读书本 |
考研复习 |
|
日总计 |
周日 |
|
|
|
|
|
|
周一 |
|
|
|
|
|
|
周二 |
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/11
教师:王建民 课程: PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/7 |
08:00 |
12:00 |
40 |
200 |
听课 |
课间休息 |
|
14:30 |
15:30 |
|
60 |
读书 |
|
|
16:10 |
18:00 |
10 |
100 |
听课 |
课间休息 |
|
19:30 |
21:00 |
30 |
60 |
编写程序 |
|
3/8 |
08:00 |
09:50 |
10 |
100 |
听课 |
课间休息 |
|
10:00 |
11:10 |
10 |
60 |
考研复习 |
|
|
16:10 |
16:35 |
|
25 |
编写程序 |
|
|
21:00 |
21:40 |
|
40 |
读书 |
|
3/9 |
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/10 |
08:00 |
12:00 |
40 |
200 |
听课 |
课间休息 |
|
14:30 |
15:00 |
|
30 |
编写程序 |
|
3、缺陷记录日志:
学生:胡金辉 日期:3/11
教员:王建民 程序号:01
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复阶段 |
修复缺陷 |
3/7 |
1 |
001 |
设计 |
编译 |
10min |
|
描述:设计程序时调用函数传参错误 |
||||||
|
2 |
002 |
设计 |
编译 |
1min |
|
描述:使用了某一函数没有它的头文件 |
||||||
3/8 |
3 |
003 |
编码 |
调试 |
5min |
|
描述:使用do while循环时结构用错 |
||||||
3/9 |
4 |
004 |
编码 |
编译 |
1min |
|
描述: 使用scanf输入时漏掉了“&” |
||||||
|
5 |
005 |
编码 |
编译 |
1min |
|
描述:使用某一变量没有提前声明 |
||||||
|
6 |
006 |
编码 |
编译 |
2min |
|
描述:使用数组时 ,整个数组和数组中某一元素弄混,导致出错 |
||||||
|
7 |
004 |
编码 |
编译 |
1min |
|
描述:使用scanf输入时漏掉了“&” |
||||||
3/10 |
8 |
007 |
编码 |
编译 |
1min |
|
描述:判断条件的等于应该是“==”,而我错用了“=” |