#include<iostream> #define N 100 using namespace std;
struct fenshu {int x;int y;int z;};
int gongyueshu(int a,int b) { int c=a; while(b!=0) { c=a%b; a=b; b=c; } return a; } int main() { cout<<"直接生成的是支持假分数、支持正负、支持加减乘除、范围在0-225之间无重复的题"<<endl; cout<<endl<<"请输入题量及每行题数:"<<endl; int sum,col,fuhao[N]; cin>>sum>>col; int a,b,c;
fenshu fir[N],sec[N]; for(int i=0;i<sum;i++) { a=rand()%100; while(a==0) {a=rand()%100;} b=rand()%100; while(b==0) {b=rand()%100;} if(b>a) {c=a;a=b;b=c;} c=rand()%256; int yueshu; yueshu=gongyueshu(a,b); fir[i].x=b/yueshu; fir[i].y=a/yueshu; if(rand()%2==1) fir[i].z=c*(-1); else fir[i].z=c; fuhao[i]=rand()%4; } for(int i=0;i<sum;i++) { a=rand()%100; while(a==0) {a=rand()%100;} b=rand()%100; while(b==0) {b=rand()%100;} if(b>a) {c=a;a=b;b=c;} c=rand()%255; int yueshu; yueshu=gongyueshu(a,b); sec[i].x=b/yueshu; sec[i].y=a/yueshu; if(rand()%2==1) sec[i].z=c*(-1); else sec[i].z=c; for(int j=0;j<i;j++) { if(fuhao[j]==fuhao[i]) { if(fir[j].x==sec[j].x&&fir[j].y==sec[j].y&&fir[j].z==sec[j].z) {i--;continue;} } } } for(int i=0;i<sum;i++) { cout<<"("<<fir[i].z<<" "<<fir[i].x<<"/"<<fir[i].y<<") "; if(fuhao[i]==0) cout<<"+ "; if(fuhao[i]==1) cout<<"- "; if(fuhao[i]==2) cout<<"* "; if(fuhao[i]==3) cout<<"/ "; cout<<"("<<sec[i].z<<" "<<sec[i].x<<"/"<<sec[i].y<<") "; if((i+1)%col==0) cout<<endl; }
}
本来是想写成按照选择的条件生成运算题的,但是越想越晕,感觉有好多参数,写着写着自己就不知道什么参数代表什么了,干脆就全部删了,写了直接生成能控制打印方式,避免重复,支持分数,支持加减乘除且有范围的程序。
跟当初的设想差距不大。
(1)创建了struct fenshu来存放分数的整数部分、分子和分母,并控制分母不能为0,还创建函数公约数来将分子分母化成最简形式。
(2)符号是存在正想数组中的整数,控制输出就可以了。
(3)避免重复是每当生成一个算式就按照生成的运算符号判断,如果符号一样就判断生成的两个数是不是一样,一样则重新生成。
(4)生成正负号通过随机生成0和1控制是否乘以-1
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/13 |
11:30 |
12:00 |
0 |
30 |
设置程序的布局和思路 |
|
3/18 |
14:00 |
18:00 |
10 |
240 |
重新构思编程修改 |
|
3/19 |
17:00 |
18:00 |
50 |
10 |
实验截图,上传博客 |