1 Star 0 Fork 0

李玲玲 / 学生四则运算

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
2.cpp 24.24 KB
一键复制 编辑 原始数据 按行查看 历史
李玲玲 提交于 2020-02-29 13:44 . 这是我的第一次提交
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<stack>
#include<fstream>
#define length 100
using namespace std;
typedef long long ll;
ofstream fout("equation.txt");
char Op[] = {'+', '-', '*', '/'};
int rights;
int wrong;
struct num{
ll numerator, denominator;
num(){numerator = 0; denominator = 1;}
num(int n) {numerator = n; denominator = 1;}
num(int n,int d) {numerator = n; denominator = d;}
void operator = (num x)
{
numerator = x.numerator;
denominator = x.denominator;
}
};
#define maxl 1005
char nifix[maxl], post[maxl];
char ans[maxl];
int cnt_right, cnt_wrong;
bool error;
num res, rst;
class fraction
{
private:
int above;
int below;
void reduction();
fraction makeCommond(fraction);
public:
fraction()
{
}
fraction add(fraction);
fraction sub(fraction);
fraction mul(fraction);
fraction div(fraction);
int display(int,int);
void setvalue(int ,int);
};
//约分//
void fraction::reduction()
{
int i,comdiv,small,max;
if(above<below)
{
small=above;
max=below;
}
else
{
small=below;
max=above;
}
for(i=small;i>1;i--)
{
if((small%i==0 )&(max%i==0) )
break;
}
comdiv=i;
if(i!=0)
{
above/=i;
below/=i;
}
}
//分数通分//
fraction fraction::makeCommond(fraction frac)
{
int b1=below,b2=frac.below, m,s;
if(b1>b2)
{
m=b1%b2;
s=b2;
}
else
{
m=b2%b1;
s=b1;
}
while(m>0)
{
int res=s%m;
s=m,m=res;
}
int small=(b1*b2)/s;
above=above*(small/below);
frac.above=frac.above*(small/frac.below);
below=small;
frac.below=small;
return frac;
}
//分数相加//
fraction fraction::add(fraction fr)
{
fraction myFraction;
myFraction.above=above*fr.below+fr.above*below;
myFraction.below=below*fr.below;
myFraction.reduction();
return myFraction;
}
//分数相减//
fraction fraction::sub(fraction fr)
{
fraction myFraction;
myFraction.above=above*fr.below-fr.above*below;
myFraction.below=below*fr.below;
myFraction.reduction();
return myFraction;
}
//分数相乘//
fraction fraction::mul(fraction fr)
{
fraction myFraction;
myFraction.above=above*fr.above;
myFraction.below=below*fr.below;
myFraction.reduction();
return myFraction;
}
//分数相除//
fraction fraction::div(fraction fr)
{
fraction myFraction;
myFraction.above=above*fr.below;
myFraction.below=below*fr.above;
myFraction.reduction();
return myFraction;
}
//分数答案的输入判断//
int fraction::display(int a,int b)
{
if((a==above)&&(b==below))
{
cout<<"正确"<<endl;
rights=rights+1;
}
else
{
cout<<"错误"<<endl;
wrong=wrong+1;
}
return rights,wrong;
}
//分数的赋值//
void fraction::setvalue(int sj1,int sj3)
{
above=sj1;
below=sj3;
}
//无分数,无余数答案判断//
int answer(int a[],int i)
{
int ans;
cout<<"请输入答案:"<<endl;
cin>>ans;
if(ans==a[i])
{
cout<<"正确"<<endl;
rights=rights+1;
}
else
{
cout<<"错误"<<endl;
wrong=wrong+1;
}
return rights,wrong;
}
//无分数,有余数答案判断//
int answer_1(int a[],int i,int b[])
{
int ans,yushu;
cout<<"请输入商:"<<endl;
cin>>ans;
cout<<"输入余数"<<endl;
cin>>yushu;
if((ans==a[i])&&(yushu=b[i]))
{
cout<<"正确"<<endl;
rights=rights+1;
}
else
{
cout<<"错误"<<endl;
wrong=wrong+1;
}
return rights,wrong;
}
//产生带括号式子//
void create(int maxn)
{
if(!fout)
{
cerr << "open error!" << endl;
exit(1);
}
int lengt;
do{
lengt = rand()%8;
}while(lengt < 2);
bool div = false;
int brack_cnt = 0;
ll num, op;
for (int i = 1; i < lengt; i++)
{
if (div)
{
div = false;
do{
num = rand()%maxn;
}while(num == 0);
cout<< num;
fout<< num;
}
else
{
num= rand()%maxn;
fout <<num;
cout<<num;
}
int tmpcnt = brack_cnt;
for (int j = 0; j < tmpcnt; j++)
{
if ((rand()%5) > 2)
{
brack_cnt--;
fout << ")";
cout<<")";
}
}
op = rand()%4;
fout << Op[op];
cout << Op[op];
if (op == 3)
div = true;
if (!(rand()%3))
{
fout << "(";
cout<<"(";
brack_cnt++;
num= rand()%maxn;
fout <<num;
cout<<num;
op = rand()%4;
fout << Op[op];
cout<<Op[op];
if (op == 3)
div = true;
}
}
if (div)
{
div = false;
do{
num = rand()%maxn;
}while(num == 0);
fout << num;
cout<< num;
}
else
{
num=rand()%maxn;
fout << num;
cout<<num;
}
while(brack_cnt--)
{
fout << ")";
cout << ")";
}
cout<<"=";
fout<< endl;
cout<<endl;
}
bool isNum(char x)
{
return (x >= '0' && x <= '9');
}
bool isOp(char x)
{
return (x == '+' || x == '-' || x == '*' || x == '/' || x == '(' || x == ')');
}
int priority(char x)
{
if (x == '-' || x == '+')
return 1;
else if (x == '*' || x == '/')
return 2;
else if (x == '(')
return 0;
else
return -1;
}
bool nifix_to_post()
{
memset(post, 0, sizeof(post));
stack<char> s;
bool havenum = false;
int tmp = 0, pos = 0;
for (int i = 0; nifix[i] != '\0'; i++)
{
if (isNum(nifix[i]))
{
havenum = true;
tmp = tmp*10 + (nifix[i]-'0');
}
else if (isOp(nifix[i]))
{
if (isOp(nifix[i-1]) && nifix[i-1] != ')' && nifix[i] != '(')
return true;
if (havenum)
{
havenum = false;
post[pos++] = tmp + '0';
tmp = 0;
}
if (nifix[i] == ')')
{
if (s.empty())
return true;
while(s.top() != '(')
{
post[pos++] = s.top();
s.pop();
if (s.empty())
return true;
}
s.pop();
}
else if (nifix[i] == '(')
s.push(nifix[i]);
else
{
while (!s.empty() && priority(nifix[i]) <= priority(s.top()))
{
post[pos++] = s.top();
s.pop();
}
s.push(nifix[i]);
}
}
else
return true;
}
if (havenum)
{
havenum = false;
post[pos++] = tmp + '0';
tmp = 0;
}
while(!s.empty())
{
if (s.top() == '(')
return true;
post[pos++] = s.top();
s.pop();
}
return false;
}
ll gcd(ll m, ll n)
{
ll tmp;
tmp = m % n;
while(tmp)
{
m = n;
n = tmp;
tmp = m % n;
}
return n;
}
bool cal_result()
{
stack<num> s;
for (int i = 0; i < (strlen(post)); i++)
{
if (!isOp(post[i]))
{
num tmp(post[i]-'0', 1);
s.push(tmp);
}
else
{
if (s.empty())
return true;
num b = s.top(); s.pop();
if (s.empty())
return true;
num a = s.top(); s.pop();
num c;
if (post[i] == '+')
{
c.numerator = a.numerator * b.denominator + b.numerator * a.denominator;
c.denominator = a.denominator * b.denominator;
}
else if (post[i] == '-')
{
c.numerator = a.numerator * b.denominator - b.numerator * a.denominator;
c.denominator = a.denominator * b.denominator;
}
else if (post[i] == '*')
{
c.numerator = a.numerator * b.numerator;
c.denominator = a.denominator * b.denominator;
}
else if (post[i] == '/')
{
if (b.numerator == 0)
return true;
c.numerator = a.numerator * b.denominator;
c.denominator = a.denominator * b.numerator;
}
else
return true;
if (c.numerator != 0)
{
ll div = gcd(c.denominator, c.numerator);
c.denominator /= div;
c.numerator /= div;
}
s.push(c);
}
}
if (s.size() > 1)
return true;
res = s.top();
s.pop();
if (res.denominator < 0)
{
res.numerator = -res.numerator;
res.denominator = -res.denominator;
}
return false;
}
bool trans_ans()
{
int i = 0;
ll tmp = 0;
bool num_flag = false, deno_flag = false;
if (ans[i] == '-')
{
num_flag = true;
i++;
}
while(isNum(ans[i]))
{
tmp = tmp * 10 + (ans[i] - '0');
i++;
}
if (num_flag)
tmp = -tmp;
rst.numerator = tmp;
rst.denominator = 1;
tmp = 0;
if (ans[i] == '/')
{
if (ans[++i] == '-')
{
deno_flag = true;
i++;
}
while(isNum(ans[i]))
{
tmp = tmp * 10 + (ans[i] - '0');
i++;
}
if (deno_flag)
tmp = -tmp;
rst.denominator = tmp;
}
if (rst.denominator == 0)
return true;
if (i != strlen(ans))
return true;
if (rst.denominator < 0)
{
rst.numerator = -rst.numerator;
rst.denominator = -rst.denominator;
}
if (num_flag && deno_flag)
rst.denominator = 0;
return false;
}
int main()
{
fraction frac,frac2;
int sj1,sj2,sf=1,sj3,sj4,r,j=1;//定义随机数及算符
int above,below;
int Num;//题数
char nc;//运算数选择
char sfchose;//算符选择
char yschose;//余数选择
char jf;//减法结果选择
int qznum;//取值范围
int ans_2[length];//存放正确的答案
int ans_4[length]={0};//存放正确的余数
srand((unsigned)time(NULL)); //srand函数是以现在系统时间作为时间种子产生随机数
cout<<"欢迎使用四则运算自动出题系统"<<endl;
cout<<"请对以下内容进行初始化设置:"<<endl;
cout<<"选择年级一年级(输入'1')或二年级(输入'2')或三年级(输入'3')或四年级(输入'4')或五年级(输入'5')"<<endl;
cin>>nc;
if(nc=='1'){{
cout<<"产生一年级四则运算,选择难度低输入6,中输入7,高输入8"<<endl;
cin>>nc;
if(nc=='6'){
cout<<"你选择了简单模式,请输入a,建议不要设置乘除法"<<endl;}
if(nc=='7'){
cout<<"你选择了中等模式,请输入a,建议设置乘除法"<<endl;}
if(nc=='8'){
cout<<"你选择了难模式,请输入a,建议题目量大于50,要有乘除"<<endl;}
}}
if(nc=='2'){{
cout<<"进入二年级四则运算,选择难度低输入6,中输入7,高输入8"<<endl;}
cin>>nc;
if(nc=='6'){
cout<<"你选择了简单模式,请输入a,建议不要设置乘除法"<<endl;}
if(nc=='7'){
cout<<"你选择了中等模式,请输入a,建议设置乘除法"<<endl;}
if(nc=='8'){
cout<<"你选择了难模式,请输入a,题目量大于50,要有乘除"<<endl;}
}
if(nc=='3'){{
cout<<"进入三年级四则运算,请选择难度:低选择'6';中选择'7';高的模式选择'8'"<<endl;}
cin>>nc;
if(nc=='6'){
cout<<"你选择了简单模式,请输入b,进入后,建议题目小于30"<<endl;}
if(nc=='7'){
cout<<"你选择了中等模式,请输入b,进入后,建议题目大于30小于50"<<endl;}
if(nc=='8'){
cout<<"你选择了难模式,请输入b,进入后,建议题目量大于50"<<endl;}
}
if(nc=='4'){{
cout<<"进入四年级四则运算,请选择难度:低选择'6';中选择'7';高的模式选择'8'"<<endl;}
cin>>nc;
if(nc=='6'){
cout<<"你选择了简单模式,请输入b,进入后建议题目小于30"<<endl;}
if(nc=='7'){
cout<<"你选择了中等模式,请输入b,进入后建议题目大于30小于50"<<endl;}
if(nc=='8'){
cout<<"你选择了难模式,请输入b,进入后题目量大于50"<<endl;}
}
if(nc=='5'){{
cout<<"进入五年级四则运算,请选择难度:(1)难度低的模式选择'6';(2)中等选择'7'(3)难度高的模式选择'8'"<<endl;}
cin>>nc;
if(nc=='6'){
cout<<"你选择了简单模式,建议输入b,进入后,建议题目小于30"<<endl;}
if(nc=='7'){
cout<<"你选择了中等模式,建议输入b,进入后,建议题目大于30小于50"<<endl;}
if(nc=='8'){
cout<<"你选择了难模式,建议输入b,进入后,建议题目量大于50"<<endl;}
}
cout<<"请输入难度模式(a.二个运算数 b.多个运算数)"<<endl;
cin>>nc;
if(nc=='a')
{
cout<<"请输入打印题数:"<<endl;
cin>>Num;
cout<<"请选择是否有乘除法?(y/n)"<<endl;
cin>>sfchose;
cout<<"请输入一个值确定算式中数值取值范围:"<<endl;
cin>>qznum;
cout<<"减法结果中出现负数吗?(y/n)";
cin>>jf;
if(sfchose=='y')
{
cout<<"请选择除法有无余数?(y/n)"<<endl;
cin>>yschose;
}
cout<<"********************************"<<endl;
for(int i=0;i<Num;i++)
{
sj1=rand()%qznum;
sj2=rand()%qznum;
sj3=rand()%qznum;
sj4=rand()%qznum;
if(sfchose=='n')//无乘除法
{
sf=rand()%4;
}
if(sfchose=='y')//有乘除法
{
sf=rand()%8;
}
switch(sf)
{
case 0:
cout<<sj1<<"+"<<sj2<<"= "<<endl;
ans_2[i]=sj1+sj2;
answer(ans_2,i);
break;
case 1:
if(jf=='n')
{
if(sj1<sj2)
{
cout<<sj2<<"-"<<sj1<<"= "<<endl;
ans_2[i]=sj2-sj1;
answer(ans_2,i);
}
else
{
cout<<sj1<<"-"<<sj2<<"= "<<endl;
ans_2[i]=sj1-sj2;
answer(ans_2,i);
}
}
else
{
cout<<sj1<<"-"<<sj2<<"= "<<endl;
ans_2[i]=sj1-sj2;
answer(ans_2,i);
}
break;
case 2:
if(sj1>sj3)
{
r=sj1;
sj1=sj3;
sj3=r;
}
if(sj2>sj4)
{
r=sj2;
sj2=sj4;
sj4=r;
}
cout<<"("<<sj1<<"/"<<sj3<<")"<<"+"<<"("<<sj2<<"/"<<sj4<<")= "<<endl;
frac.setvalue(sj1,sj3);
frac2.setvalue(sj2,sj4);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.add(frac2).display(above,below);
break;
case 3:
if(sj1>sj3)
{
r=sj1;
sj1=sj3;
sj3=r;
}
if(sj2>sj4)
{
r=sj2;
sj2=sj4;
sj4=r;
}
if(jf=='n')
{
if((sj1/sj3)<(sj2/sj4))
{
cout<<"("<<sj2<<"/"<<sj4<<")"<<"-"<<"("<<sj1<<"/"<<sj3<<")= "<<endl;
frac.setvalue(sj2,sj4);
frac2.setvalue(sj1,sj3);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.sub(frac2).display(above,below);
}
else
{
cout<<"("<<sj1<<"/"<<sj3<<")"<<"-"<<"("<<sj2<<"/"<<sj4<<")= "<<endl;
frac.setvalue(sj1,sj3);
frac2.setvalue(sj2,sj4);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.sub(frac2).display(above,below);
}
}
else
{
cout<<"("<<sj1<<"/"<<sj3<<")"<<"-"<<"("<<sj2<<"/"<<sj4<<")= "<<endl;
frac.setvalue(sj1,sj3);
frac2.setvalue(sj2,sj4);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.sub(frac2).display(above,below);
}
break;
case 4:
cout<<sj1<<"*"<<sj2<<"="<<endl;
ans_2[i]=sj1*sj2;
answer(ans_2,i);
break;
case 5:
if(sj2==0)
{
i=i-1;
}
else if(yschose=='n')
{
if(sj1%sj2==0)
{
cout<<sj1<<"/"<<sj2<<"="<<endl;
ans_2[i]=sj1/sj2;
answer(ans_2,i);
}
else
{
i=i-1;
}
}
else if(yschose=='y')
{
if(sj1%sj2!=0)
{
cout<<sj1<<"/"<<sj2<<"="<<endl;
ans_2[i]=sj1/sj2;
ans_4[i]=sj1-sj2*ans_2[i];
answer_1(ans_2,i,ans_4);
}
else
{
i=i-1;
}
}
break;
case 6:
if(sj1>sj3)
{
r=sj1;
sj1=sj3;
sj3=r;
}
if(sj2>sj4)
{
r=sj2;
sj2=sj4;
sj4=r;
}
cout<<"("<<sj1<<"/"<<sj3<<")"<<"*"<<"("<<sj2<<"/"<<sj4<<")= "<<endl;
frac.setvalue(sj1,sj3);
frac2.setvalue(sj2,sj4);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.mul(frac2).display(above,below);
break;
case 7:
if(sj1>sj3)
{
r=sj1;
sj1=sj3;
sj3=r;
}
if(sj2>sj4)
{
r=sj2;
sj2=sj4;
sj4=r;
}
cout<<"("<<sj1<<"/"<<sj3<<")"<<"/"<<"("<<sj2<<"/"<<sj4<<")= "<<endl;
frac.setvalue(sj1,sj3);
frac2.setvalue(sj2,sj4);
cout<<"输入分子和分母(用空格隔开,结果化到最简)";
cin>>above>>below;
frac.div(frac2).display(above,below);
break;
default:
break;
}
}
cout<<"共做对 "<<rights<<" 道题"<<endl;
cout<<"共做错 "<<wrong<<" 道题"<<endl;
}
else
{
cout<<"请输入出题数目:";
cin >>Num ;
cout<<"请输入一个值确定算式中数值取值范围:"<<endl;
cin>>qznum;
cout<<"******************************************"<<endl;
while(Num--)
{
create(qznum);
}
//计数器请0
cnt_right = cnt_wrong = 0;
ifstream infile;
infile.open("equation.txt", ios::in);
if(infile.is_open() == false)
{
cerr << "open error!" << endl;
exit(1);
}
while( infile >> nifix)
{
error = nifix_to_post();
if (error)
{
cout << "读取式子出错!" << endl;
return 0;
}
error = cal_result();
if (error)
{
cout << "计算中出错..." << endl;
return 0;
}
cout << "请输入答案: ";
cin >> ans;
error = trans_ans();
if (error)
{
cout << "输入不合法答案!" << endl;
return 0;
}
if ((rst.denominator == res.denominator && rst.numerator == res.numerator) || (rst.numerator == res.numerator && rst.numerator == 0))
{
cnt_right++;
cout << "正确!" << endl;
}
else
{
cnt_wrong++;
cout << "错误. 答案是 ";
if (res.denominator == 1)
cout << res.numerator << "." << endl;
else
cout << res.numerator << "/" << res.denominator << "." << endl;
}
}
cout << "统计结果..." << endl;
cout << "你答了" << cnt_right+cnt_wrong << " 道题 ";
cout << "正确数:" << cnt_right << " 错误数: " << cnt_wrong << " 。" << endl;
infile.close();
}
system("pause");
return 0;
}
1
https://gitee.com/ling_ling_li/student_four_operations.git
git@gitee.com:ling_ling_li/student_four_operations.git
ling_ling_li
student_four_operations
学生四则运算
master

搜索帮助