結對項目-小學生四則運算系統(GUI)

Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git

夥伴博客:http://www.cnblogs.com/wangyy39/p/8763244.htmlhtml

目錄:

1、前言java

2、計劃時間——PSPgit

3、接口設計express

4、接口實現編程

5、性能分析數組

6、單元測試app

7、異常處理dom

8、模塊設計ide

9、模塊對接函數

10、她

11、結對編程思考

12、實際時間——PSP

十3、關於柱狀圖的實現

 

1、前言

首先我很感謝個人隊友——王玥瑩,謝謝她的努力,放棄本身休息的時間。

 

2、PSP

 

PSP

任務內容

計劃時間(min)

Planning

計劃

30

     Estimate

    估計這個任務須要多少時間,並規劃大體工做步驟

30

Development

開發

35*60+25

    Analysis

    需求分析

60

    Design Spec

    生成文檔

0

    Design Review

    設計複審

2*60

    Coding Standard

    代碼規範

10

    Design

    具體設計

12*60

    Coding

    具體編碼

2*8*60

    Code Review

    代碼複審

4*60

    Test

    測試

15

Reporting

報告

5.5*60

    Test Report

    測試報告

60

    Size Measurement

    計算工做量

30

   Postmortem& ProcessImprovement Plan

    過後總結, 並提出過程改進計劃

4*60

3、接口設計

信息隱藏指在設計和肯定模塊時,使得一個模塊內包含的特定信息(過程或數據),對於不須要這些信息的其餘模塊來講,是不可訪問的。

  在結對項目中,使用命令行模式執行和使用GUI界面執行出題部分時調用了同一部分核心代碼,在這裏我將出題這一部分信息隱藏,當改變人機交互模式的時候就不會給系統帶來全局性的影響。在個人程序中避免了A類調用B類的程序,B類有調用A類的程序這種狀況,這也是所謂的「循環依賴」,這種狀況會阻礙信息隱藏。

接口設計(Interface Design)

  在本項目設計接口過程當中,使用有意義的命名方式使接口的功能一目瞭然,加強了可讀性;類名和方法名也都使用了有意義的命名方式;在開發過程當中加好了註釋,方便本身和他人看懂代碼;在接口設計過程當中對相關原則也有了一些體會,主要參考如下內容:

https://blog.csdn.net/blueangle17/article/details/55049858

https://jingyan.baidu.com/article/066074d626ea09c3c21cb0b9.html

4、接口實現

咱們用到了按鈕監聽器和複選框監聽器以及文件監聽器,對於時間計算方面咱們選擇的是比較簡單可是簡陋的計時器。

5、性能分析

講真,這個項目對於咱們來講,能完成已是不遺餘力,在優化性能時儘管有些抵觸,但也算盡力,儘可能減小內存佔用率,減小嵌套循環和數組過大帶來的資源浪費。在生成計算式時,不符合要求的計算式須要捨棄,在數值較大時,十分容易形成資源的浪費,所以咱們在數值較大時,儘可能限制了乘法時數的大小,儘可能避免連續屢次棄用。

6、單元測試

測試Command類

設計思路:

  在main方法中實現了對輸入參數的解析和對輸入參數異常的報錯,因此測試這個部分的函數最主要的就是構造不一樣的異常狀況,同時也不要忘記測試參數正確時的狀況,由於這也是代碼的一部分(單元測試中第一次就是所以覆蓋率較低)。

 

 

單元測試代碼展現(測試Command.java):

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;


public class CommandTest {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testNewExpSome() {
        for(int i=0;i<6;i++){
            Command.expression(false, 200, 20, 6);
        }
        for(int i=0;i<24;i++){
            Command.expression1(true, 200, 20, 4);
            Command.exprission2(true, 200, 20, 4);
            Command.expression3(true, 200, 20, 4);
        }

        System.out.println("Command程序正常!");
    }

    @Test
    public void testDivideExactly() {

    }

}

CommandTest

 

7、異常處理:

