201671010409 達選奇 《英文文本統計分析》結對項目報告

實驗四 軟件工程界對項目


博文簡要信息:

項目 內容
軟件工程 教師博客主頁連接
做業要求 做業連接地址
課程目標 熟悉軟件開發總體流程,提高自身能力
實現目標 第一次體驗一個完整的工程

實驗內容:

任務 內容
任務一 兩兩自由結對,對結對方的《實驗二 軟件工程我的項目》的項目成果進行評價
任務二 採用兩人合做方式,設計開發一個英文文本統計分析軟件
任務三 完成博文做業

任務一 組隊互評

項目 內容
做業博客 丁家輝201671010406
點評內容 博文脈絡清晰,博文結構中有需求分析、功能設計、環境需求、測試運行、部分代碼、psp、運行截圖、設計實現等功能模塊,結構符合規範。博文內容每一模塊 都聯繫該程序的相應功能模塊來講,內容以程序實際運行情況爲依據進行總結,內容緊湊。博文排版結構與psp中任務內容列的關係大體上保持同步,在對psp 中的「計劃完成須要的時間」和「實際完成須要的時間」的兩列數據進行比較發現,不少完成時間和預估時間存在差別,一方面是由於理論上的估算時間和現實的工 程進行時的時間是有區別的,另外一方面在實際操做中由於對C語言編程的掌握程度不一樣,從而影響程序的一系列相關的進程的開發。軟件結構設計比較合理,代碼規範有待進一步增強,其中高頻詞、柱狀圖功能沒有實現,人機交互只有兩項,略顯少。
點評心得 總的來講實現功能較少,還用增強java編程學習
Github倉庫主頁 https://github.com/Hero-ding/Hero/tree/master/詞頻統計

任務二 合做設計

結對項目源碼在Github的倉庫主頁連接地址:https://github.com/Daxuanqi/ptdm/tree/master/實驗四html

1.需求分析

  • 實驗2要求的功能;
  • 單詞頻數可視化柱狀圖要求是如下樣式:java

  • 統計該文本行數及字符數;
  • 各類統計功能均提供計時功能,顯示程序統計所消耗時間(單位:ms);
  • 可處理任意用戶導入的任意英文文本;
  • 人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
  • 附加分功能:統計文本中除冠詞、代詞、介詞以外的高頻詞;
  • 附加分功能:統計前10個兩個單詞組成的詞組頻率。git

2.軟件設計:類關鍵信息

  • BufferedReader(Reader in,int sz)類

    建立一個使用指定大小輸入緩衝區的緩衝字符輸入流
  • JFreeChart類

    字符串中的字母被轉換爲小寫字母,開放的圖表繪製類庫,用於生成柱形圖,能夠產生PNG文件
  • CategoryPlot類

    實現對數組的排序,給輸出的單詞頻率高低進行排序
  • SimpleDateFormat類

    以與語言環境相關的方式來格式化和分析日期的具體類
  • Map<String ,Integer>map接口

    以鍵值對方存儲單詞詞頻
  • File類

    File對象用來獲取或處理與磁盤文件相關的信息,例如權限,時間,日期和目錄路徑
  • ServletInputStream類

    一個 Servlet 經過使用ServletRequest 接口得到了對一ServletInputStream 對象的說明。這個類的子類必須提供一InputStream接口讀取有關信息的方法
  • Collection集合接口

    集合接口

    uml圖

3.核心功能代碼展現

/**
     * 柱狀圖設置文字樣式
     * @param chart
     */
    private static void getChartByFont(JFreeChart chart,Integer end) {
        // 圖形設置標題文字
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("宋體", Font.BOLD, 32));
        //設置X軸內容豎直
//      XYPlot xyplot = chart.getXYPlot(); 
//      DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); 
//      dateaxis.setTickUnit(new DateTickUnit(1, 1, new SimpleDateFormat("MMM-yyyy"))); 
//      dateaxis.setVerticalTickLabels(true); 
        // 設置圖形X軸座標文字
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        CategoryAxis axis = plot.getDomainAxis();
        axis.setLabelFont(new Font("宋體", Font.BOLD, 8)); // 設置X軸座標上標題的文字
        axis.setTickLabelFont(new Font("宋體", Font.BOLD, 16)); // 設置X軸座標上的文字
        axis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45); 
        axis.setUpperMargin(0.01);//設置距離圖片左端距離 
        axis.setLowerMargin(0.01); //設置距離圖片右端距離
        // 設置圖形Y軸座標文字
        
        NumberAxis na= (NumberAxis)plot.getRangeAxis();  
        na.setStandardTickUnits(NumberAxis.createIntegerTickUnits());  
        ValueAxis valueAxis = plot.getRangeAxis();
        valueAxis.setLabelFont(new Font("宋體", Font.BOLD, 20)); // 設置Y軸座標上標題的文字
        valueAxis.setTickLabelFont(new Font("sans-serif", Font.BOLD, 16));// 設置Y軸座標上的文字
        valueAxis.setRange(0,end);
