結對隊友學号:201421123036 201421123048
項目代碼:
https://git.coding.net/YJh_/Cal.git
題目描述:
我們在個人作業1中,用各種語言實作了一個指令行的四則運算小程式。進一步,本次要求把這個程式做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手機上的),成為一個有基本功能、一定價值的程式。在下面的功能需求中實作兩個:
- 記錄使用者的對錯總數,程式退出再啟動的時候,能把以前的對錯數量儲存并在此基礎上增量計算。
- 有計時功能,能顯示使用者開始答題後的消耗時間。
- 界面支援中文簡體/中文繁體/英語,使用者可以選擇一種;
需求分析:
- 在作業一中已經完成了四則運算的分數算法。
- 在控制台的輸入操作不夠人性化,使用GUI界面讓使用者使用更加友善。
- 在使用者使用程式做題時需要記錄使用者做題的對錯題數。
- 針對不同的使用者,需要用到不同的語言,繁體字,簡體字,英文版。
- 對于能力不同的使用者,需要有難易不同程度的題目。
- 如果需要測試完成題目所用的時候,需要有記錄做題的消耗時間。
功能分析:
- 基本功能
- GUI界面顯示程式
- 記錄做題時間
- 記錄使用者做題總數和正确題數
- 收集使用者的錯題集并顯示給使用者
- 提供簡體繁體英文界面
- 拓展功能
- 題目難度分為初級中級進階可供使用者選擇
- 在各個難度中還有整數和整數型,整數和分數型,分數和分數型
程式設計:
使用者操作運作流程:

