一、升级要求:让程序能接受用户输入答案,并判定对错。最后给出总共对/错的数量。
二、设计思想:
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/
工作照: