一、题目要求: 对系统提出新的要求: 1.题目避免重复; 2.可定制;(数量/打印方式) 3.可控制下列参数: 是否有乘除法; 是否有括号; 数值范围; 加减有无负数; 除法有无余数; 二、设计思路: 1.首先在实验一的基础上加上新的要求,题目的设计思路同实验一的类似。 2.通过选择来实现题目要求中的的限定(choose_a…….choose_e); 3.题目避免重复,输入时m,n的值相差较大来实现的; 4.输出形式是txt输出还dos输出,通过选择来实现,只要定义输出流就可以实现代码是一样的,dos输出语句是cout,txt输出语句是outfile; 5.实验二是通过数组来实现每组式的数组的输出,数组arrar_a[],array_b[]来控制数的输出其中我是将数组array_a和array_b看做为一组数,所以我的程序每组只能出现偶数个数字; a>对有无乘除法的要求比较简单,只要实现运算符选择就可以; b>有无负数:判断(do…while)出有无负数只要控制每组数的第一个数大于第二个数就可以,每组数之间的运算符只可以选择+/; c>有无括号:只能实现一个括号的出现,每组数可以随机出现多个符号但是不可以实现括间的嵌套,只要随机出现左括,就必须出现右括号,右括号的出现也是随机 d>数值范围,只要在随机区间定义两个变量(m,n)输入,就可以控制; e>除法有无余数:如果满足没有余数每组数随机输出是加条件限制判断输出的是否为整数,否则重新产生,同样array_a[i]array_b[i]与array_a[i+1]array_b[i+1]之的输出符号不能有负数; 6.最后也是通过for()循环来实现输出题目的数量(数量是可以自己随机输入的;) 三、代码: //信1301-2 20133056 吕兰兰 3月12 //对系统提出新的要求:1.题目避免重复;2.可定制;(数量/打印方式)3.可控制下列参数: 是否有乘除法;是否有括号; 数值范围;加减有无负数;除法有无余数; #include<iostream> #include<ctime> #include<fstream> using namespace std; int main() { ofstream outfile("software.txt",ios::binary); int N;//定义输出的计算题的数目 int m,n;//控制数字的范围 cout<<"Input the scope(m>100,50>n>0):"; cin>>m; cin>>n; //输出不正确则退出 if(m<n) { exit(0); } if(n==0) { exit(0); } cout<<"Input the number of a array:"; cin>>N; int i,j;//控制循环次数 int figure=0;//控制右括号的输出 int array_a[10],array_b[10],array_c[10];//控制输入的每组式子中的数字个数 int random_a,random_b,random_c; int choose_a,choose_b,choose_c,choose_d,choose_e;//满足的每个条件 srand(time(0)); cout<<"Please choose the way of output(0 TXT,1 DOS):"; cin>>choose_e; cout<<"The bracket(0 NO,1 YES):"; cin>>choose_d; cout<<"The method of residual(0 NO,1 YES):"; cin>>choose_a; cout<<"The negative(0 NO,1 YES):"; cin>>choose_b; cout<<"The remainder(0 NO,1 YES):"; cin>>choose_c; if(choose_e==1)//选择输出形式文件输出或是DOS 输出 { for(int i=0;i<N;i++) { for(int j=0;j<5;j++)//每组输出的数量 { array_a[j]=rand()%m+n;//随机产生的数字 array_b[j]=rand()%m+n; if(choose_b==0)//如果没有负数 { if(array_a[j]<array_b[j])//使每组array_a中的数对应都比array_b中的数都大; { int min; min=array_a[j]; array_a[j]=array_b[j]; array_b[j]=min; } } } random_a=rand()%5+1;//每组数随机产生的数字个数,循环random_a-1次; for(int j=0;j<random_a;j++)//控制输出的组数 { if(choose_d==1)//如果有括号 { random_c=rand()%2+1;//随机产生左括号 switch(random_c) { case 1:break; case 2:{cout<<"(";figure=1;}break; } } cout<<array_a[j];//输出每组array_a中的数 if(choose_a==0)//如果没有乘除法 { random_b=rand()%2+1;//随机选择输出的只有两种运算符 } else//如果有运算符随机产生的运算符有四种 { random_b=rand()%4+1;//随机产生运算符 } switch(random_b) { case 1:cout<<"+";break; case 2:cout<<"-";break; case 3: { if(choose_b==1)//结果可以为负数 { cout<<"*";break; } else { cout<<"/"; if(choose_c==0)//如果没有余数就重新产生数组中的数,直到满足条件余数不为0为止 { int remainder; remainder=array_a[j]%array_b[j]; do { array_b[j]=rand()%m+n; remainder=array_a[j]%array_b[j]; }while(remainder!=0); } break; } } case 4: { if(choose_c==0)//如果没有余数就重新产生数组中的数,直到满足条件余数不为0为止 { int remainder; remainder=array_a[j]%array_b[j]; do { array_b[j]=rand()%m+n; remainder=array_a[j]%array_b[j]; }while(remainder!=0); cout<<"/"; } else { cout<<"/"; } break; } } cout<<array_b[j]; random_c=rand()%random_a+1;//随机输出右括号 if((figure==1)&&(j==random_c)) { cout<<")"; figure=0; } if(figure==1) { cout<<")"; figure=0; } if(j!=(random_a-1))//程序运行到倒数第二组数为止,最后一组数后不用再输出运算符 { if(choose_a==0)//没有乘除法 { if(choose_b==0)//没有负数 { cout<<"+"; } else { random_c=rand()%2+1; switch(random_c) { case 1:cout<<"+";break; case 2:cout<<"-";break; } } } else { if(choose_c==0)//没有余数 { if(choose_b==1)//没有余数,有负数 { random_c=rand()%3+1; switch(random_c) { case 1:cout<<"+";break; case 2:cout<<"-";break; case 3:cout<<"*";break; } } else//没有余数,没有负数 { cout<<"+"; } } else//有余数 { if(choose_b==0)//没有负数 { random_c=rand()%2+1; switch(random_c) { case 1:cout<<"+";break; case 2:cout<<"/";break; } } else//有负数 { random_c=rand()%3+1; switch(random_c) { case 1:cout<<"+";break; case 2:cout<<"*";break; case 3:cout<<"/";break; } } } } } } cout<<"="<<endl<<endl; } } else { if(!outfile)//如果文件不能打开 { cerr<<"open error!"<<endl; exit(0); } //输出到文件中 else { for(int i=0;i<N;i++)//输出到文件中输出数量 { for(int j=0;j<5;j++)//每组的个数 { array_a[j]=rand()%m+n; array_b[j]=rand()%m+n; if(choose_b==0)//结果没有负数 { if(array_a[j]<array_b[j])//使每组array_a中的数对应都比array_b中的数都大; { int min; min=array_a[j]; array_a[j]=array_b[j]; array_b[j]=min; } } } random_a=rand()%5+1;//每组数随机产生的数字个数,循环random_a-1次; for(int j=0;j<random_a;j++)//控制输出的组数 { if(choose_d==1)//有括号 { random_c=rand()%2+1; switch(random_c) { case 1:break; case 2:{outfile<<"(";figure=1;}break; } } outfile<<array_a[j];//输出每组array_a中的数 if(choose_a==0)//没有乘除运算 { random_b=rand()%2+1; } else//有乘除运算 { random_b=rand()%4+1;//随机产生运算符 } switch(random_b) { case 1:outfile<<"+";break; case 2:{outfile<<"-";}break; case 3: { if(choose_b==1) { outfile<<"*";break; } else { outfile<<"/"; if(choose_c==0)//如果没有余数就重新产生数组中的数,直到满足条件余数不为0为止 { int remainder; remainder=array_a[j]%array_b[j]; do { array_b[j]=rand()%m+n; remainder=array_a[j]%array_b[j]; }while(remainder!=0); } } }break; case 4: { if(choose_c==0)//如果没有余数就重新产生数组中的数,直到满足条件余数不为0为止 { int remainder; remainder=array_a[j]%array_b[j]; do { array_b[j]=rand()%m+n; remainder=array_a[j]%array_b[j]; }while(remainder!=0); outfile<<"/"; } else { outfile<<"/"; } }break; } outfile<<array_b[j]; random_c=rand()%random_a+1;//输出右括号 if((figure==1)&&(j==random_c)) { outfile<<")"; figure=0; } if(figure==1) { outfile<<")"; figure=0; } if(j!=(random_a-1))//程序运行到倒数第二组数为止,最后一组数后不用再输出运算符 { if(choose_a==0)//没有乘除法 { if(choose_b==0)//没有负数 { outfile<<"+"; } else { random_c=rand()%2+1; switch(random_c) { case 1:outfile<<"+";break; case 2:outfile<<"-";break; } } } else { if(choose_c==0)//没有余数 { if(choose_b==1)//没有余数,有负数 { random_c=rand()%3+1; switch(random_c) { case 1:outfile<<"+";break; case 2:outfile<<"-";break; case 3:outfile<<"*";break; } } else//没有余数,没有负数 { outfile<<"+"; } } else//有余数 { if(choose_b==0)//没有负数 { random_c=rand()%3+1; switch(random_c) { case 1:outfile<<"+";break; case 2:outfile<<"*";break; case 3:outfile<<"/";break; } } else//有负数 { random_c=rand()%3+1; switch(random_c) { case 1:outfile<<"+";break; case 2:outfile<<"*";break; case 3:outfile<<"/";break; } } } } } } outfile<<"= "; outfile<<" "; } } } } 四、用时: 程序开始时打算用时12个小时,但实际花费的时间17个小时,一直增删改查。 五、体会: 好累啊!!!!我们宿舍每天编程序到晚上12点多,呜呜…..真累。这次程序的要求提高了很多很多,开始思路一直没有,一直在找思路,后来发现数组和子函数可以实现这个要求,我的程序没有用到子函数,就在一个函数中写的,新的收获就是知道了输出流怎么使用;别的程序代码也是用的if….else语句还有for循环,do…while语句,和switch…case语句,主要是程序的嵌套,以及一些细节,这次编程吃了很多这方面的亏,比如break被遗忘;if()括号中要是有多个运算时要加括号不然程序会进入死循环;if….else语句要成对出现,在输出到文件时开始只能输出几个,不能全部输出到文件,经过n个小时的查找发现else 语句遗忘; 习惯很重要,以后要谨记!!
项目计划日志(单位:h):
听课 |
编写程序 |
阅读相关书籍 |
网上查找资料 |
日总计 |
|
周一 |
2 |
0 |
1 |
0 |
3 |
周二 |
0 |
0 |
1 |
0 |
1 |
周三 |
0 |
3 |
0 |
0 |
3 |
周四 |
2 |
5 |
1 |
1 |
9 |
周五 |
0 |
9 |
1 |
1 |
11 |
周六 |
0 |
3 |
0 |
1 |
4 |
周日 |
|||||
周总计 |
4 |
20 |
4 |
3 |
31 |
时间记录日志:(单位:min):
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
星期一 |
14:00 |
15:50 |
10 |
100 |
听课 |
软件工程 |
21:00 |
22:00 |
0 |
60 |
看书 |
构建之法 |
|
星期二 |
19:00 |
20:00 |
0 |
60 |
看书 |
C++ |
星期三 |
14:30 |
17:30 |
0 |
180 |
编程 |
四则运算2 |
星期四 |
19:00 |
00:30 |
0 |
330 |
编程 |
四则运算2 和阅读C++ |
星期五 |
15:00 |
23:00 |
60 |
420 |
编程 |
四则运算2 |
星期六 |
14:00 |
15:00 |
60 |
120 |
编程和写博客 |
四则运算2 |