小组成员、学号:杨立鑫 201421123100 杨爱清201421123099
需求分析:
在原来的程序基础上,我认为还需要以下几个功能:
1.能够自由选择题目个数,能够生成加减乘除运算,包括分数运算。此外最好能实现阶乘运算
2.最好能给定时间记时,在完成答题时给出答题时间,有利于在答题效率上给出正确评估。
3.能够实现中英切换,增加适用人群
4.能够设计出美观的图形界面,更加亲和用户。
三、程序设计:
1、完成计时功能。
2、实现图形界面。
二、程序设计
对上次程序分的四个类,我根据期望对其进行了优化:
上次:
1.Calculate
用于实现加减乘除运算,以及数字大小的比较
2.Dofrac
用于检查答案,随机创建分数,求最大公约数,生成算式并求得计算结果
3.Fraction
用于生成分数与分数化简
4.Generator
主类,生成主界面
优化:
1.Frame
经过实际变成优化,去掉不必要的代码,将Calculate,Dofrac,Fraction合为一个大类
在该类中实现的图形界面的设计,以及计时,出题,判断对错,以及异常处理(输入异常)等函数。
不仅实现了加减乘除,又添加了阶乘运算。
2.Generator
主类。生成主界面
三、代码展示
package javaapplication8;
import javax.swing.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
class Frame extends JFrame implements ActionListener
{
int a, b, c, count, num;//a,b分别是第一个操作数,第二个操作数,c是存放用户输入的答案,count是题目总数,num是用于存放代表运算符的数
int t=0,f=0,sum=0,s=1;//s表示阶乘结果
float d,d1;//d是用于存放除法结果,d1是用于处理除法结果中保留小数点后两位
int counter=0;//统计答题个数
Timer time;
int t1 = 0;
JTextField T;//定义一个文本
JLabel L1 = new JLabel("请输入题目个数(1-5):");
JTextField T1 = new JTextField(5); //放题目个数
JButton B3 = new JButton("开始");
JTextField T2 = new JTextField(10); //设置运算式
JTextField T3 = new JTextField(10); //获取输入答案
JTextField T4 = new JTextField(10);//存放答案提示
JButton B1 = new JButton("确定");
JButton B2 = new JButton("下一题");
Frame() {
T=new JTextField(10);//计时
T.setEditable(false);
time = new Timer(1000, this);
time.start();
T.setText(setTime(t1));
this.setTitle("四则运算");
this.setSize(280, 200);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel p2 = new JPanel();
JPanel p1 = new JPanel();
p2.add(L1);
p2.add(T1);
p2.add(B3);
p2.add(T2);
p2.add(T3);
p2.add(T4);
p2.add(T);
p1.add(B1);
p1.add(B2);
add(p2, "Center");
add(p1, "South");
B3.addActionListener(new ActionListener() { //按钮B3表示开始
public void actionPerformed(ActionEvent e) {
boolean flag=false;
Object bj = e.getSource(); // 获得事件源
if (bj == B3) {
try{ //如果输入字符,抛出异常,提示错误
count = Integer.parseInt(T1.getText()); //将文本中获取的字符串转换为整型
}
catch(Exception f)
{
flag=true;
}
if(flag)
{
JOptionPane.showMessageDialog(null,"输入有误,请输入数字!");
}
if(count>5)
{
JOptionPane.showMessageDialog(null, "题目个数不能超过五个!请重新输入。");
}
if(count<=5)
{
num = (int) (Math.random() * 5);
a = (int) (Math.random() * 200) - 100;
b = (int) (Math.random() * 200) - 100;
if (num == 0)//num为0时,是加法运算
{
if (a < 0 && b < 0) //判断a,b的正负并给负数加括号
{
T2.setText("(" + a + ")" + "+(" + b + ")=");
}
else if (a < 0 && b > 0)
{
T2.setText("(" + a + ")" + "+" + b + "=");
}
else if (a > 0 && b < 0)
{
T2.setText(a + "+(" + b + ")=");
}
else
{
T2.setText(a + "+" + b + "=");
}
c = a + b;
//处理按钮监听事件
} else if (num == 1) //num为1表示减法运算
{
if (a < 0 && b < 0)
{
T2.setText("(" + a + ")" + "-(" + b + ")=");
}
else if (a < 0 && b > 0)
{
T2.setText("(" + a + ")" + "-" + b + "=");
}
else if (a > 0 && b < 0)
{
T2.setText(a + "-(" + b + ")=");
}
else
{
T2.setText(a + "-" + b + "=");
}
c = a - b;
} else if (num == 2) { //num为2表示乘法运算
if (a < 0 && b < 0) {
T2.setText("(" + a + ")" + "*(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "*" + b + "=");
} else if (a > 0 && b < 0) {
T2.setText(a + "*(" + b + ")=");
} else {
T2.setText(a + "*" + b + "=");
}
c = a * b;
}
else if (num == 3&&b!=0) { //num为3表示除法运算,并且要考虑除数不能为0的情况,因此b!=0
if (a < 0 && b< 0) {
T2.setText("(" + a + ")" + "/(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "/" + b + "=");
} else if (a > 0 && b< 0) {
T2.setText(a + "/(" + b + ")=");
} else {
T2.setText(a + "/" + b + "=");
}
d= (float)a/(float)b; //将整型a,b强制转换为浮点型,保证结果正确
BigDecimal bg = new BigDecimal(d); //将除法结果保留小数点后两位
d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
else
{
a=(int)(Math.random()*10);
T2.setText(a+"!=");
int i;
if(a==0||a==1)
{
s=1;
}
else
{
for(i=1;i<=a;i++)//计算阶乘
{
s=s*i;
}
}
}
}
}
}
});
B2.addActionListener(new ActionListener() { //B2表示下一题
public void actionPerformed(ActionEvent e) {
Object bj = e.getSource(); // 获得事件源
if (bj == B2) {
int a, b, num, i = 1;
if (i < count) {
T3.setText(null);//当按钮按下一题时就将T3与T4的内容更新
T4.setText(null);
num = (int) (Math.random() * 5);
a = (int) (Math.random() * 200) - 100;
b = (int) (Math.random() * 200) - 100;
i++;
if (num == 0) {
if (a < 0 && b < 0) {
T2.setText("(" + a + ")" + "+(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "+" + b + "=");
} else if (a > 0 && b < 0) {
T2.setText(a + "+(" + b + ")=");
} else {
T2.setText(a + "+" + b + "=");
}
c = a + b;
} else if (num == 1) {
if (a < 0 && b < 0) {
T2.setText("(" + a + ")" + "-(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "-" + b + "=");
} else if (a > 0 && b < 0) {
T2.setText(a + "-(" + b + ")=");
} else {
T2.setText(a + "-" + b + "=");
}
c = a - b;
} else if (num == 2) {
if (a < 0 && b < 0) {
T2.setText("(" + a + ")" + "*(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "*" + b + "=");
} else if (a > 0 && b < 0) {
T2.setText(a + "*(" + b + ")=");
} else {
T2.setText(a + "*" + b + "=");
}
c = a * b;
}
else if (num == 3&&b!=0) {
if (a < 0 && b < 0) {
T2.setText("(" + a + ")" + "/(" + b + ")=");
} else if (a < 0 && b > 0) {
T2.setText("(" + a + ")" + "/" + b + "=");
} else if (a > 0 && b < 0) {
T2.setText(a + "/(" + b + ")=");
} else {
T2.setText(a + "/" + b + "=");
}
d= (float)a/(float)b;
BigDecimal bg = new BigDecimal(d);
d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
else
{
a=(int)(Math.random()*10);
T2.setText(a+"!=");
if(a==0||a==1)
{
s=1;
}
else
{
for(i=1;i<=a;i++)//计算阶乘
{
s=s*i;
}
}
}
counter++;
if(counter>=count)//判断题目是否答完,答完了就弹出一个提示题目答完并给出答题时间的对话框
{
JOptionPane.showMessageDialog(null, "题目已答完,答对了"+t+"道题,答错了"+f+"道题\n\n总分是"+sum+"\n\n总用时为:"+t1+"秒");
}
}
}
}
});
B1.addActionListener(new ActionListener() { //按钮B1表示确定
public void actionPerformed(ActionEvent e) {
Object bj = e.getSource(); // 获得事件源
if (bj == B1) {
if (d1== Float.parseFloat(T3.getText()) || c == Float.parseFloat(T3.getText()) || s ==Float.parseFloat(T3.getText())) {
T4.setText("恭喜你,答对了");
t=t+1;
sum=sum+20;//每答对一题加20分
} else {
T4.setText("抱歉,你答错了");
f=f+1;
}
}
}
});
}
public void actionPerformed(ActionEvent e) {
t1= t1 + 1; //累加时间
T.setText(setTime(t1));
}
public String setTime(int t1) {//累加时间
int hour, minute, second, a;
String mytimer, strsec, strmin, strhour;
t1=t1 % (60 * 60 * 24);
second = t1 % 60;
a = t1/ 60;
minute = a % 60;
hour = a / 60;
if (second <= 9) {
strsec = "0" + String.valueOf(second);
} else {
strsec = String.valueOf(second);
}
if (minute <= 9) {
strmin = "0" + String.valueOf(minute);
} else {
strmin = String.valueOf(minute);
}
if (hour <= 9) {
strhour = "0" + String.valueOf(hour);
} else {
strhour = String.valueOf(hour);
}
mytimer = "计时: " + strhour + ":" + strmin + ":" + strsec;
return mytimer;
}
}
四、程序运行
PSP
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student(/hour) | Time (%)(/hour) |
· Planning | 计划 | 2 | 1 |
· Estimate | 估计这个任务需要多少时间 | 15 | 13 |
· Analysis | 需求分析 (包括学习新技术) | 2 | 1.5 |
· Coding Standard | 代码规范 | 0.5 | 0.5 |
· Design | 具体设计 | 1.5 | 1 |
· Coding | 具体编码 | 10 | 7 |
· Test | 测试(自我测试,修改代码,提交修改) | 2 | 1.5 |
Reporting | 报告 | 1 | 2 |
小结:
看到这周的实验题目之后我们就马上对实验的需求进行了分析,因为我的代码是用c来实现,所以经过一番讨论之后,我们决定用立鑫的java代码来实现这次实现,因为java能更好的实现图形界面。
过程中我们有很多不同的想法,产生了很多的分歧,经过分析和比较之后,我们选择了大家都能接受的解决方案,没有钻牛角尖,毕竟1+1还是大于1的,要充分认识这一点,团结合作,才能将两个人的力量发挥到最
大!后来经过我们两个人的共同努力,终于实现了图形界面和计时功能,但是由于时间问题,我们还没有实现四则运算的中英文切换,但是我们已经从别的小组那里学习到了如何做,后期我们会进行完善,通过不断的
学习,不断的努力,将项目做的更好。
这几天天气好冷,敲代码手好冷····,啥时候能天气转热,一边吃着西瓜一边讨论代码岂不快哉?QAQ