由于上周作业实在存在许多问题,所以这周重新写了代码。
这次代码和上次完全不一样,将生成的算式保存在数组里了。
1.避免重复(通过for循环一个一个比较字符串)
2.定制数量/打印方式(循环次数提出来作为变量/ 打印到文件通过引用函数实现)
3.控制参数
是否有乘除(rand()%4改成%2,)
是否有括号,最多十个数(完成,随机生成插入括号的位置,不过只能插入一个括号就是)
数值范围(random(x)中x作为变量)
加减有无负数(通过计算结果,调用函数,返回bool判断)
除法有无余数(通过计算结果,调用函数,返回bool判断)
还是存在一些问题,比如:规范用户输入,括号只能插入一个。但是比上次好多了,慢慢改吧。
#include<iostream> #include<time.h> #include<string> #include <sstream> #include <stdlib.h> #include<fstream> #include<cmath> #define random(x)(rand()%x) using namespace std; bool jsResult(string i1,int a,int b) { int result = a; bool bol=true; if (i1 == "-") { result = result - b; if (result < 0) { bol = false; } } if (i1 == "/") { result = result % b; if (result != 0) { bol = false; } } return bol; } void printfile(int n,string s[])//打印到文件 { int i; ofstream outfile; outfile.open("e://2.txt"); for (i = 0; i < n; i++) { outfile << s[i] << endl; } outfile.close(); } string fuhao(int f2)//随机符号 { string p; int i; if (f2 == 1) { i = rand() % 4; } if (f2 == 0) { i = rand() % 2; } switch (i) { case 0:p = "+"; break; case 1:p = "-"; break; case 2:p = "*"; break; case 3:p = "/"; break; } return p; } int main() { srand((unsigned)time(NULL)); int a, b, c, d=10, e, i=0, k,ii=0,nn,pp,result=0; stringstream s1, s2, s3, s4, s5; string s, ss, p, i1, i2,re[100]; bool bol=true; int n,f1,f2,f3 ,f; cout << "输入生成数量\n";//n cout << "是否有括号,最多十个数(输入1,有括号;输入0,无括号)\n";//f cout << "是否打印到文件(输入1,打印到文件;输入0,不打印到文件)\n";//f1 cout << "是否有乘除(输入1,有乘除;输入0,没有乘除)\n";//f2 cout << "请输入数值范围(0-?)\n";//f3 cin >> n; cin >> f; cin >> f1; cin >> f2; cin >> f3; //n = 10; f = 1; f1 = 1; f2 = 1; f3 = 100; beg: for (nn = 0; nn < n; nn++) { i = rand() % 9; i = i + 1;//防止随机出0 a = random(f3); s1 << a; s = s1.str(); if (f == 0 )//无括号 { for (k = 0; k < i; k++) { beg1: i1 = fuhao(f2); b = random(f3); if ((i1 == "/")&&(b==0))//除数不为0 { pp = rand() % 3; switch (pp) { case 0:i1 = "+"; break; case 1:i1 = "-"; break; case 2:i1 = "*"; break; } } bol = jsResult(i1, a, b); if (bol==false) { goto beg1; } s2 << b; s = s + i1 + s2.str(); s2.str(""); } re[nn] = s; s1.str(""); //cout << re[nn] << endl; //cout << s<<endl; } ///////////////////////////////////////////////////////////////////////////////// if (f == 1)//有括号 { int k1 = 100, k2 = 100; while (i < 2)//至少三个才有括号,所以小于三个就接着随机直到合法 { i = rand() % 10; } while (k1>i - 2) { k1 = rand() % i + 1; } while (k2 <= k1 || k2>i - 1) { k2 = (rand() % i) + 1; } for (k = 0; k < i; k++) { string str[100]; c = random(f3); i2 = fuhao(f2); if ((i2 == "/") && (c == 0))//除数不为0 { pp = rand() % 3; switch (pp) { case 0:i1 = "+"; break; case 1:i1 = "-"; break; case 2:i1 = "*"; break; } } s3 << c; str[k] = s3.str(); if (k == k1) { str[k] = "(" + str[k]; } if (k == k2) { str[k] = str[k] + ")"; } s = s + i2 + str[k]; s3.str(""); } re[nn] = s; s1.str(""); //cout << re[nn] << endl; } } /////////////////////////////////////// int n1=n; for (e = 0; e < n1; e++) { if (re[e] == re[n1])//重复 { goto beg;//重头开始 } else { n1 = n1 - 1;//不重复,比下一个 e = e - 1; if (n1 == 1)//比完了 { goto p;//输出 } } } p: for (nn = 0; nn < n; nn++) { cout << re[nn] << endl; } //////////////////////////////////////////////////// if (f1 == 1)//打印到文件 { printfile(n,re); } }
简单截取测试:
时间: 2024-10-14 00:59:22