将整个程序分为三个模块,自动生成表达式模块,接收表达式判断用户输入模块,接收表达式字符串计算模块
1.接收表达式字符串计算模块 Calc( )
正如要求中的一样,Calc函数接收字符串的输入,字符串里就是运算式子,例如“5+3’1/2”,这个模块的返回值就是一个字符串,例如上述运算式子的返回就是“8‘1/2”。我们用到的是类Expression.
测试代码:
1 string teststr; 2 cout<<"请输入字符串表达式:"<<endl; 3 getline(cin,teststr); 4 string result = Calc(teststr); 5 cout<<result;
测试结果:
在小黑框中测试一下,如下图
2.接收表达式判断用户输入模块
这个模块主要是判断用户输入的各种异常,当用户输入错误时,能够通知用户大概错在哪里。函数为IsErr()
测试代码:
1 string teststr; 2 cout<<"请输入字符串表达式:"<<endl; 3 getline(cin,teststr); 4 IsErr(teststr);
测试结果,包括各种可能:
3.自动生成表达式模块
这个模块我们用到的都是上一个个人项目中的代码,但是这里,我们修改了一点,使得这个模块可以支持负数,也就是在生成操作数时,我们不在局限于正数范围,对于我们给定的数据范围MaxNum,生成的操作数应该可以在 [-MaxNum, MaxNum]之间。
生成操作数的函数做了相应的修改
1 Value::Value(int MaxNum) 2 { 3 int pro = rand() % PRO; 4 //这个随机数控制运算表达式中的分数出现的频率。 5 if (pro == 0) 6 { 7 demon = rand() % (MaxNum-1) + 1; 8 } 9 else 10 { 11 demon = 1; 12 } 13 int pro1 = rand() % PRO1; 14 //这个随机数控制运算表达式中负数出现的频率 15 numer = rand() % (demon * MaxNum); 16 if (pro1 == 0) 17 { 18 numer = numer * -1; 19 } 20 }