題目描述:
我們在個人作業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的效果,我現在有了深刻的體會,兩個人一起編程可以相互激勵、共同進步;在結對編程中會發現隊友在編程中的許多好的習慣和方法,也提高了自己的編程能力;結對編程更適用於解決方向性的問題;結對編程中雙方的互動可以利於思維的開啟,收獲頗多。