201671010459張旭輝《英文文本統計分析》結對項目報告

實驗四 軟件工程界對項目


博文簡要信息:

項目 內容
這個做業屬於哪一個課程 教師博客主頁連接
這個做業的要求在哪裏 做業連接地址
課程學習目標 熟悉軟件開發總體流程,提高自身能力
本次做業在哪一個具體方面幫助咱們實現目標 第一次體驗一個完整的工程

實驗內容:

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

任務一 組隊互評

項目 內容
做業博客 達選奇201671010409
點評內容 博文脈絡清晰,博文結構中有需求分析、功能設計、環境需求、測試運行、部分代碼、psp、運行截圖、設計實現等功能模塊,結構符合規範。從博文排版可看出,對於mackbook編輯器排版功能使用不是很熟練,基本符合規範。在對psp 中的「計劃完成須要的時間」和「實際完成須要的時間」的兩列數據進行比較發現,不少完成時間和預估時間存在差別,一方面是由於理論上的估算時間和現實的工 程進行時的時間是有區別的,另外一方面在實際操做中由於對C語言編程的掌握程度不一樣,從而影響程序的一系列相關的進程的開發。軟件結構設計比較合理,代碼規範有待進一步增強,其中高頻詞、柱狀圖功能沒有實現,人機交互只有兩項,略顯少,主要仍是對於編程語言使用不熟練,知識比較缺少,還須要增強編程能力的訓練
點評心得 對於咱們初次使用mackbook,各類排版不是很完美。在對與缺乏Java編程語言的相關技能,編程過程當中出現的代碼問題較多。沒有很好的實現全部功能。

任務二 合做設計

1.需求分析

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

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

  • BufferedReader(Reader in,int sz)類

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

    開放的圖表繪製類庫,用於生成柱形圖,能夠產生PNG文件。
  • CategoryPlot類

    組合圖形
  • SimpleDateFormat類

    以與語言環境相關的方式來格式化和分析日期的具體類
  • Date

    類 Date 表示特定的瞬間,精確到毫秒
  • Map<String ,Integer>map接口

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

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

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

    集合接口

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.程序運行




5.過程及照片

6.PSP

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

GitHub代碼地址html

實驗小結

今後次實驗項目,咱們小組都努力的去完成這個工做,但在這個過程當中,深入認識到了團隊的重要性。從中體現了各類問題,也讓咱們很苦惱,但最後咱們都一一解決。還有咱們每一個人缺少的編程能力,這是一大硬傷,咱們在以後還需加大對編程能力的提升。git

相關文章
相關標籤/搜索