項目 | 內容 |
---|---|
軟件工程 | 教師博客主頁連接 |
做業要求 | 做業連接地址 |
課程目標 | 熟悉軟件開發總體流程,提高自身能力 |
實現目標 | 第一次體驗一個完整的工程 |
任務 | 內容 |
---|---|
任務一 | 兩兩自由結對,對結對方的《實驗二 軟件工程我的項目》的項目成果進行評價 |
任務二 | 採用兩人合做方式,設計開發一個英文文本統計分析軟件 |
任務三 | 完成博文做業 |
項目 | 內容 |
---|---|
做業博客 | 丁家輝201671010406 |
點評內容 | 博文脈絡清晰,博文結構中有需求分析、功能設計、環境需求、測試運行、部分代碼、psp、運行截圖、設計實現等功能模塊,結構符合規範。博文內容每一模塊 都聯繫該程序的相應功能模塊來講,內容以程序實際運行情況爲依據進行總結,內容緊湊。博文排版結構與psp中任務內容列的關係大體上保持同步,在對psp 中的「計劃完成須要的時間」和「實際完成須要的時間」的兩列數據進行比較發現,不少完成時間和預估時間存在差別,一方面是由於理論上的估算時間和現實的工 程進行時的時間是有區別的,另外一方面在實際操做中由於對C語言編程的掌握程度不一樣,從而影響程序的一系列相關的進程的開發。軟件結構設計比較合理,代碼規範有待進一步增強,其中高頻詞、柱狀圖功能沒有實現,人機交互只有兩項,略顯少。 |
點評心得 | 總的來講實現功能較少,還用增強java編程學習 |
Github倉庫主頁 | https://github.com/Hero-ding/Hero/tree/master/詞頻統計 |
結對項目源碼在Github的倉庫主頁連接地址:https://github.com/Daxuanqi/ptdm/tree/master/實驗四html
單詞頻數可視化柱狀圖要求是如下樣式:java
附加分功能:統計前10個兩個單詞組成的詞組頻率。git
建立一個使用指定大小輸入緩衝區的緩衝字符輸入流
字符串中的字母被轉換爲小寫字母,開放的圖表繪製類庫,用於生成柱形圖,能夠產生PNG文件
實現對數組的排序,給輸出的單詞頻率高低進行排序
以與語言環境相關的方式來格式化和分析日期的具體類
以鍵值對方存儲單詞詞頻
File對象用來獲取或處理與磁盤文件相關的信息,例如權限,時間,日期和目錄路徑
一個 Servlet 經過使用ServletRequest 接口得到了對一ServletInputStream 對象的說明。這個類的子類必須提供一InputStream接口讀取有關信息的方法
集合接口
/** * 柱狀圖設置文字樣式 * @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()); }
選擇txt文本:github
查詢單詞頻率:
顯示統計柱狀圖:編程
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 |
經過此次結對編程項目,我對多人結對的工做模式有了更深入的理解,對軟件工程的複雜性有了清楚的認識,同時對此次編程中暴露的問題有了充分的思想準備,但願在之後學習中增強編程的功底。