(一)设计思路
设计要求:
1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数:是否有乘除法、数值范围、加减有无负数、除法有无余数
设计思路:
1.用数组对每次产生的结果进行存储,将下一个运算产生式与前面的所有产生式进行比对,如果重复则重新产生新的产生式,直至达到要求;
2.由用户自行输入所要题目的份数,打印方式自行设定(每行有1/2/3/4/5个运算式);
3.控制参数:
(1)数值范围根据用户需求,自己设定;
(2)进行是否有乘除法的选择,提醒用户1或2代表有或无乘除法进行选择(if条件判断);
(3)当有乘除法参与运算时,用if判断题目中有无余数产生的运算式;注意除法运算中除数不能为0,当除数等于0时,应继续随机产生除数,
直至除数不为0;
(4)有无负数类似于(1)(2),用if条件判断进行判断;
(5)在设定数值范围后,产生随机数时,范围应+1,例如,随机产生一个0-100的随机数,代码为:a=rand()%(100+1),否则随机数的范围
缺最大值100。
(二)程序源代码
1 // ruanjian2.cpp : Defines the entry point for the console application. 2 // 3 4 5 #include "stdafx.h" 6 #include <iostream> 7 #include <math.h> 8 #include <time.h> 9 using namespace std; 10 11 void display1(int k,int x,int y,int m,int shuzhi) //含有加减乘除法 12 { 13 if(m==0) 14 cout<<"("<<k<<")"<<x<<" + "<<y<<" = "<<" "; 15 if(m==1) 16 cout<<"("<<k<<")"<<x<<" - "<<y<<" = "<<" "; 17 if(m==2) 18 cout<<"("<<k<<")"<<x<<" x "<<y<<" = "<<" "; 19 if(m==3) 20 { 21 if(y==0) 22 { 23 do 24 { 25 while(y!=0) 26 { 27 y=rand()%(shuzhi+1); 28 } 29 }while( y==0 ); 30 } 31 else 32 { 33 cout<<"("<<k<<")"<<x<<" / "<<y<<" = "<<" "; 34 } 35 } 36 } 37 38 void display2(int k,int x,int y,int m,int shuzhi) //含有加减 39 { 40 if(m==0) 41 cout<<"("<<k<<")"<<x<<" + "<<y<<" = "<<" "; 42 if(m==1) 43 cout<<"("<<k<<")"<<x<<" - "<<y<<" = "<<" "; 44 } 45 int main() 46 { 47 int number; //number表示订制的题的份数 48 int xuanze; //xuanze用来做判断是否有乘除法,0表示无,1表示有 49 int shuzhi; //shuzhi表示参与运算的数值范围,比如0-100等 50 int fushu; //fushu表示运算结果是否存在负数的情况,0表示无,1表示有 51 //在自然数中,只有减法结果可能有负数存在 52 int yushu; //fushu表示运算结果有无余数,0表示无,1表示有 53 int geshu; //geshu表示每行打印的运算式的个数 54 55 int a[30],b[30],m1[30],m2[30]; 56 srand( (unsigned)time( NULL ) ); 57 58 cout<<endl; 59 cout<<" $ 欢迎来到答题订制系统 $"<<endl; 60 cout<<endl; 61 cout<<" 在负数和余数的判断时,0表示无,1表示有,其他数值则默认为1"<<endl; 62 cout<<"Start:"<<endl; 63 cout<<" 请输入订制的份数:"; 64 cin>>number; 65 cout<<endl; 66 67 cout<<" 请输入数值范围:0-"; 68 cin>>shuzhi; 69 cout<<endl; 70 71 72 73 74 for(int k=1;k<=number;k++) 75 { 76 cout<<"-----------------------------------------------------------------------------"<<endl; 77 cout<<endl; 78 cout<<"第"<<k<<"份题如下:"<<endl; 79 cout<<"*****************************************************************************"<<endl; 80 cout<<endl; 81 cout<<" 是否含有乘除法(0表示无,1表示有),请选择: "<<endl; 82 cout<<endl; 83 cout<<" 请输入每行打印的个数(1|2|3|4|5):"<<endl; 84 cout<<endl; 85 cout<<"*****************************************************************************"<<endl; 86 87 cout<<endl; 88 cout<<"每行的个数:"; 89 cin>>geshu; 90 cout<<endl; 91 92 cout<<"我的选择:"; 93 cin>>xuanze; 94 cout<<endl; 95 96 if(xuanze==1) 97 { 98 cout<<"*****************************************************************************"<<endl; 99 cout<<endl; 100 cout<<" 1 是否含可能有负数的结果(0表示无,1表示有),请输入你的选择:"<<endl; 101 cout<<endl; 102 cout<<endl; 103 cout<<" 2 是否含可能有余数的结果(0表示无,1表示有),请输入你的选择:"<<endl; 104 cout<<endl; 105 cout<<"*****************************************************************************"<<endl; 106 cout<<endl; 107 cout<<"对1的选择(0/1):"; 108 cin>>fushu; 109 cout<<endl; 110 111 cout<<"对2的选择(0/1):"; 112 cin>>yushu; 113 cout<<endl; 114 115 cout<<"-----------------------------------------------------------------------------"<<endl; 116 cout<<endl; 117 for(int i=1;i<=30;i++) 118 { 119 a[i]=rand()%(shuzhi+1); 120 b[i]=rand()%(shuzhi+1); 121 m1[i]=rand()%4; 122 123 for(int j=1;j<=i-1;j++) 124 { 125 if(a[i]==a[j]&&b[i]==b[j]&&m1[i]==m1[j]) 126 { 127 do 128 { 129 a[i]=rand()%(shuzhi+1); 130 b[i]=rand()%(shuzhi+1); 131 }while(a[i]==a[j]&&b[i]==b[j]&&m1[i]==m1[j]); 132 } 133 } 134 if((fushu==1&&m1[i]==1)||(yushu==1&&m1[i]==3)) 135 { 136 display1(i,a[i],b[i],m1[i],shuzhi); 137 } 138 else if(yushu==0&&m1[i]==3) 139 { 140 if(a[i]%b[i]==0) 141 { 142 display1(i,a[i],b[i],m1[i],shuzhi); 143 } 144 else 145 { 146 do 147 { 148 a[i]=rand()%(shuzhi+1); 149 b[i]=rand()%(shuzhi+1); 150 while(b[i] == 0) 151 { 152 b[i]=rand()%(shuzhi+1); 153 } 154 }while( a[i]%b[i]!=0 ); 155 display1(i,a[i],b[i],m1[i],shuzhi); 156 } 157 } 158 else if(fushu==0&&m1[i]==1) 159 { 160 if(a[i]>=b[i]) 161 { 162 display1(i,a[i],b[i],m1[i],shuzhi); 163 } 164 else 165 { 166 do 167 { 168 a[i]=rand()%(shuzhi+1); 169 b[i]=rand()%(shuzhi+1); 170 }while(a[i]<b[i]); 171 display1(i,a[i],b[i],m1[i],shuzhi); 172 } 173 } 174 else 175 { 176 display1(i,a[i],b[i],m1[i],shuzhi); 177 } 178 if(i%geshu==0) 179 { 180 cout<<endl; 181 } 182 if(i==30) 183 { 184 cout<<endl; 185 } 186 } 187 } 188 else if(xuanze==0) //没有乘除法存在,只需要判断有无负数结果产生 189 { 190 cout<<"*****************************************************************************"<<endl; 191 cout<<endl; 192 cout<<" 是否含可能有负数的结果(0表示无,1表示有),请输入你的选择:"<<endl; 193 cout<<endl; 194 cout<<"*****************************************************************************"<<endl; 195 cout<<endl; 196 cout<<"我的选择:"; 197 cin>>fushu; 198 199 cout<<"-----------------------------------------------------------------------------"<<endl; 200 cout<<endl; 201 for(int i=1;i<=30;i++) 202 { 203 a[i]=rand()%(shuzhi+1); 204 b[i]=rand()%(shuzhi+1); 205 m2[i]=rand()%2; 206 207 for(int j=1;j<=i-1;j++) 208 { 209 if(a[i]==a[j]&&b[i]==b[j]&&m2[i]==m2[j]) 210 { 211 do 212 { 213 a[i]=rand()%(shuzhi+1); 214 b[i]=rand()%(shuzhi+1); 215 }while(a[i]==a[j]&&b[i]==b[j]&&m2[i]==m2[j]); 216 } 217 } 218 if(fushu==0) 219 { 220 if(a[i]>=b[i]) 221 { 222 display2(i,a[i],b[i],m2[i],shuzhi); 223 } 224 else //当没有负数结果时,应是a>=b,条件不满足时,则系统再随机生成俩随机数,条件满足时进行输出 225 { 226 do 227 { 228 a[i]=rand()%(shuzhi+1); 229 b[i]=rand()%(shuzhi+1); 230 }while(a[i]<b[i]); 231 display2(i,a[i],b[i],m2[i],shuzhi); 232 } 233 } 234 else 235 { 236 display2(i,a[i],b[i],m2[i],shuzhi); 237 } 238 if(i%geshu==0) 239 { 240 cout<<endl; 241 } 242 if(i==30) 243 { 244 cout<<endl; 245 } 246 } 247 } 248 else 249 { 250 cout<<"*****************************************************************************"<<endl; 251 cout<<endl; 252 cout<<" 输入错误,请重新输入!"<<endl; 253 cout<<endl; 254 cout<<"*****************************************************************************"<<endl; 255 cout<<endl; 256 k=k-1; 257 } 258 cout<<"-----------------------------------------------------------------------------"<<endl; 259 cout<<endl; 260 cout<<"--------------$----------------$---------------$--------------$--------------"<<endl; 261 } 262 cout<<endl; 263 cout<<" $ 感谢您使用答题订制系统,欢迎下次再来 $"<<endl; 264 cout<<endl; 265 266 return 0; 267 }
(三)结果截图
(四)总结与心得体会
我的程序实现的功能为:避免重复、自己选择打印数量、自己选择打印的方式、自己确定数值范围、有无乘除法、结果是否有余数、结果是否有负数。在做本次项目的过程中,从开始的设计思路到代码的编写以及程序的调试,我花了不少的时间,从中学习到了很多的东西。
当我们拿到一个题目,首先要做的不是立马新建一个工程,打开工作空间就开始敲代码,而是先在自己的大脑做一个构思,想清楚、整理明白应如何下手,从哪里入手;其次,当我们觉得对这个项目真的一点思路都没有的时候,我们应该学会分块处理,分成一个个小模块,当把这些小模块弄好后,结合起来就是所要的结果;最后,当我们遇到问题时,一定要保持冷静的头脑,更不要轻言放弃,相信自己经过冷静的思考与理智的行为就一定能解决问题。
另外,我还注意到一个好的编程习惯所带来的好处,当代码过长时,好的编程习惯就能帮助我们很容易找出出错或者我们想要找到的位置。
(五)项目总结及相关记录表
一、项目计划总结:
表1 周活动总结表
姓名:黄亚萍 日期:2015.03.15
日期/任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
做表格 |
日总计 |
|
周二 3.10 |
90 |
||||||
周三 3.11 |
89 |
89 |
|||||
周四 |
241 |
241 |
|||||
周五 |
90 |
369 |
459 |
||||
周六 |
150 |
150 |
|||||
周日 3.15 |
|||||||
周总计 |
180 |
760 |
89 |
1029 |
阶段时间和效率 周数(上一次周活动总结表的周数+1):1
不包括上一周在内的累计时间
总计 |
|||||||
平均 |
|||||||
最大 |
|||||||
最小 |
以前个周的累计时间
总计 |
|||||||
平均 |
|||||||
最大 |
|||||||
最小 |
二、时间记录日志:
表2 时间记录日志
学生 黄亚萍 日期 2015.03.10
教师 王建民 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/10 |
||||||
3/11 |
16:04 |
18:05 |
32 |
89 |
作表格,查资料 |
制作记录表格,查资料 |
3/12 |
19:24 |
23:37 |
12 |
241 |
编程 |
编程,休息 |
3/13 |
15:23 |
19:30 |
30 |
217 |
编程 |
编程,吃饭 |
20:03 |
22:37 |
152 |
调试程序 |
|||
3/14 |
9:15 |
11:02 |
107 |
调试程序 |
||
11:52 |
12:35 |
43 |
完善界面 |
吃饭,完善界面 |
||
3/15 |
三、缺陷记录日志:
表3 缺陷记录日志
学 生 黄亚萍
日 期 2015.03.10
教 员 王建民
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3/10 |
||||||
3/11 |
||||||
描述: |
||||||
3/12 |
逻辑错误 |
编辑代码 |
代码编辑 |
|||
描述:在除法运算中,除数不等于0,当除数等于0时,重新生成随机数 |
||||||
3/13 |
算法错误 |
调试程序 |
调试 |
267 |
||
描述:对满足结果有无余数和负数的情况分开来讨论 |
||||||
3/14 |
算法错误 |
调试程序 |
调试 |
92 |
||
描述:用数组完成避免重复,注意比较的过程,对重复的处理 |
||||||
3/15 |
||||||
描述: |