您的位置:首页 > 其它

软件工程第二个程序:“像阿超那样,花20分钟写一个能自动生成小学四则运算题目的 ‘软件’”的功能扩充...

2016-03-12 17:11 162 查看
原文链接:https://www.geek-share.com/detail/2668773861.html

软件工程第二个程序:“像阿超那样,花20分钟写一个能自动生成小学四则运算题目的 ‘软件’”的功能扩充

四则运算的题目一般含有两个或两个以上运算符号及括号,可以计算出为一个数的结果。
生成四则运算题目,先来设置下数量,格式,数值范围,再问问负数有没有,余数出不出,分数和小数呢,接着就开始使用 随机生成数函数 生成一个有范围的随机数,再配上运算符,然后输出整个题目,有的在生成题目的时候计算出答案,保存起来;有的在输出题目后 记录题目,对题目进行计算得出结果。接着循环。。。循环结束 给出答案,或判断对错。

实现起来可能会遇到点困难,问题大多集中在括号的使用上,顺序生成的题目里不好插入括号,也不便计算结果。这时,有的同学想起了编译方法课中所讲的各种文法;有的同学模糊回忆起数据结构里的二叉树;还有的同学直接翻出了大一时的ACM习题集。没有问题,这些都可以解决眼前的困难。而我也找到了我的方法:

之前在生成两个数之间的加减运算题目时没多想什么,但现在要多生成几个数运算时,觉得应该用递归,循环嵌套,生长,生长?思路来了,于是编写quesGrow()函数(原谅我的英语水),然后依然用到Math.random()函数,递归一层又一层的生成随机数和运算符,定义全局变量来记录生成的随机数和运算符,顺便一步步的计算部分结果,指定递归结束的条件(提前设置 题中数的个数),随机的在某些层中加上括号,递归一层又一层的都结束后,把题目输出,结果也跟上吧,看看答案对不对。然后循环 输出几十上百道的。

这里每一道题目都用的是一边出题,一边计算结果的方式 得出答案的。还可以在一道题目完全给出的时候,报题目给另一独立的计算函数计算 再返回结果。这个时候,有上进心的同学一定会动手试着编写的,然而像我这样的选手第一时间想起了互联网。。。这种程序不会没人写的。呼呼

https://www.geek-share.com/detail/2553775111.html

甚合朕意 :) 用之。在包里加个类,把它粘上,在调用一下,加在后面看看计算的结果到底对不对。输出的结果还是可以的。

代码如下:

public class cQuestion {

public static String str = "";//保存题目的字符串
public static int num = 5;//每题中数的个数
public static int num_i = 0;//题目中已有数的个数
public static int numberRange = 100;//运算中数的最大取值
public static int sum = 0;//记录结果

public static void main(String[] args) {

for (int i = 0; i < 50; i++) {

GetQuestion();
System.out.print(i+1);
System.out.print(". " + str + "                ");
System.out.print(sum);
System.out.print("        ");
System.out.println(Arithmetic.arithmetic(str));//调用人家写好的一个类Arithmetic
}
}

private static void GetQuestion() {
//得到问题函数,在这里调用递归函数quesGrow()。
str = "";
sum = 0;
num_i = num;//用前都清零
quesGrow();
}

private static void quesGrow() {
//
if( num_i > 1 ) {
int j = num_i;//记录这是第几层调用。
num_i--;
quesGrow();//递归

int w=1+(int)(Math.random()*numberRange);//随机生成一个数
int t=1+(int)(Math.random()*100);//向左生成,还是向右生成,类似于树。
int f=1+(int)(Math.random()*100);//运算符控制

if(t>50)//新数往右加
{
if(f>50) {
sum = sum + w;
str = str + "+" + String.valueOf( w );
}
else {
sum = sum - w;
str = str + "-" + String.valueOf( w );
}
}
else//否则 新数往左加
{
if(f>50) {
sum = w + sum;
str = String.valueOf( w ) + "+" + str;
}
else {
if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是j=2
sum = w - sum;
str = String.valueOf( w ) + "-" + str;
}
else {
sum = w - sum;
str = String.valueOf( w ) + "-" + "(" +str+ ")";
//向左添减法的时候加括号,打破顺序计算模式。
}
}
}
}
else if( num_i == 1 ) {
//最后一层,也是输出的第一层
int w=1+(int)(Math.random()*numberRange);
sum = sum + w;
str = str + String.valueOf( w );
}
}
}

 

输出的结果:

图1

注释:先输出的是/序号和题目//接着是跟随题目一起计算出的结果//最后是调用网上已写好的程序计算出的结果/

》》》加上乘除没有太大区别,就是像减法那样 在左添除法的时候 记着加括号!《《《

上面那句话很错,乘除属于二级运算,新加入乘除必须在已生成的算式外加括号,不然按照预算规则:先算乘除,后算加减,结果就错了。

改了一上午,格式跟上面的一样,但始终没对齐 :(

图2

就酱:)

 

>>追加

我们知道生成四则运算并给出结果的方法有:“一边出题,一边计算”的 和 “题目出完,再计算”的,但还有一种新的想法:“先给答案,再凑题目”

现在我已经用这种方法实现了“出题 给结果”的功能。首先随机给出答案——一个数,对这个数进行递归操作,即对此数进行随机拆分,例如32,对32进行加法拆分就是:24+8;拆分成减法 就比如是60-28;乘除亦然。记录一个数和符号,把另一个数作为参数继续递归调用;指定递归停止节点。输出题目以及答案。

结果如下图,依然没对其:(

图3

注释:格式依然是 /先输出的是序号和答案凑出来的题目//然后随机生成的结果//最后是调用网上已写好的程序计算出的结果/

所有的代码都已上传到Coding。

Coding:https://coding.net/u/Mr_winter/p/ESE02/git

>>>期末记

像出题这样的程序 最后给出的从答案推题目的方法是最不错的 至少我是这么觉得 好控制

                                                                                                                                                          J.X.Dinosaur

 

转载于:https://www.cnblogs.com/duasonir/p/5269335.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