结对对象与其博客链接
需求分析
(一)功能需求
1.自动生成题目(本周已完成)
可生成包含不同运算符个数的题目
2.题目运算(判题)(这周先做了真分数,运算和后缀计算打算下周做)
实现中缀表达式转为后缀表达式并计算
判断用户答题正误,并输出正确结果
3.支持真分数(第二周内容,本周提前做了)
实现分数算式的计算
3.题目去重(扩展需求)
实现对自动生成表达式中相同题目的去重
(二)对需求的理解:
1.能随机生成多道四则运算题目,可由用户输入控制
2.支持整数和真分数(第二周内容,本周已做)
3.支持多运算符,运算符个数可由用户输入控制
4.能够判断正误,错误时能提醒并输出正确答案(这周先做了真分数,运算和后缀计算打算下周做)
5.可以计算正确率
设计思路
1.我们对支持多运算符的理解就是为:在输出前,由用户输入所要求的运算符个数,然后程序运行自动给出相应算式。
2.提前做了第二周真分数的内容,我们没有做出选项来确认用户是否需要进行真分数练习,希望下周可以对此进行优化,计算和后缀转换的内容打算下周做。
3.由于学习c语言的时候曾设计过类似于这样的四则运算的程序,可以说思路很快就捋顺了,具体怎么实施则经过商讨后翻译成Java语言。
4.总体思路就是这样了,具体思路见下面的UML类图。
UML类图
实验过程中的关键代码解释
题目生成代码(Timushengcheng.java)
public class Timushengcheng {
String[]Shengchengtimu;//设置生成题目的数组
int fuhaoshu,num;//接收用户所需的设定(题目个数、符号数个数)
public Timushengcheng(int num ,int fuhaoshu)//构造题目生成函数
{
this.num=num;
this.fuhaoshu=fuhaoshu;
Shengchengtimu=new String[num];
}
public String questionfuhaoshu(int a)//生成单个用户要求运算符个数的题目的方法
{
String express="";
String[]OC={"+","-","×","÷"};
for (int c=0;c
Zhenfenshu b = new Zhenfenshu();
String d=b.getZhenfenshu();
String e=OC[(int) (Math.random() * 4)];
while (d=="0"&&e=="÷") {
Zhenfenshu f=new Zhenfenshu();
d = f.getZhenfenshu();
}
express +=d+" "+e+ " ";
}
Zhenfenshu c=new Zhenfenshu();
String e=c.getZhenfenshu();
while (express.charAt(4*fuhaoshu-1)=='÷'&&e=="0")
{
Zhenfenshu d=new Zhenfenshu();
e=d.getZhenfenshu();
}
express+=e+" "+"=";
return express;
}
public void QuestionNum()//生成用户要求个数的题目,且将其放入生成题目数组中保存的方法
{
Timushengcheng F=new Timushengcheng(num,fuhaoshu);
for(int a=0;a
Shengchengtimu[a]=F.questionfuhaoshu(fuhaoshu);
}
public String[] getShengchengtimu()//返回生成题目数组的方法
{
return Shengchengtimu;
}
public String getShengchengtimu2(int a) //返回数组中指定索引处的方法
{
String b;
b=Shengchengtimu[a];
return b;
}
public String toString() //输出生成题目数组中表达式的方法
{
String a="";
for (int b=0;b
a+=Shengchengtimu[b]+"\n";
return a;
}
}
真分数生成代码(Zhenfenshu.java)
public class Zhenfenshu {
int numerator, denominator;
public Zhenfenshu() //设置真分数生成函数
{
numerator= (int) (Math.random()*51);
denominator= (int) (Math.random()*51);
if(denominator==0)
denominator=1;
xianzhi1();
}
public void xianzhi1()//主要使分母不为零
{
if (numerator != 0) {
int common = xianzhi2(Math.abs(numerator), denominator);
numerator = numerator / common;
denominator = denominator / common;
}
}
private int xianzhi2(int num1, int num2) //主要使分母大于分子(真分数)
{
while (num1 != num2)
if (num1 > num2)
num1 = num1 - num2;
else
num2 = num2 - num1;
return num1;
}
public String getZhenfenshu() //化简得到的分数直至最简
{
String result;
if(numerator==0)
result="0";
else
if(denominator==1)
result=numerator+"";
else
result=numerator+"/"+denominator;
return result;
}
}
```
测试方法
测试程序代码(TimushengchengTest.java)
import java.util.Scanner;
public class TimushengchengTest {
public static void main(String[] args){
int num,fuhaoshu;
Scanner scan=new Scanner(System.in);
System.out.print("题目个数为:");
num=scan.nextInt();
System.out.print("题目中的运算符个数为:");
fuhaoshu=scan.nextInt();
Timushengcheng a=new Timushengcheng(num,fuhaoshu);
a.QuestionNum();
System.out.println("生成的"+num+"个表达式为:");
System.out.println(a);
}
}
运行结果截图