小組成員、學号:楊立鑫 201421123100 楊愛清201421123099
沒想到結對程式設計還是做個人作業的那個程式,正好對于上個作業有許多理想的目标并沒有實作,此次正好借助團隊的力量,共同來完善這個程式。
一、需求分析
在原來的程式基礎上,我認為還需要以下幾個功能:
1.能夠自由選擇題目個數,能夠生成加減乘除運算,包括分數運算。此外最好能實作階乘運算
2.最好能給定時間記時,在完成答題時給出答題時間,有利于在答題效率上給出正确評估。
3.能夠實作中英切換,增加适用人群
4.能夠設計出美觀的圖形界面,更加親和使用者。
二、程式設計
對上次程式分的四個類,我根據期望對其進行了優化:
上次:
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 | 需求分析 (包括學習新技術) | 1.5 | |
· Coding Standard | 代碼規範 | 0.5 | |
· Design | 具體設計 | ||
· Coding | 具體編碼 | 10 | 7 |
· Test | 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 |
六、小結感受
我們兩個人經過反複商讨和修改,将之前的代碼進行了優化。在這個過程中,我們輪流扮演了領航員與駕駛員的角色。因為設計圖形界面,各個部分都要用圖形來展示,之前的拆分太細,并不利于界面展示,而且功能要與界面相聯系,是以我們對代碼進行了很大的改動。在這期間,我們都提出了很多想法,相當于又重新做了個四則運算生成器。雖然做的還算是比較基礎的圖形界面,但是我們都收獲很多,對以往并不熟練的圖形界面設計進行了鞏固,非常開心。
由于時間的問題,暫時沒有實作英文切換,但是我們已經向别的組學習如何實作,我們會對我們的代碼持續的進行優化。
(現在已經優化完畢,實作了中英切換功能,)
七、附錄
附1.碼雲位址
附2.小組程式設計過程的照片