主要分類:
Calculator類
程式測試
測試截圖:
部分代碼展示:
public class LoginMiddle {
float sum;
int dadui=0;
int dacuo=0;
int tishu;
int noanswer=0;
int summary=0;
String parten = "0.00";
DecimalFormat decimal = new DecimalFormat(parten);
String str;
static Timer timer = null;
static SimpleDateFormat df=new SimpleDateFormat("mm:ss");
long starttime;
long finishtime;
long duration;
long allduration;
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
LoginMiddle window = new LoginMiddle();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public LoginMiddle() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setTitle("實戰界面中級版兩個整數與一個分數型");
frame.setSize(750,230);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Label L1=new Label("總題數:",Label.RIGHT);
Label L2=new Label("題目:",Label.RIGHT);
Label L3=new Label("請輸入答案:",Label.RIGHT);
Label L4=new Label("答題情況:",Label.RIGHT);
Label L5=new Label("答對題數:",Label.RIGHT);
Label L6=new Label("答錯題數:",Label.RIGHT);
Label L7=new Label("答題時間:",Label.RIGHT);
final JButton B1=new JButton("開始");
final JButton B2=new JButton("下一題");
final JButton B3=new JButton("退出");
final JTextField T1=new JTextField(5);
final JTextField T2=new JTextField(10);
final JTextField T3=new JTextField(5);
final JTextField T4=new JTextField(20);
final JTextField T5=new JTextField(10);
final JTextField T6=new JTextField(10);
final JTextField T7=new JTextField(10);
JPanel panel=new JPanel();
JPanel panel0=new JPanel();
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
panel.add(panel0);
panel.add(panel1);
panel0.add(panel2);
panel0.add(panel3);
frame.getContentPane().add(panel,"Center");
L1.setFont(new java.awt.Font("宋體", 1, 14));
L2.setFont(new java.awt.Font("宋體", 1, 14));
L3.setFont(new java.awt.Font("宋體", 1, 14));
L4.setFont(new java.awt.Font("宋體", 1, 14));
L5.setFont(new java.awt.Font("宋體", 1, 14));
L6.setFont(new java.awt.Font("宋體", 1, 14));
L7.setFont(new java.awt.Font("宋體", 1, 14));
panel.setLayout(new FlowLayout());
panel0.setLayout(new GridLayout(1,2));
panel2.setLayout(new GridLayout(4,2,5,10));
panel3.setLayout(new GridLayout(4,2,10,10));
panel2.add(L1);
panel2.add(T1);
panel2.add(L2);
panel2.add(T2);
panel2.add(L3);
panel2.add(T3);
panel2.add(L4);
panel2.add(T4);
panel3.add(L5);
panel3.add(T5);
panel3.add(L6);
panel3.add(T6);
panel3.add(L7);
panel3.add(T7);
panel1.add(B1);
panel1.add(B2);
panel1.add(B3);
B3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "答題總題數為"+tishu+",答對題數為"+dadui+",答錯題數為"+dacuo+",未答題題數為"+noanswer+"。");
frame.setVisible(false);
new Middle();
}
});
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==27&&summary<tishu)
{
JOptionPane.showMessageDialog(null, "答題時間已到。答題總題數為"+(dadui+dacuo)+",答對題數為"+dadui+",答錯題數為"+dacuo+",未答題題數為"+(tishu-dacuo-dadui)+",答題使用時間:"+(allduration+duration)/1000+"秒。");
frame.setVisible(false);
new Middle();
}
String str=df.format(new Date(duration));
T7.setText(str);
}
}, 1000, 1000);
allduration=allduration+duration;
char a[]={'+','-','×','÷'};
char b[]={'+','-','×','÷'};
int c=(int)(Math.random()*4);
int d=(int)(Math.random()*4);
int f=(int)(Math.random()*100);
int g=(int)(Math.random()*99+1);
int h=(int)(Math.random()*99+1);
int l=(int)(Math.random()*99+1);
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;
}
});
B2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(summary==tishu)
{
JOptionPane.showMessageDialog(null, "答題已完成。答題總題數為"+tishu+",答對題數為"+dadui+",答錯題數為"+dacuo+",未答題題數為"+noanswer+",答題使用時間:"+allduration/1000+"秒。");
frame.setVisible(false);
new Middle();
}
else
{
T2.setText(null);
T3.setText(null);
T4.setText(null);
}
}
});
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(false);
}
PSP:
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student(/day) | Time (%)(/day) |
Planning | 計劃 | 8 | 15 |
· Estimate | 估計這個任務需要多少時間 | 7 | |
Development | 開發 | 6 | |
· Analysis | 需求分析 (包括學習新技術) | 1 | |
· Design Spec | 生成設計文檔 | ||
· Design Review | 設計複審 | ||
· Coding Standard | 代碼規範 | ||
· Design | 具體設計 | 5 | 4 |
· Coding | 具體編碼 | 2 | |
· Code Review | 代碼複審 | ||
· Test | 測試(自我測試,修改代碼,送出修改) | 3 | |
Reporting | 報告 | ||
·Test Report | 測試報告 | ||
· Size Measurement | 計算工作量 | ||
·Postmortem & Process Improvement Plan | 并提出過程改進計劃 |
小結感受:
- 結隊程式設計真的能夠帶來1+1>2的效果,編寫和實作這個程式過程很漫長,兩個人的征讨也挺多的,一開始覺得兩個人合作好像很麻煩,進度很很慢,可是到了過了幾天,兩個人的磨合期過後,真的帶來了1+1>2的效果。
- 在結對程式設計一開始我是扮演領航員的角色的,在一邊審查隊友的代碼和提供一些界面上的設計建議。
- 在編寫代碼裡面我是負責中級難度的編寫的,主要是模仿隊友初級難度來編寫的,因為基礎相對比較差。在我自己編寫代碼的時候,隊友會時常提醒我變量名稱的命名,在Eclipse編寫中,經常出現正常的錯誤,還有一些函數的使用,比如标簽按鈕設定位置大小背景燈。有點拖累了隊友,有點不好意思哦。
- 首先一開始結對一起程式設計程式,對于我來說程式設計十分困難,基本功太差了,但是在中間要是有什麼好的建議和想法,都有會利用給人提意見的方式:給人一個漢堡包,給隊友一些意見,換個好的角度來給隊友評價
- 最後總結一點,在這段漫長又痛苦的一周裡,學到了很多,特别是兩個人合作的重要性,還有對GUI的學習認識,雖然可能以後不從事程式設計方面,學到了這些也覺得很有意義。