题目:四则运算表达式生成
队友:胡泊
担任角色:驾驶员
1.要求:
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
2.题目:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
用户选择是否有括号、是否有小数 - 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
3.设计与编码:
- 运算的数通过参生随机数获得。
- 运算符由用户输入并存入一个数组,产生式子时随机获取。
- 用户选择是否含有小数,如果需要则在产生每个随机数时随机生成小数或者整数。
- 调用随机数生成函数随机就可以使式子的长度随机。
- 在符合条件的位置随机生成括号,并需记录还未匹配左括号数量。
- 用户选择文件及控制台输出。
4.开发环境:
- 操作系统:win10
- IDE:CodeBlocks
- 开发语言:c++
5.运行结果:
6.代码:
主要代码:
//输出运算表达式
void getExpression(int n,int Isfloat,const int MAX)
{
int sign=0; //某数字前是否生成了左括号标志
int sign2=0; //第一个数之前是否生成左括号标志
int LeftBrackets =0; //记录未匹配的左括号数量
if(Isfloat ==1) //生成含小数的表达式
{
if((ParenthesiSign==1 )&&(rand()%3==1)&&(n!=1)) //产生括号概率为1/3,并且只有式子是多元运算才可能在开头生成括号
{
cout<<"(";
sign2 = 1;
LeftBrackets++;
}
if(rand()%2 == 1) //随机小数
{
cout<<getnumber2(MAX);
}
else //随机整数
{
cout<<getnumber(MAX);
}
for(int k=1,sign = 0;k<=n;k++)
{
char a = getOperator(); //输出运算符
cout<<a;
if((ParenthesiSign==1 )&&(rand()%3==1)&&(k<(n-1))) //只要不是最后一个数之前都可能生成左括号
{
cout<<"(";
LeftBrackets++;
sign = 1;
}
if(rand()%2 == 1) //随机小数
{
int b = getnumber2(MAX);
if(a= '/'&& b == 0) //如果是除数为0,则默认为除1
b+=1.0;
cout<<b;
}
else //随机整数
{
int b = getnumber2(MAX);
if(a= '/'&& b == 0) //如果是除数为0,则默认为除1
b+=1;
cout<<b;
}
if((ParenthesiSign==1 )&&(rand()%3==1)&&(LeftBrackets>0)&&(sign==0)) //生成右括号
{
cout<<")";
LeftBrackets--;
}
while((LeftBrackets>0)&&(sign2 ==1) &&(k==n-1)) //如果式子开头有左括号,则最晚在最后一个数之前生成对应右括号
{
cout<<")";
LeftBrackets--;
}
}
while(LeftBrackets>0)
{
cout<<")";
LeftBrackets--;
}
cout<<'='<<endl;
} //end if
else
{
if((ParenthesiSign==1 )&&(rand()%3==1)&&(n!=1)) //产生括号概率为1/3,并且只有式子是多元运算才可能在开头生成括号
{
cout<<"(";
LeftBrackets++;
}
cout<<getnumber(MAX);
for(int k=1,sign = 0;k<=n;k++)
{
char a = getOperator();
cout<<a;
if((ParenthesiSign==1 )&&(rand()%3==1)&&(k<(n-1)) )
{
cout<<"(";
LeftBrackets++;
sign = 1;
}
int b = getnumber(MAX);
if(a= '/'&& b == 0)
b+=1;
cout<<b;
if((ParenthesiSign==1 )&&(rand()%3==1)&&(LeftBrackets>0)&&(sign == 0))
{
cout<<")";
LeftBrackets--;
}
while((LeftBrackets>0)&&(sign2 ==1) &&(k==n-1))//如果开头生成了左括号需将还未匹配的左括号在最后一个数之前全部匹配
{
cout<<")";
LeftBrackets--;
}
}
while(LeftBrackets>0) //将还未匹配的左括号在最后全部匹配
{
cout<<")";
LeftBrackets--;
}
cout<<'='<<endl;
} //end else
}