四则运算2及psp0设计
随机生成运算式,要求:
1.题目避免重复。
2.可定制(数量/打印方式)。
3.可以控制一下参数。
要求:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数。
刚开始看到这样一个题目感觉还挺简单,于是从头开始,一步一步的编写代码。但是这次遇到了大麻烦。
我的基本思路是全部用数组来实现,基本是这样的:
1.随机产生num[i]个运算符数组,对应的ch[num[i]]里边放着相应的运算符,类型为string类型。
2.rand1[i][j]数组盛放随机生成参与运算的数,根据算式的形式,运算数要比运算符多一个,所以运算数个数为num[1]+1。
3.rand1[i][j]之所以是二维数组,是因为,每行表示一个式子,列数为参与运算的数的个数。
4.定义两个函数L(int w),R(int w),判断括号的输出,left和right,分别指左括号和右括号,随机输出左括号,参数w加1,当右括号随机输出时,判断是否有左括号,在有左括号的情况下才能输出右括号,而且一个括号不能只包含一个数。
5,.根据输入有无负数,将随机数范围改为了-39~+99之间,方法为rand()%139-99。
我的程序代码如下:
1 /*随即产生带有括号的30个式子 2 20133078_yulei*/ 3 #include <iostream> 4 #include <string> 5 #include <time.h>//用到了time函数 6 #define random(x)(rand()%x) 7 #define N 30 //预定产生30个 8 using namespace std; 9 void sort(int a[], int n) 10 { 11 int i,j,temp; 12 for (j=0;j<n-1;j++) 13 for (i=0;i<n-1-j;i++) 14 if(a[i]>a[i+1]) 15 { 16 temp=a[i]; 17 a[i]=a[i+1]; 18 a[i+1]=temp; 19 } 20 } 21 22 void L(int &w) 23 { 24 int q=rand()%100; 25 if(q%2==0) 26 { 27 cout<<"("; 28 w++; 29 } 30 31 } 32 void R(int &w) 33 { 34 int q=rand()%100; 35 if(q%7==0) 36 { 37 cout<<")"; 38 w--; 39 } 40 } 41 42 void main() 43 { 44 srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 45 int rand1[N][10]; //30个式子,每列最多10个数 46 int i=0,j=0,k=0,w=0; 47 string ch[N][10]={}; //运算符数组,最多允许10个 48 int num[N]; //每行式子的运算符的个数 49 int cc,ff,kk; 50 cout<<"***输入有无乘除法:(0无/1有):"; 51 cin>>cc; 52 cout<<"***输入有无负数:(0无/1有):"; 53 cin>>ff; 54 cout<<"***输入有无括号:(0无/1有):"; 55 cin>>kk; 56 for(i=0;i<N;i++) //每行参与运算的个数,不能为零 57 { 58 num[i]=rand()%9+1; 59 if(num[i]==0) 60 i--; 61 } 62 for(i=0;i<N;i++) 63 { 64 switch(cc) 65 { 66 case 0:{ 67 for (j=0;j<num[i];j++) //参与运算的运算符 68 { 69 int k=rand()%2; 70 switch(k%2) 71 { 72 case 0:ch[i][j]="+";break; 73 case 1:ch[i][j]="-";break; 74 } 75 } 76 }break; 77 case 1: 78 { 79 for (j=0;j<num[i];j++) //参与运算的运算符 80 { 81 int k=rand()%4; 82 switch(k%4) 83 { 84 case 0:ch[i][j]="+";break; 85 case 1:ch[i][j]="-";break; 86 case 2:ch[i][j]="*";break; 87 case 3:ch[i][j]="÷"; 88 } 89 } 90 } 91 } 92 93 } 94 95 switch(ff) 96 { 97 case 0: 98 { 99 for(i=0;i<N;i++) //产生参与运算的数 100 { 101 for (j=0;j<num[i]+1;j++) 102 { 103 rand1[i][j]=rand()%100; //参与运算的数据比运算符多1个 104 if(j!=0&&ch[i][j-1]=="/"&&rand1[i][j]==0) //除第一个数据外的其他数据前边是除法,则这个数不能为零 105 j=j-1; //回溯重新产生 106 } 107 }break; 108 } 109 case 1: 110 { 111 for(i=0;i<N;i++) //产生参与运算的数 112 { 113 for (j=0;j<num[i]+1;j++) 114 { 115 rand1[i][j]=rand()%139-39; //参与运算的数据比运算符多1个 116 if(j!=0&&ch[i][j-1]=="/"&&rand1[i][j]==0) //除第一个数据外的其他数据前边是除法,则这个数不能为零 117 j=j-1; //回溯重新产生 118 } 119 }break; 120 } 121 } 122 123 //数据有了,运算有了,剩下的就是将他们进行组合。 124 switch(kk) 125 { 126 case 1: 127 { 128 for(i=0;i<N;i++) 129 { 130 cout<<i+1<<"."; 131 int k=0; 132 for (j=0;j<num[i]+1;j++) 133 { 134 int p; 135 L(k); 136 if (k>0) 137 p=j; 138 if(rand1[i][j]<0) 139 cout<<"("<<rand1[i][j]<<")"; 140 else 141 cout<<rand1[i][j]; 142 if(k>0&&p!=j) 143 R(k); 144 cout<<ch[i][j]; 145 } 146 for(k;k!=0;) 147 { 148 R(k); 149 } 150 cout<<"= "<<endl; 151 152 }break; 153 } 154 case 0: 155 { 156 for(i=0;i<N;i++) 157 { 158 cout<<i+1<<"."; 159 int k=0; 160 for (j=0;j<num[i]+1;j++) 161 { 162 if(rand1[i][j]<0) 163 cout<<"("<<rand1[i][j]<<")"; 164 else 165 cout<<rand1[i][j]; 166 cout<<ch[i][j]; 167 } 168 cout<<"= "<<endl; 169 170 } 171 } 172 } 173 174 175 }
程序运行结果1:
运行结果2:
总结:
这次程序编写好不容易的,到最后程序仍然不完整,需要后续完善。这次的思路有点麻烦了,对于数组的操作很麻烦。导致后来一直进行修改bug,条件复杂,循环便捷很不好整,尤其是数组的下标。
项目计划总结:
日期\任务 | 听课 | 编写程序 | 查阅资料 | 日总计 |
星期一 | 2 | 1 | 3 | |
星期二 | 1 | 1 | ||
星期三 | 2 | 1 | 3 | |
星期四 | 2 | 2 | ||
星期五 | 2 | 1 | 3 | |
星期六 | 8 | 8 | ||
星期日 | ||||
周总计 | 4 | 13 | 3 |
20 |
时间记录日志:
日期 | 开始 | 结束 | 中断 | 总时间 | 具体活动 | 备注 |
3/7 | 14:00 | 15:50 | 30 | 110 | 听课 | 软件工程 |
16:30 | 17:30 | 20 | 130 | 查阅资料 | 查资料 | |
3/8 | 16:20 | 15:20 | 20 | 135 | 编写程序 | 编程 |
3/9 | 16:10 | 17:20 | 10 | 60 | 查阅资料 | 查资料 |
19:00 | 21:30 | 20 | 130 | 编写程序 | ||
3/10 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程 |
3/11 | 8:00 | 9:30 | 20 | 70 | 编程序 | |
15:00 | 16:30 | 20 | 70 | 找bug | ||
7:30 | 9:00 | 10 | 80 | 查资料,编程 | 看数据结构书寻找解决办法 | |
3/12 | 7:30 | 11:00 | 50 | 210 | 调试 | 最终调试 |
12:30 | 16:00 | 210 | 调试+博客 | 写博客 |
缺陷记录日志:
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间&问题描述 |
3/7 | ||||
3/8 | 1 | 编码 | 编译 | 随机数产生一样,然后将时间函数加上后,bug修复 |
3/9 | ||||
3/10 | 2 | 编码 | 编译 | 数组下标出界,内存溢出,通过计算修改了bug |
3/11 | 3 | 编码 | 编译 | 一个小时产生负数随机数和加括号 |
3/12 | 4 | 调试 | 修复 | 一天的时间,调试程序,实现有无负数,有无括号功能 |