个人作业1——四则运算题目生成程序(基于控制台)
码云地址:https://coding.net/u/lwy1023/p/rg/git/blob/master/Demo01.java
1.需求分析:
a.完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序。除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
b.运算符为 +, −, ×, ÷
c.并且要求能处理用户的输入,并判断对错,统计正确率。
d.要求能处理用户输入的真分数, 如 1/2, 5/12 等
e.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目,Myapp.exe -n 10
- 功能设计:
a.随机生成两个整数或真分数
b.实现+、-、*、/ 四则运算
c.可判断输入答案的对错并统计正确率
3.设计实现:
本程序有一个Demo01类,主要分为三大块内容,主函数、随机生成整数和分数以及计算整数和分数。程序开始执行时先利用随机数0和1分别切换到分数计算和整数计算模式,接着再运行。其中涉及到main中的判断输入答案正确与否,真分数的化简,以及运算符的随机生成等方法。下面是部分重要代码:
随机生成分数、通配符、整数
public static String CreateOperator() {// 返回操作符
Random random = new Random();
String operator = "";
int flag = random.nextInt(4);
switch (flag) {
case 0:
operator = "+";
break;
case 1:
operator = "-";
break;
case 2:
operator = "*";
break;
case 3:
operator = "/";
break;
}
return operator;
}
public static int CreateInt() {// 返回一个整数
Random random = new Random();
return random.nextInt(10) + 1;
}
整数计算:
public static int computeInt(int data1, int data2, String operator) { // 整数计算
int result = 0;// 保存运算结果
if (operator.equals("+")) {
result = data1 + data2;
} else if (operator.equals("-")) {
result = data1 - data2;
} else if (operator.equals("*")) {
result = data1 * data2;
} else {
result = data1 / data2;
}
return result;
}
分数计算:
public static String computeFenshu(int data1, int data2, int data3, int data4, String operator) { // 分数计算,四个参数,一个运算符
String result = "";
if (operator.equals("+")) {
result = fracAdd(data1, data2, data3, data4);// 分数相加
} else if (operator.equals("-")) {
result = fracSub(data1, data2, data3, data4);// 分数相减
} else if (operator.equals("*")) {
result = fracMul(data1, data2, data3, data4);// 分数相乘
} else {
result = fractDiv(data1, data2, data3, data4);// 分数相除
}
return result;
}
static String fracAdd(int data1, int data2, int data3, int data4) {
// 以下代码能够在控制台上显示结果
// 需要调用求最大公约数的函数
// 需要调用求最小公倍数的函数
int denominator;
int numerator;
if (data2 == data4) // 分母相同时加分子
{
denominator = data2;
numerator = data1 + data3;
} else // 否则同分比较分子
{
denominator = data2 * data4;
numerator = data1 * data4 + data2 * data3;
}
int gcd = gcd(numerator, denominator);
denominator = denominator / gcd;
numerator = numerator / gcd;
String result = numerator + "/" + denominator;
return result;
}
static String fracSub(int data1, int data2, int data3, int data4) {
// 以下代码能够在控制台上显示结果
// 需要调用求最大公约数的函数
int denominator;
int numerator;
if (data2 == data4) // 分母相同时加分子
{
denominator = data2;
numerator = data1 - data3;
} else // 否则同分比较分子
{
denominator = data2 * data4;
numerator = data1 * data4 - data2 * data3;
}
int gcd = gcd(numerator, denominator);
denominator = denominator / gcd;
numerator = numerator / gcd;
String result = numerator + "/" + denominator;
return result;
}
static String fracMul(int data1, int data2, int data3, int data4) {
// 以下代码能够在控制台上显示结果
// 需要调用求最大公约数的函数
int denominator;
int numerator;
denominator = data2 * data4;
numerator = data1 * data3;
int gcd = gcd(numerator, denominator);
denominator = denominator / gcd;
numerator = numerator / gcd;
String result = numerator + "/" + denominator;
return result;
}
static String fractDiv(int data1, int data2, int data3, int data4) {
// 以下代码能够在控制台上显示结果
// 需要调用求最大公约数的函数
int denominator;
int numerator;
numerator = data1 * data4;
denominator = data2 * data3;
int gcd = gcd(numerator, denominator);
denominator = denominator / gcd;
numerator = numerator / gcd;
String result = numerator + "/" + denominator;
return result;
}
判断输入答案正确错误:
if (choice == 1) {
int result = 0;
int data1 = CreateInt();
int data2 = CreateInt();
String op;
op = CreateOperator();
System.out.println(data1 + " " + op + " " + data2 + " " + "=");
result = computeInt(data1, data2, op);
Scanner Answer = new Scanner(System.in);
int answer = Answer.nextInt();
if (result == answer) {
System.out.println("正确");
righttext++;
} else {
System.out.println("错误");
errortext++;
}
4.程序测试:
自我评价:
本次设计让我深刻意识到了自己编程能力的不足,在很多基础的语法和结构上吃了亏,算法不清晰导致出现了很多细节上的问题,以及最后逻辑错误的调整与更正,今后还要多加努力,让自己的代码更加完善。
PSP: