结对编程--四则运算生成器(093,094)
题目描述:
我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
1.记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
2.有计时功能,能显示用户开始答题后的消耗时间。
3.界面支持中文简体/中文繁体/英语,用户可以选择一种;
结对分工:
何琴琴---093 1、答题计时功能 2、语言切换功能
翁彬妹---094 1、对错总数功能 2、代码规范
需求分析:
本次编程要求实现计时功能,能够记录用户答题的消耗时间,可以在用户开始答题时开始计时,然后提交答案时结束计时,这样两次的差值就是答题所用的时间。界面支持中文简体/中文繁体,其实就是在实现简体的基础上将显示界面和结束时答题错对数加入繁体版格式显示,而内部使用的函数等是没有变化的。
功能分析:
-
基本功能:
- 实现简体版的具有gui界面,同时支持整数与真分数,能控制生成题目的个数,统计对错数的随机四则运算
-
扩展功能
- 实现繁体版的随机四则运算;
- 实现计时功能,能显示用户每次运算的时间;
- 当答题超时或答题者自动退出时会弹出答题结束的对话框并退出
-
高级功能(暂时还没有)
程序设计:
代码展示:
根据文本框输入的数值判断答案的对错(简体版),而繁体版的只是将显示界面的简体中文切换为繁体字,判断对错的函数并没有任何改变。
T3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
str= decimal.format(sum);
if(Float.parseFloat(str)==Float.parseFloat(T3.getText()))
{
T4.setText("恭喜你!答对了!");
dadui++;
T5.setText(String.valueOf(dadui));
}
else
{
T4.setText("真遗憾!答错了!正确答案是"+Float.parseFloat(str));
dacuo++;
T6.setText(String.valueOf(dacuo));
}
noanswer=tishu-dadui-dacuo;
}
});
在点击开始按钮后,开始随机生成题目并且开始计时,每答完一道题目,会使用currentTimeMillis()函数记录下当前答题的时间,然后全部题目答题完毕后,将几次答题时间相加,显示出答题总时间。当答题超时或自动退出时会弹出答题结束的对话框并退出到前一个界面。
B1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
tishu=Integer.parseInt(T1.getText());
noanswer=tishu-dadui-dacuo;
summary++;
timer = new Timer();
finishtime=System.currentTimeMillis();
starttime=finishtime;
timer.schedule(new TimerTask()
{
public void run() {
finishtime=System.currentTimeMillis();
duration=finishtime-starttime;
if(duration/1000==60&&summary<tishu)
{
JOptionPane.showMessageDialog(null, "答题时间已到。答题总题数为"+(dadui+dacuo)+",答对题数为"+dadui+",答错题数为"+dacuo+",未答题题数为"+(tishu-dacuo-dadui)+",答题使用时间:"+(allduration+duration)/1000+"秒。");
frame.setVisible(false);
new 初级版题型选择();
}
String str=df.format(new Date(duration));
T7.setText(str);
}
}, 1000, 1000);
allduration=allduration+duration;
char a[]={'+','-','×','÷'};
int b=(int)(Math.random()*4);
int c=(int)(Math.random()*100);
int d=(int)(Math.random()*99+1);
int g=(int)(Math.random()*100);
int f=(int)(Math.random()*99+1);
if(a[b]==a[0])
{
T2.setText(d+"/"+c+String.valueOf(a[b])+g+"/"+f);
sum=(float)d/c+(float)g/f;
}
else if(a[b]==a[1])
{
T2.setText(d+"/"+c+String.valueOf(a[b])+g+"/"+f);
sum=(float)d/c-(float)g/f;
}
else if(a[b]==a[2])
{
T2.setText(+d+"/"+c+String.valueOf(a[b])+"("+g+"/"+f+")");
sum=((float)d/c)*((float)g/f);
}
else if(a[b]==a[3])
{
T2.setText(d+"/"+c+String.valueOf(a[b])+"("+g+"/"+f+")");
sum=((float)d/c)/((float)g/f);
}
}
});
当按初级版按钮时,进入初级版的选题界面,其他界面的按钮代码与此类似。
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
getFrame().setVisible(false);
new 初级版题型选择();
}
});
当按繁体版按钮时,进入繁体版的界面1。
button_2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
getFrame().setVisible(false);
new 界面1();
}
});
点击帮助按钮,会出现帮助的显示框,简单介绍整个程序的用途。
JTextPane textPane = new JTextPane();
textPane.setFont(new Font("宋体", Font.PLAIN, 23));
textPane.setText(" 这是一个小学生四则运算生成器!");
panel.add(textPane);
frame.getContentPane().setLayout(groupLayout);
//设置窗口的位置
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int w1 = screenSize.width;
int h = screenSize.height;
int x1 = w1/3;
int y1 = h/5;
frame.setLocation(x1,y1);
frame.setVisible(true);//设置窗口的可见性
frame.setResizable(true);//设置窗口大小的可变性
程序运行:
小结感受:
先来一片面包:基于我们上次用的是c语言来实现控制台的功能而windows api 薄弱,所以放弃第一次的作业编程方法,采用java编写。毕竟所有的都是相通的,java容易实现界面。再把肉放上:在c语言吸取基本功能的实现+-*/分数等。再来一片面包:对界面和函数功能的整合。编程过程中,彬妹和我先一起讨论界面如何设置以及该程序需要实现怎样的功能,我们交替着当领航员和驾驶员,一个人写,另一个就在旁审查、指导,有分歧时在谈论,这样更容易发现问题和解决问题,发挥出结对编程1+1>2的作用出来。对于本次结对编程是否真的能够带来1+1>2的效果,我现在有了深刻的体会,两个人一起编程可以相互激励、共同进步;在结对编程中会发现队友在编程中的许多好的习惯和方法,也提高了自己的编程能力;结对编程更适用于解决方向性的问题;结对编程中双方的互动可以利于思维的开启,收获颇多。