可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数!
具体实现:
1. 使用无限循环实现不同功能的输出以满足用户的需求。
2. 输出语句,让用户输入数值范围随机生成数的范围,所生成题目个数,输入有无乘除法是否要有乘除法?有请输入<1>,无请输入<0>;是否要加减结果有负数?有请输入<1>,无请输入<0>;否要除法结果有余数?有请输入<1>,无请输入<0>;
3. a=min+rand()%m;
b=min+rand()%m;
c=rand()%4;
利用随机方式来生成随机数,c决定运算符号;
4. 打印方式,生成题目的数量;在程序的开始让客户选择打印方式《cout<<"请依次输入输出算式数量和每行显示数量:"<<endl;cin>>num>>line;》
5.在题目生成的时候进行次循环遍历数组以避免新产生的表达式与前面重复,如果重复则继续生成表达式,直到不重复为止。
7.考虑含负数情况下也有无负数的表达式。
operation.h文件
#pragma once #include <string> #include <iostream>using namespace std; class operation { public:int a0[1000],b0[1000],c0[1000],a1[1000],b1[1000],c1[1000],a2[1000],b2[1000],c2[1000],a3[1000],b3[1000],c3[1000],C[1000],a,b,c;int i,j,A0,A1,A2,A3,B0,B1,B2,B3;int num,line,k;int min,max,m;int CC,FS,YS,KH;void xuanze();//选择void suiji();//随机void yunsuan();//运算operation(void);~operation(void); };
operation.cpp文件
#include "operation.h"operation::operation(void)
{
}operation::~operation(void)
{
}
void operation::xuanze()
{k=0;A0=0;A1=0;A2=0;A3=0;B0=0;B1=0;B2=0;B3=0;cout<<"四则运算"<<endl;cout<<"请依次输入输出算式数量和每行显示数量:"<<endl;cin>>num>>line;cout<<"请问是否要有乘除法?有请输入<1>,无请输入<0>"<<endl;cin>>CC;while(1) {if(CC != 1&&CC != 0){cout<<"输入不合法,请重新输入<1>或<0>";cin>>CC;}elsebreak;}cout<<"请问是否要加减结果有负数?有请输入<1>,无请输入<0>"<<endl;cin>>FS;while(1) {if(FS != 1&&FS != 0){cout<<"输入不合法,请重新输入<1>或<0>:";cin>>FS;}elsebreak;}cout<<"请问是否要除法结果有余数?有请输入<1>,无请输入<0>"<<endl;cin>>YS;while(1) //判断输入是否合法{if(YS != 1&&YS != 0){cout<<"输入不合法,请重新输入<1>或<0>";cin>>YS;}elsebreak;}cout<<"请输入两个值确定算式中a,b的取值范围:"<<endl;cin>>min>>max;while(1) //判断输入是否合法{if(min>=max){cout<<"请保证前一个值小于后一个值,请重新输入:";cin>>min>>max;}elsebreak;}cout<<"请问是否要加括号数?无请输入<1>,有请输入<0>"<<endl;cin>>KH;while(1) {if(KH != 1&&KH != 0){cout<<"输入不合法,请重新输入<1>或<0>:";cin>>FS;}elsebreak;}
}void operation::suiji()
{m=max-min+1;for(i=0;i<1000;i++){a0[i]=0;b0[i]=0;a1[i]=0;b1[i]=0;a2[i]=0;b2[i]=0;a3[i]=0;b3[i]=0;}for(i=0;;i++){a=min+rand()%m;b=min+rand()%m;c=rand()%4;if(CC==0) {if(c==2||c==3)continue;}if(FS==0) {if(c==0){if(a+b<0)continue;}else if(c==1){if(a-b<0)continue;}}if(YS==0) {if(c==3)if(0 != a%b)continue;}if(c==0) {for(j=0;j<=A0;j++){if(a==a0[j]&&b==b0[j]){B0++;break;}}if(B0>0){B0=0;continue;}else{a0[A0]=a;b0[A0]=b;c0[A0]=a+b;A0++;}}else if(c==1) {for(j=0;j<=A1;j++){if(a==a1[j]&&b==b1[j]){B1++;break;}}if(B1>0){B1=0;continue;}else{a1[A1]=a;b1[A1]=b;c1[A1]=a+b;A1++;}}else if(c==2) {for(j=0;j<=A2;j++){if(a==a2[j]&&b==b2[j]){B2++;break;}}if(B2>0){B2=0;continue;}else{a2[A2]=a;b2[A2]=b;c2[A2]=a+b;A2++;}}else {if(b==0)continue;for(j=0;j<=A3;j++){if(a==a3[j]&&b==b3[j]){B3++;break;}}if(B3>0){B3=0;continue;}else{a3[A3]=a;b3[A3]=b;c3[A3]=a+b;A3++;}}if(num==A0+A1+A2+A3) break;}}void operation::yunsuan(){for(i=0;i<A0;i++) {k++;if(a0[i]<0)cout<<"("<<a0[i]<<")";elsecout<<a0[i]<<" ";cout<<"+";if(b0[i]<0)cout<<"("<<b0[i]<<")";elsecout<<" "<<b0[i]<<" ";cout<<"=";if(k%line==0)cout<<endl;elsecout<<"\t";for(j=0;j<i;j++)//判断是否有重复{if(b2[j]==b2[i],b3[j]==b3[i]){i=i-1;suiji();break;}}for(i=0;i<A1;i++) {k++;if(a1[i]<0)cout<<"("<<a1[i]<<")";elsecout<<a1[i]<<" ";cout<<"-";if(b1[i]<0)cout<<"("<<b1[i]<<")";elsecout<<" "<<b1[i]<<" ";cout<<"=";if(k%line==0)cout<<endl;elsecout<<"\t";for(j=0;j<i;j++)//判断是否有重复{if(b2[j]==b2[i],b3[j]==b3[i]){i=i-1;suiji();break;}}for(i=0;i<A2;i++) {k++;if(a2[i]<0)cout<<"("<<a2[i]<<")";elsecout<<a2[i]<<" ";cout<<"*";if(b2[i]<0)cout<<"("<<b2[i]<<")";elsecout<<" "<<b2[i]<<" ";cout<<"=";if(k%line==0)cout<<endl;elsecout<<"\t";for(j=0;j<i;j++)//判断是否有重复{if(b2[j]==b2[i],b3[j]==b3[i]){i=i-1;suiji();break;}}for(i=0;i<A3;i++) {k++;if(a3[i]<0)cout<<"("<<a3[i]<<")";elsecout<<a3[i]<<" ";cout<<"/";if(b3[i]<0)cout<<"("<<b3[i]<<")";elsecout<<" "<<b3[i]<<" ";cout<<"=";if(k%line==0)cout<<endl;elsecout<<"\t";for(j=0;j<i;j++)//判断是否有重复{if(b2[j]==b2[i],b3[j]==b3[i]){i=i-1;suiji();break;}}}}
main 函数
#include"operation.h"
#include<iostream>
void main()
{operation C21;C21.xuanze();C21.suiji();C21.yunsuan();
}
程序总结
存在的问题:是否有括号(最多可以支持十个数参与计算)功能没有很好的实现。由于的数据结构没有掌握好,本来这个功能呢是利用栈来实现的,但是没有完全掌握好,这次利用了多个的程序单元,包括生成随机数,打印,是加减乘除等一些程序是单元,可以单独调试,大大减少了程序的调试时间;