一.题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
运算符为 +, −, ×, ÷并且要求能处理用户的输入,并判断对错,打分统计正确率,要求能处理用户输入的真分数, 如 1/2, 5/12 等
用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
二.需求分析
a.需要能够实现对整数和分数的四则运算;
b.能够处理用户输入,能够对用户输入的答案做出比较,求正确率;
c.能够处理用户输入的真分数;
d.随机生成练习题;
e.最好可以让用户自行选择难度,低年级就做简单四则运算,高年级就加入分数,负数等;
三.程序实现
程序实现大体可以分为3个阶段:
①设计整体架构,用选择结构(if或者Swith)对整数和分数分别处理;
②实现整数四则运算的程序编写;
③实现对真分数四则运算的程序编写。
四.代码说明
①整数部分功能较为简单,随机生成2个整数以及整数四则运算方法的编写,低年级不应出现整数过大,负数,不整除情况。(关键代码)
for (int i = 1; i <= N; i++) {
int a = (int) (Math.random() * 10 + 1);/*防止出现不好处理的0,很不严谨不可取*/
int b = (int) (Math.random() * 10 + 1);
int c = (int) (Math.random() * 4);
int result = 0;
switch (c) {
case 0:
System.out.print("第" + i + "题" + ": ");
System.out.print(a + " + " + b + " = ");
result = a + b;
break;
case 1:
if (a < b) {
int t = a;/*保证不出现负数*/
a = b;
b = t;
}
System.out.print("第" + i + "题" + ": ");
System.out.print(a + " - " + b + " = ");
result = a - b;
break;
case 2:
System.out.print("第" + i + "题" + ": ");
System.out.print(a + " × " + b + " = ");
result = a * b;
break;
case 3:
System.out.print("第" + i + "题" + ": ");
if (a < b) {
int t = a;
a = b;
b = t;
}
if (a % b != 0) {
a = (int) (Math.random() * 10 + 1) * b;/*保证能整除*/
}
System.out.print(a + " ÷ " + b + " = ");
result = a / b;
break;
}
②真分数部分比较复杂,进行分数的加减运算时,需要进行分母的通分,结果得进行约分,保证结果是最简分数(关键代码)。
1.求最大公约数函数:
package yunsun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Scanner;
public class lastdemo {
private static int Gcd(int num1, int num2) {// 求最大公约数
num1 = Math.abs(num1);// 负数取绝对值
num2 = Math.abs(num2);
int min = Math.min(num1, num2);
int maxSubmultiple = 1;
for (int i = min; i >= 1; i--) {
if (num1 % i == 0 && num2 % i == 0) {
maxSubmultiple = i;
break;
}
}
return maxSubmultiple;
}
2.随机生成真分数,以及真分数的四则运算方法具体实现以及用户输入真分数处理,标准答案与用户输入答案比对,正确率计算参见源码。
五.测试运行
1.低年级简单整数四则运算测试结果图:
2.中高年级真分数四则运算测试结果图:
七.心得体会
java编程基础太差,遇到的问题太多了。每次发现一个小问题都要花费很多时间学习,希望经过今后的多练习能有所改善吧。哇,这个可能是别人的一个小小的作业,对于我,可能是个“小课设”。悲哀。。。
附源代码:https://git.coding.net/a434961671/goujian.git