设计思想:
在原本的基础上有以下调整:
1.避免重复(未完成)
2.定制数量/打印方式(循环次数提出来作为变量/ 如果不打印到文件,就用goto跳过打印到文件的代码)
3.控制参数
是否有乘除(rand()%4改成%2,用else)
是否有括号,最多十个数(未完成)
数值范围(random(x)中x作为变量)
加减有无负数(通过计算结果,存入re中,判断有无,如果有负数就goto到a重新生成随机数和符号)
除法有无余数(通过计算结果,存入mo中,判断有无,如果有余数就goto到a重新生成随机数和符号)
4.对可约分分数经行了控制(求最大公约数,可约分就除以最大公约数)
5.除数不为0(除数为0时,rand()%4改成%3,不产生除法符号)
源程序:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) #include<iostream> #include<fstream> #include<iomanip> #include<cmath> using namespace std; int zuidagongyueshu(int a, int b)//避免可约分分数出现 { int c = 0, min, i; min = a < b ? a : b; for (i = 1; i < min; i++) { if (a%i == 0 && b%i == 0) c = i; else c = 1; } return c; } int chenchu(int q)//是否有乘除 { int k; if (q == 1) { k = rand() % 4;//有 } else k = rand() % 2;//无 return k; } int suiji(int k, int q, int f, int g, int v, int z) { int a, b, c, d, i,mo; double re; srand((int)time(0)); ofstream outfile; outfile.open("2.txt"); for (int j = 0; j<k; j++) {
a://如果加减有负数或除法有余数被要求,情况不合,则重新生成随机数(即:在a处重来) i = chenchu(q); a = random(f); b = random(f); c = random(f); d = random(f); if (a<b && c<d && b != 0 && d != 0)//构成分数 { int l, p; l = zuidagongyueshu(a, b); p = zuidagongyueshu(c, d); if (l != 0) { a = a / l; b = b / l; } if (k != 0) { c = c / p; d = d / p; } if (g != 1)//不用打印到文件 { goto g;//跳过“输出到文件”部分代码 } if ((c / d) == 0) { goto a; } switch (i)//输出到文件 { case 0:{re = (a / b) + (c / d); outfile << setprecision(10) << "(" << a << "/" << b << ")" << "+" << "(" << c << "/" << d << ")" << "=" << endl; break;} case 1:{re = (a / b) - (c / d); if (re < 0){ goto a; } outfile << setprecision(10) << "(" << a << "/" << b << ")" << "-" << "(" << c << "/" << d << ")" << "=" << endl; break; } case 2:{re = (a / b) * (c / d); outfile << setprecision(10) << "(" << a << "/" << b << ")" << "*" << "(" << c << "/" << d << ")" << "=" << endl; break;} case 3:{re = (a / b) / (c / d); outfile << setprecision(10) << "(" << a << "/" << b << ")" << "/" << "(" << c << "/" << d << ")" << "=" << endl; break;} } g: switch (i)//输出到屏幕 { case 0:{re = (a / b) + (c / d); cout << "(" << a << "/" << b << ")" << "+" << "(" << c << "/" << d << ")" << "=" << endl; break;} case 1:{re = (a / b) - (c / d); if (re < 0){ goto a; } cout << "(" << a << "/" << b << ")" << "-" << "(" << c << "/" << d << ")" << "=" << endl; break; } case 2:{re = (a / b) * (c / d); cout << "(" << a << "/" << b << ")" << "*" << "(" << c << "/" << d << ")" << "=" << endl; break;} case 3:{re = (a / b) / (c / d); cout << "(" << a << "/" << b << ")" << "/" << "(" << c << "/" << d << ")" << "=" << endl; break;} } } //构成整数 if (i == 3 && b == 0)//如果除数为0,去除法 { i = rand() % 3;//随机的符号只有+、-、* } else { if (g != 1)//不用打印到文件 { goto h; //跳过“输出到文件”部分代码 } switch (i)//输出到文件 { case 0:{re = a + b; outfile << setprecision(10) << a << "+" << b << "=" << endl; break;} case 1:{re = a - b; if (re < 0){ goto a; } outfile << setprecision(10) << a << "-" << b << "=" << endl; break; } case 2:{re = a * b; outfile << setprecision(10) << a << "*" << b << "=" << endl; break;} case 3:{re = a / b; outfile << setprecision(10) << a << "/" << b << "=" << endl; break;} } h: switch (i)//输出到屏幕 { case 0:{re = a + b; cout << a << "+" << b << "=" << endl; break;} case 1:{re = a - b; if (re < 0){ goto a; } cout << a << "-" << b << "=" << endl; break; } case 2:{re = a * b; cout << a << "*" << b << "=" << endl; break;} case 3:{re = a / b; mo = a%b; if (mo != 0){ goto a; } cout << a << "/" << b << "=" << endl; break; } } } } outfile.close(); return 0; } int main() { int k , q , f , g , v , z ; cout << "请输入生成四则运算数量=\n"; cin >> k; cout << "请输入数值范围\n"; cin >> f; cout << "请输入是否有乘除(有,按1)\n";cin >> q; cout << "是否输出到文件(是,按1)\n"; cin >> g; cout << "加减有无负数(有,按1)\n"; cin >> v; cout << "乘除有无余数(有,按1)\n"; cin >> z; suiji(k, q, f, g, v, z); }
测试截图:
默认:随机生成10个式子,数值范围0-100,有乘除法,不输入文件,加减有负数,乘除有余数
1.测试生成数量
2.测试数值范围
3.有无乘除
4.是否输出到文件
5.加减有无负数(为了便于测试,此项无乘除)
6.除法有无余数
项目计划总结:
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查资料 | 日总计 |
周一 | 2 | 2 | |||
周二 | 2 | 22 | |||
周三 | 2 | 2 | |||
周四 | 2 | 2 | 4 | ||
周五 | 8.5 | 1 | 9.5 | ||
周六 | 8 | 2 | 10 | ||
周日 | 2 | 2 | |||
周总计 | 4 | 20.5 | 4 | 3 | 27.5 |
时间纪录日志:
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/7 | 14:00 | 15:50 | 10 | 100 | 听课 | 软工课程 |
3/8 | 19:00 | 21:00 | 0 | 120 | 编程 | 修改上周的程序 |
3/9 | 20:00 | 22:00 | 0 | 120 | 看书 | 《构建之法》 |
3/10 | 14:00 | 15:50 | 10 | 100 | 听课 | 软工课程 |
19:00 | 21:00 | 10 | 110 | 编程 | 想思路,修改上周的程序 | |
3/11 | 8:00 | 9:30 | 0 | 90 | 编程 | 修改上周的程序 |
13:00 | 21:00 | 60 | 420 | 编程、查资料 | 修改上周的程序 | |
3/12 | 8:00 | 11:00 | 20 | 160 | 调试、写博客、查资料 | 调试上周的程序 |
13:30 | 18:00 | 30 | 300 | 测试、写博客 | 测试上周的程序 | |
3/13 | 17:00 | 19:00 | 0 | 120 | 看书 | 《构建之法》 |
缺陷记录日志:
每增加一个功能都更加难改,数值变量太多,逻辑有时候会混乱,感觉懂得还是太少,解决办法都没一个,蛮难过。