//      valueAxis.setLowerBound(0);  //Y軸以開始的最小值 
//      valueAxis.setUpperBound(15);  //Y軸的最大值 
        // 設置提示內容的文字
        chart.getLegend().setItemFont(new Font("宋體", Font.BOLD, 24));
    }
}
public class InputFile {
    /**
     * 文件名生成
     * @return
     */
    public static String getRandomFileName() {  
          
        SimpleDateFormat simpleDateFormat;  
        simpleDateFormat = new SimpleDateFormat("yyyyMMdd");  
        Date date = new Date();  
        String str = simpleDateFormat.format(date);  
        Random random = new Random();  
        int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 獲取5位隨機數  
        return rannum + str;// 當前時間  
        
    }

    /**
     * 單詞:詞頻
     * @param file
     * @return
     */
public class FileServlet extends HttpServlet{
        
    
    private static final long serialVersionUID = 1L;
    public FileServlet() {
        super();
    }
    /**
     * 存入文件
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }
    /**
     * 讀取文件
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("utf-8");
        //String contentType = request.getContentType();
        //System.out.println("表單類型:"+contentType);
        //String boundary = contentType.substring(contentType.indexOf("boundary=")+9);
        //System.out.println("boundary:"+boundary);
        String root = getServletContext().getRealPath("/tempFile/temp.txt");
        File file = new File(root);
        if(!file.exists()){
            //先獲得文件的上級目錄,並建立上級目錄,在建立文件
            file.getParentFile().mkdir();
            try {
                //建立文件
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
public class JfreeChartServlet extends HttpServlet{
    /**
     * 柱狀圖生成
     * @return
     */

    private static final long serialVersionUID = 1L;

    public JfreeChartServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @SuppressWarnings("null")
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Type", "textml;charset=UTF-8");
        String root = getServletContext().getRealPath("/tempFile/temp.txt");
        File readfile = new File(root);
        //System.out.println(readfile.exists());
        if(readfile.exists()){
            InputFile in = new InputFile();
            Map<String,Integer> readmap = in.readFile(readfile);
            //System.out.println(readmap);
            //取出單詞詞頻最大數值
            Collection<Integer> c = readmap.values();
            Object[] obj = c.toArray();
            Arrays.sort(obj);
//          System.out.println("單詞詞頻數:"+Arrays.toString(obj));
//          System.out.println("最大詞頻:"+obj[obj.length-1]);
            Integer maxnumber = (Integer) obj[obj.length-1];
            System.out.println("單詞數:"+obj.length);
            //遍歷
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            for (String key : readmap.keySet()) {
                 Integer value = readmap.get(key); //獲得每一個key所對應的value值
                 dataset.addValue(value, "單詞", key);
            }
            // 獲取柱狀圖工具類建立的柱狀圖,(將數據集傳入)
            JFreeChart chart = ColumnarTools.createCoColumnar(dataset,maxnumber+1);
            new InputFile();
            //以當前時間生成圖片名稱(防止圖片重複被覆蓋)
            String time = InputFile.getRandomFileName();
            String uploadUrl = request.getServletContext().getRealPath("/")+"images\\"+time+".png";
            System.out.println("圖片物理路徑所在位置:"+uploadUrl);
            File file = new File(uploadUrl);
            //System.out.println(file);
            if(!file.exists()){
                //先獲得文件的上級目錄,並建立上級目錄,在建立文件
                file.getParentFile().mkdir();
                try {
                    //建立文件
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
            Map<String, String> map = new HashMap<String, String>();
            map.put("name", time+".png");
            JSONObject jsonObject = JSONObject.fromObject(map);
            System.out.println("json圖片名稱:"+jsonObject);
            response.getWriter().write(jsonObject.toString());
            
        }

4.程序運行


選擇txt文本:github

讀取txt,分離單詞:

查詢單詞頻率:

顯示統計柱狀圖:編程

5.過程及照片

6.PSP

PSP2.1 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 10 15
Estimate 估計這個任務須要多少 時間,並規劃大體工做步驟 10
Development 開發 300 400
Analysis 需求分析 (包括學習新技術) 15 20
Design Spec 生成設計文檔 15 30
Design Review 設計複審 (和同窗審覈設計文檔) 16 23
Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 5 9
Design 具體設計 20 30
Coding 具體編碼 180 240
Code Review 代碼複審 20 30
Test 測試(自我測試,修改代碼,提交修改) 50 50
Reporting 報告 25 30
Test Report 測試報告 6 8
Size Measurement 計算工做量 5 5
Postmortem & Process Improvement Plan 過後總結 ,並提出過程改進計劃 9 12

實驗小結

經過此次結對編程項目,我對多人結對的工做模式有了更深入的理解,對軟件工程的複雜性有了清楚的認識,同時對此次編程中暴露的問題有了充分的思想準備,但願在之後學習中增強編程的功底。
相關文章
相關標籤/搜索