if(radioButtonMenuItem01.isSelected()){flag='a';}
                        if(radioButtonMenuItem02.isSelected()){flag='b';}
                        if(radioButtonMenuItem03.isSelected()){flag='c';}
                        String n = JOptionPane.showInputDialog(
                                frame,
                                "輸入題目的數量(1-1000):"
                        );
                        String m = JOptionPane.showInputDialog(
                                frame,
                                "輸入數值範圍(1-10000):"
                        );
                        String z = JOptionPane.showInputDialog(
                                frame,
                                "輸入符號數量(1-10):"
                        );
                        if(n==null||n.equals("")&&m==null||m.equals("")&&z==null||z.equals("")){
                            textArea.append("取消生成,請檢查數值\n");
                        }
if(arithExpress.isEmpty()){
                            JOptionPane.showMessageDialog(
                                    frame,
                                    "沒有讀取到默認題庫,請先生成或者打開本地題庫",
                                    "消息標題",
                                    JOptionPane.WARNING_MESSAGE
                            );

 

 

8、模塊設計

 

 導航頁和得到出題參數頁使用了同種方式來生成用戶界面,表明導航頁和出題參數頁的類繼承了JFrame類,在內部類中加入頁面須要的各類組件,並將這個內部類的對象加入到外部類的實例中,在這裏以導航頁的代碼爲例展現這種方式(因代碼太長因此只展現一部分):

 

CalFrame frame=new CalFrame();
                DoFile doFile=new DoFile();
                StrPro strPro=new StrPro();
                Expression expression=new Expression();
                arithExpress=doFile.ReadFile("./result.txt");//默認從當前目錄讀取題庫

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
                frame.setTitle("小學四則運算測試");

                JMenuBar menuBar = new JMenuBar();

                JMenu sysMenu = new JMenu("系統");
                JMenu chooseMenu = new JMenu("題型選擇");
                JMenu aboutMenu = new JMenu("關於");

                menuBar.add(sysMenu);
                menuBar.add(chooseMenu);
                menuBar.add(aboutMenu);

                JPanel panel = new JPanel(new BorderLayout());

                JPanel centerPanel = new JPanel(new BorderLayout());
                panel.add(centerPanel,BorderLayout.CENTER);

                // 建立文本區域組件
                JTextArea textArea = new JTextArea();
                textArea.setLineWrap(true);
                textArea.setFont(new Font(null, Font.PLAIN, 18));
                JScrollPane scrollPane = new JScrollPane(
                        textArea,
                        ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
                );

                JPanel rightPanel = new JPanel();
                rightPanel.setLayout(null);

                JLabel arithLabel=new JLabel("點擊開始答題按鈕,開始答題");
                arithLabel.setBounds(30,80,250,50);
                arithLabel.setFont(new Font(null, Font.PLAIN, 20));
                JLabel helloLabel=new JLabel("請仔細查看算式後得出計算結果!");
                helloLabel.setBounds(20,10,500,50);
                helloLabel.setFont(new Font(null, Font.PLAIN, 20));

                JTextField textField = new JTextField(8);
                textField.setBounds(330, 80, 200, 40);
                textField.setFont(new Font(null, Font.PLAIN, 20));
                JButton btn = new JButton("肯定");
                btn.setFont(new Font(null, Font.PLAIN, 20));
                btn.setBounds(340, 160, 180, 40);

                rightPanel.add(helloLabel);
                rightPanel.add(arithLabel);
                rightPanel.add(textField);
                rightPanel.add(btn);

                JSplitPane splitPane = new JSplitPane();
                splitPane.setLeftComponent(scrollPane);
                splitPane.setRightComponent(rightPanel);
                splitPane.setOneTouchExpandable(true);
                splitPane.setContinuousLayout(true);
                splitPane.setDividerLocation(300);

                centerPanel.add(splitPane,BorderLayout.CENTER);

9、模塊對接

一、參數傳遞功能

 

String n = JOptionPane.showInputDialog(
                                frame,
                                "輸入題目的數量(1-1000):"
                        );
                        String m = JOptionPane.showInputDialog(
                                frame,
                                "輸入數值範圍(1-10000):"
                        );
                        String z = JOptionPane.showInputDialog(
                                frame,
                                "輸入符號數量(1-10):"
                        );

 

二、選擇計算方式功能

switch(flag){
                                    case 'a':
                                        expression.generateExpressionA(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                        break;
                                    case 'b':
                                        expression.generateExpressionB(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                        break;
                                    case 'c':
                                        expression.generateExpressionC(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
                                        break;
                                }

 

三、作題功能

public void actionPerformed(ActionEvent e) {
                        if(!doFlag){
                            JOptionPane.showMessageDialog(frame,"請點擊開始答題按鈕,進行測試!","消息標題",JOptionPane.WARNING_MESSAGE);
                        }
                        else{
                            textArea.append("上一題\n");
                            textArea.append("算式:"+strPro.StrSplitBefore(arithExpress.get(index))+"="+textField.getText()+"\n");
                            if(!textField.getText().equals("")||textField.getText()!=null){
                                ansHash.put(index, strPro.StrSplitAfter(arithExpress.get(index)));
                                resHash.put(index, textField.getText());
                            }

 

四、統計分析功能

使用了繪製柱狀圖工具類,從一篇博客中學習找到的靈感 連接:http://www.jb51.net/article/73346.htm

ChartPanel frame1;
    static StrPro strPro=new StrPro();
    static DoFile doFile=new DoFile();
    public  BarChart(){
        CategoryDataset dataset = getDataSet();
        JFreeChart chart
                ;
        chart = ChartFactory.createBarChart3D(
                "四則運算測試結果圖表", // 圖表標題
                "測試輪/次", // 目錄軸的顯示標籤
                "題數", // 數值軸的顯示標籤
                dataset, // 數據集
                PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
                true,           // 是否顯示圖例(對於簡單的柱狀圖必須是false)
                false,          // 是否生成工具
                false           // 是否生成URL連接
        );

        //從這裏開始
        CategoryPlot plot=chart.getCategoryPlot();//獲取圖表區域對象
        CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表
        domainAxis.setLabelFont(new Font("黑體",Font.BOLD,14));         //水平底部標題
        domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,12));  //垂直標題
        ValueAxis rangeAxis=plot.getRangeAxis();//獲取柱狀
        rangeAxis.setLabelFont(new Font("黑體",Font.BOLD,15));
        chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 15));
        chart.getTitle().setFont(new Font("宋體",Font.BOLD,20));//設置標題字體

        //到這裏結束,雖然代碼有點多,但只爲一個目的,解決漢字亂碼問題

        frame1=new ChartPanel(chart,true);        //這裏也能夠用chartFrame,能夠直接生成一個獨立的Frame

10、結對成員

 

一、我:優勢:技術較強,善於思考 缺點:態度有時不夠端正,不認真。

二、她:優勢:認真,上進,積極活潑,又帶動性。缺點:技術稍差。

 

11、對編程思考

結對編程有好處:

1、結對編程能夠相互學習互相鼓勵

2、分工明確,能夠提升作事效率

3、加強兩我的的關係,加強合做能力、加強代碼理解能力。

4、在出現錯誤時,夥伴能夠及時發現而且指出,少走彎路

結對編程有壞處:

1、須要大量的交流,若是交流溝通不到位,項目將步履維艱。

2、可能會出現思路的分歧,致使兩人代碼出現分歧,難以結合。

3、兩人分工的不均勻,有可能出現技術強帶技術弱作項目的狀況。

 

12、PSP

 

PSP

任務內容

完成時間(min)

Planning

計劃

60

     Estimate

    估計這個任務須要多少時間,並規劃大體工做步驟

60

Development

開發

45*60

    Analysis

    需求分析

45

    Design Spec

    生成文檔

0

    Design Review

    設計複審

3*60

    Coding Standard

    代碼規範

15

    Design

    具體設計

12*60

    Coding

    具體編碼

3*8*60

    Code Review

    代碼複審

4*60

    Test

    測試

60

Reporting

報告

9*60

    Test Report

    測試報告

0

    Size Measurement

    計算工做量

60

   Postmortem& ProcessImprovement Plan

    過後總結, 並提出過程改進計劃

8*60

 

 

十3、柱狀圖的實現

  相關實現代碼如圖,主要借用了jfreechart的工具類,jfreechart是一個圖標繪製類庫,經過對jfreechart的引用,實現了項目中的柱狀圖。在下面的博客中具體的講解了jfreechart的使用方法,包括了柱狀圖、餅圖、折線圖等。

相關參考博客:https://blog.csdn.net/pzhtpf/article/details/7600100/

 

參考博客:https://www.cnblogs.com/xdp-gacl/p/3633744.html(GUI的使用)

相關文章
相關標籤/搜索