實驗四 軟件工程界對項目
博文簡要信息:
這個做業屬於哪一個課程 |
教師博客主頁連接 |
這個做業的要求在哪裏 |
做業連接地址 |
課程學習目標 |
熟悉軟件開發總體流程,提高自身能力 |
本次做業在哪一個具體方面幫助咱們實現目標 |
第一次體驗一個完整的工程 |
實驗內容:
任務一 |
兩兩自由結對,對結對方的《實驗二 軟件工程我的項目》的項目成果進行評價 |
任務二 |
採用兩人合做方式,設計開發一個英文文本統計分析軟件 |
任務三 |
完成博文做業 |
任務一 組隊互評
做業博客 |
達選奇201671010409 |
點評內容 |
博文脈絡清晰,博文結構中有需求分析、功能設計、環境需求、測試運行、部分代碼、psp、運行截圖、設計實現等功能模塊,結構符合規範。從博文排版可看出,對於mackbook編輯器排版功能使用不是很熟練,基本符合規範。在對psp 中的「計劃完成須要的時間」和「實際完成須要的時間」的兩列數據進行比較發現,不少完成時間和預估時間存在差別,一方面是由於理論上的估算時間和現實的工 程進行時的時間是有區別的,另外一方面在實際操做中由於對C語言編程的掌握程度不一樣,從而影響程序的一系列相關的進程的開發。軟件結構設計比較合理,代碼規範有待進一步增強,其中高頻詞、柱狀圖功能沒有實現,人機交互只有兩項,略顯少,主要仍是對於編程語言使用不熟練,知識比較缺少,還須要增強編程能力的訓練 |
點評心得 |
對於咱們初次使用mackbook,各類排版不是很完美。在對與缺乏Java編程語言的相關技能,編程過程當中出現的代碼問題較多。沒有很好的實現全部功能。 |
任務二 合做設計
1.需求分析
- 實驗2要求的功能;
- 單詞頻數可視化柱狀圖要求是如下樣式:
![](http://static.javashuo.com/static/loading.gif)
- 統計該文本行數及字符數;
- 各類統計功能均提供計時功能,顯示程序統計所消耗時間(單位:ms);
- 可處理任意用戶導入的任意英文文本;
- 人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
- 附加分功能:統計文本中除冠詞、代詞、介詞以外的高頻詞;
- 附加分功能:統計前10個兩個單詞組成的詞組頻率。
2.軟件設計:類關鍵信息
BufferedReader(Reader in,int sz)類
建立一個使用指定大小輸入緩衝區的緩衝字符輸入流
JFreeChart類
開放的圖表繪製類庫,用於生成柱形圖,能夠產生PNG文件。
CategoryPlot類
組合圖形
-
以與語言環境相關的方式來格式化和分析日期的具體類
Date
類 Date 表示特定的瞬間,精確到毫秒
Map<String ,Integer>map接口
以鍵值對方存儲單詞詞頻
File類
File對象用來獲取或處理與磁盤文件相關的信息,例如權限,時間,日期和目錄路徑
-
一個 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.程序運行
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
5.過程及照片
![](http://static.javashuo.com/static/loading.gif)
6.PSP
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