小学四则运算题目自动生成
原题目如下:
阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来解决这个小问题,目前对于这个问题对于任何语言都不是问题,比如:
C/C++、C#、Java、Python、VB、JavaScript、Perl……
具体要求如下:
1.能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)
2.除了整数外,还要支持真分数的四则运算
分析可知需要采用一个自己熟悉的语言来变成实现自动生成30道小学四则运算题目且结果均为非负数,同时还要可以支持真分数的四则运算。这里我选择了C语言(毕竟我太菜,别的还不会)。一开始我的写的是四则混合运算,但是反复调试发现自己的判断非负的地方还存在很大问题,昨天晚上想了很久发现解决很麻烦,跟全算出结果差不多少,所以我还是放弃了。今天重新写了一个简单的。我觉得这个程序主要有3个地方需要注意。首先是随机生成问题,只使用rand()是不对的,这样生成的数是伪随机数,上网查了一下得知最简单的解决方法是应该在主函数里加上一句srand(time(0)),这里我最初是在每个rand()前都加上了srand(time(0)),导致产生的随机数都一样,应该只要在主函数里加一句就行了。这是个值得注意的地方。其次是关于如何保证结果都是非负数,由于是四则运算,因此只有出现“-”号的时候才会有这种可能。我是这样解决的:用x和y来表示整数题目时2个运算数,当出现“-”时(if(op==‘-’)),通过while(x-y<0)语句来循环进行重新随机,知道产生x大于等于y为止。当遇到分数题目时候,采用a/b,c/d形式,同理通过while(a*d-b*c<=0)语句来循环进行重新随即。最后关于真分数的问题,并不难,真分数简单来讲就是分母比分子大的分数,因此只要保证a>b且c>d就好了。整个程序的开发时间大概1个小时。下面是源代码:
#include<iostream.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> char Operator() { char op; int i; i=rand()%4+1; switch(i) { case 1: return '+'; case 2: return '-'; case 3: return 'x'; case 4: return '/'; } } void integer() { int x,y; char op; x=rand()%100+1; y=rand()%100+1; op=Operator(); if(op=='-') while(x<y) { x=rand()%100+1; y=rand()%100+1; } cout<<x<<op<<y<<"="<<endl; } void fraction() { int a,b,c,d; a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; char op; while(a<=b||c<=d) { a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; } op=Operator(); if(op=='-') while((b*c-a*d)<0) { a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; } cout<<b<<"/"<<a<<op<<d<<"/"<<c<<"="<<endl; } + void main() { srand(time(0)); int i,n,m; cout<< "请输入出题类型"<<endl; cout<< "1.整数四则运算"<<endl; cout<< "2.分数四则运算"<<endl; cin>>i; cout<< "请输入出题数目"<<endl; cin>>n; for(m=1;m<=n;m++) { if(i==1) integer(); else fraction(); } }