四则运算2——设计思路
1.首先实现数量以及打印方式,只需要在输入的时候添加两个变量,一个控制循环的数量输出,一个控制每页打印的数量。
2.避免题目重复,只需要在结果输出的时候,添加判断,使得输出结果与直接的输出的结果对比,没有重复的就行,需要用数组记录。
3.是否有乘除法,只需在输出的时候控制对应乘除法序号的产生就可以了。
4.数值范围,用变量控制随机数的产生范围。
5.单独添加负数函数、分数函数。
四则运算2——代码
#include <iostream> #include <cmath> using namespace std; #define N 10000 void feifu(int page,int k); void fenshu(int page,int k); void fushu(int page,int k); int a[N],b[N],ch[N]={0},k1;//a[],b[]存储数字,ch[]存储运算法则 int geshu = 5; //每行打印多少个 int cmin,cmax;//数值范围的最小值,最大值 int num ; //题号 int jjcc[5],j; //jjcc用以记录加减乘法,j用来控制运算法则的循环 char sel; //选择是否随机产生数据 char str[5] = {' ','+','-','*','/'}; int x,y; //分母 //非负整数输出 void noout(int n,int &k) { cout << "(" << num++ << ")" << a[k] << " " << str[n] << " " << b[k] << " = "; k--; if ((k1 - k) % geshu == 0 ) cout << endl; } //负数输出 void fuout(int n,int &k) { cout << "(" << num++ << ")" << " -" << a[k] << " " << str[n] << " -" << b[k] << " = "; k--; if ((k1 - k) % geshu == 0 ) cout << endl; } //分数输出 void fenout(int n,int &k) { cout << "(" << num++ << ")" << a[k] << "/" << x << " " << str[n] << " " << b[k] << "/" << y << " = ";k--; if ((k1 - k) % geshu == 0 ) cout << endl; } ///保证题目不重复/// void jianyan(int &k) { for (int i = k1;i > k;i--) { if (a[i] == a[k] && b[i] == b[k] && ch[k] == ch[i]) { k++; continue; } } } //界面菜单 void mune(int &page, int &k) { cout << "请输入题卷份数:"; cin >> page; while (page <= 0) { cout << "输入错误,请重新输入题卷份数:"; cin >> page; } cout << "请输入数值范围(小的在前,用空格隔开):"; cin >> cmin >> cmax; while (cmin >= cmax || cmin < 0 || cmax < 0) { cout << "数值范围有问题,请重新输入:"; cin >> cmin >> cmax; } cout << "请输入每份题目数:" ; cin >> k; cout << "每行打印个数:"; cin >> geshu; } //运算选择 void yunsuan() { for (j = 0;j < 5;j++) jjcc[j] = 0; cout << "1: 加法运算 2:减法运算 3: 乘法运算 4:除法运算 " << endl; cout << "请输入序号(可多选,未选择时,默认随机产生,输入\"0\"结束)" << endl; cout << "请选择运算法则:"; for (j = 0;j < 5;j++) { cin >> jjcc[j]; if (jjcc[0] > 4 || jjcc[0] < 1) {
cout << "您未选择任何运算法则,将随机产生(Y/N):" ; cin >> sel; if (sel == 'Y'|| sel == 'y') { jjcc[0] = 1; jjcc[1] = 2; jjcc[2] = 3; jjcc[3] = 4; j = 4; break; } else { cout << "请选择运算法则:"; j = -1; continue; } } if (jjcc[j] > 4 || jjcc[j] < 0) { cout << "输入错误,请选择运算法则:"; j = -1; continue; } if (jjcc[j] == 0) break; } } void main() { int page = 1; //定制份数 int k;//题目数 cout << "\t************************************************************" << endl; cout << "\t* *" << endl; cout << "\t* ^-^欢迎来到四则运算计算题库 *" << endl; cout << "\t* *" << endl; cout << "\t* *" << endl; cout << "\t************************************************************" << endl; cout << "请进行初始化设置:" << endl; mune(page,k); cout << "初始化完成,如需更改,请选择“设置”。\n" << endl; while(1) { int xuanxiang; cout << endl; cout << "\t\t\t\t1、非负整数运算" << endl; cout << "\t\t\t\t2、分 数 运 算" << endl; cout << "\t\t\t\t3、负 数 运 算" << endl; cout << "\t\t\t\t4、设 置" << endl; cout << "\t\t\t\t5、退 出" << endl; cout << "请选择:"; cin >> xuanxiang; switch(xuanxiang) { case 1:feifu(page,k);break; case 2:fenshu(page,k);break; case 3:fushu(page,k);break; case 4:mune(page,k);continue; case 5:exit(0);break; } } } void feifu(int page,int k) { yunsuan(); int page1 = 1; k1 = k;//输出打印个数的时候保证前齐 while(page--) //定制份数 { num = 1; k = k1; cout << "\n第" << page1++ << "份题卷:" << endl; while(k) //每份题目数 { a[k] = rand()%(cmax+1) + cmin; b[k] = rand()%(cmax+1) + cmin; ch[k] = rand()%4 + 1; jianyan(k); for (int i = 0;i < j;i++) { if (jjcc[i] == ch[k]) { if(jjcc[i] == 1) noout(jjcc[i],k); if(jjcc[i] == 2) noout(jjcc[i],k); if(jjcc[i] == 3) noout(jjcc[i],k); if(jjcc[i] == 4 && b[k] == 0)//如果除数是0,跳过本次循环 { k++; continue; } else if(jjcc[i] == 4 && b[k] != 0) noout(jjcc[i],k); } } } } } void fenshu(int page,int k) { yunsuan(); int page1 = 1; k1 = k;//输出打印个数的时候保证前齐 while(page--) //定制份数 { num = 1; k = k1; cout << "第" << page1++ << "份题卷:" << endl; while(k) //每份题目数 { do { a[k] = rand()%(cmax+1) + cmin; b[k] = rand()%(cmax+1) + cmin; ch[k] = rand()%4 + 1; x = rand()%(cmax+1) + cmin; y = rand()%(cmax+1) + cmin; } while (x == 0 || y == 0); jianyan(k); for (int i = 0;i < j;i++) { if (jjcc[i] == ch[k]) { if(jjcc[i] == 1) fenout(jjcc[i],k); if(jjcc[i] == 2) fenout(jjcc[i],k); if(jjcc[i] == 3) fenout(jjcc[i],k); if(jjcc[i] == 4 && b[k] == 0)//如果除数是0,跳过本次循环 { k++; continue; } else if(jjcc[i] == 4 && b[k] != 0) fenout(jjcc[i],k); } } } } } void fushu(int page,int k) { yunsuan(); int page1 = 1; k1 = k;//输出打印个数的时候保证前齐 while(page--) //定制份数 { num = 1; k = k1; cout << "第" << page1++ << "份题卷:" << endl; while(k) //每份题目数 { a[k] = rand()%(cmax+1) + cmin; b[k] = rand()%(cmax+1) + cmin; ch[k] = rand()%4 + 1; jianyan(k); for (int i = 0;i < j;i++) { if (jjcc[i] == ch[k]) { if(jjcc[i] == 1) fuout(jjcc[i],k); if(jjcc[i] == 2) fuout(jjcc[i],k); if(jjcc[i] == 3) fuout(jjcc[i],k); if(jjcc[i] == 4 && b[k] == 0)//如果除数是0,跳过本次循环 { k++; continue; } else if(jjcc[i] == 4 && b[k] != 0) fuout(jjcc[i],k); } } } } }
四则运算2——结果截图
四则运算2——编程总结
程序看起来感觉难度不大,但是在编程过程中,一个一个问题不断出现,虽然有设计思路,但是开发过程中,并不像设计思路写的那么简单。当按顺序解决完一个问题后,开始解决下一个问题时,却发现就会把之前弄好的东西改的面目全非。就这样不断编写,不断发现新的问题,不断修改,同时不断添加新的功能。在快完成的时候发现代码有很多冗余代码,通过编写函数,尽量将冗余编码减少,但是还是不尽人意。
四则运算2——时间记录日志