• 201671030101白龙飞《英文文本统计分析》结对项目报告


    项目 内容
    这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/
    这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/10569690.html
    课程学习目标 熟悉软件开发整体流程,提升自身能力
    本次作业在哪个具体方面帮助我们实现目标 第一次体验一个完整的工程

    任务1:两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

    对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。
    克隆结对方项目源码到本地机器,阅读并测试运行代码,结合运行结果评论程序代码,评论要点包括:软件结构、代码规范、功能实现、人机交互等。
    尝试利用github中的Fork、Clone、Push、Pull request、Merge pull request对结对方仓库中的源码进行合作修改。

    项目 内容
    点评博客地址 https://www.cnblogs.com/yanyanH/p/10556839.html
    GitHub源码地址 https://github.com/Hanyy2019/test2
    点评内容 在读完你的博文后,首先在博文排版方面,你的结构清晰,内容明了,并且使用了博文简要内容信息表,这点做的很不错,值得我学习。在博文结构方面,模块化的划分让人读起来很舒服。在博文内容方面,你做的是英文文本词频统计,根据老师所给的要求,你基本实现了查询指定单词,查询前K个高频单词,将所有单词按字典顺序输出到文本中。但是,在绘制柱状图方面,你可以再学习学习,这部分其实很简单。博文结构与PSP中“任务内容”列的关系:你的博文结构和PSP任务内容列的关系比较紧密,基本按照PSP任务内容列的顺序编写了博文. PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:通过对比博文中计划完成时间和实际完成时间,发现实际完成时间比计划完成时间超出很多,看到你在下面总结了自己在PSP过程中的困难,主要在于编程能力不强,在开发过程中花费了较多的时间。其他的流程花费时间基本和计划时间差别不大,但是也超出了一些时间,可能是由于初次按照PSP流程进行软件开发,所以对时间的把握不充分。最后我在GitHub上下载了你的源码,编译运行后,和博文内容贴合,代码比较规范,基本实现了老师所要求的功能,但是柱状图部分没有实现。
    点评心得 通过阅读点评别人的博文,我了解到了别人在编写代码和博文的优点,比如结构化的设计,以及图片大小的调整。

    任务2:采用两人合作方式,设计开发一个英文文本统计分析软件,使之具有以下功能:

    (1)实验2要求的功能;

    (2)单词频数可视化柱状图要求是以下样式:

    (3)统计该文本行数及字符数;

    (4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);

    (5)可处理任意用户导入的任意英文文本;

    (6)人机交互界面要求GUI界面(WEB页面、APP页面都可);

    (7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;

    (8)附加分功能:统计前10个两个单词组成的词组频率。

    GitHub源码

    需求分析

    • 实验2要求的功能;

    • 绘制单词频数可视化柱状图;

    • 统计该文本行数及字符数;

    • 各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);

    • 可处理任意用户导入的任意英文文本;

    • 人机交互界面要求GUI界面(WEB页面、APP页面都可);

    软件设计

    核心功能代码展示

    柱状图的实现

    public void paint(Graphics g)
    	{
    		int Width = getWidth();
    		int Height = getHeight();
    		int leftMargin = 50;//柱形图左边界
    		int topMargin = 50;//柱形图上边界
    		Graphics2D g2 = (Graphics2D) g;
    		int ruler = Height-topMargin;
    		int rulerStep = ruler/20;//将当前的高度平分为20个单位
    		g2.setColor(Color.WHITE);//绘制白色背景
    		g2.fillRect(0, 0, Width, Height);//绘制矩形图
    		g2.setColor(Color.LIGHT_GRAY);
    		for(int i=0;i<rulerStep;i++){
    			g2.drawString((30000-1500*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
    		}
    		g2.setColor(Color.darkGray);
    		int m=0;
    		for (Entry<String, Integer> entry : map.entrySet()) 
           	{ 
    			int value =entry.getValue();
    			int step = (m+1)*40;//设置每隔柱形图的水平间隔为40
    			g2.fillRoundRect(leftMargin+step*2,Height-value/50-5, 40, value, 40, 10);//绘制每个柱状条
    			g2.drawString(entry.getKey(), leftMargin+step*2, Height-value/50-5);	//标识每个柱状条		
                m++;
             } 
    		 
    	} 
    

    输出到文件

    Map<String,Integer> Map = new LinkedHashMap<String, Integer>(); 
    	 /**按字典顺序排序*/
        void Sort(Map<String, Integer> map) 
        {  
           Set<Entry<String,Integer>> m= map.entrySet();   
           LinkedList<Entry<String, Integer>> List = new LinkedList<Entry<String,Integer>>(m);
        
        	   Collections.sort(List, new Comparator<Entry<String,Integer>>() 
        	   {     
                   public int compare(Entry<String, Integer> a,  Entry<String, Integer> b) 
                   {  
                       return a.getKey().compareTo(b.getKey());  
                  }     
               });  
           for (Entry<String,Integer> entry: List) 
           {  
               Map.put(entry.getKey(), entry.getValue());  
           }  
       } 
        /**写入文件*/
    	 void PrintToF(Map<String, Integer> map)throws IOException 
    	 {  
    		    long start = System.currentTimeMillis();
    	    	Sort(map);
    	        File file = new File("result.txt");
    	        FileWriter f = new FileWriter(file.getAbsoluteFile());
    	        for (Entry<String,Integer> w: Map.entrySet()) 
    	        {
    	        	f.write(w.getKey() + "/" + w.getValue()+"     ");
    	        }
    	        f.close();
    	        JOptionPane.showConfirmDialog(null,"所用时间:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
    	 }         
    

    程序运行

    主页面

    高频词

    柱状图显示

    单词、行数

    生成result文件

    结对过程

    PSP

    PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 8 12
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 8 10
    Development 开发 120 150
    Analysis 需求分析 (包括学习新技术) 10 15
    Design Spec 生成设计文档 5 5
    Design Review 设计复审 (和同事审核设计文档) 10 10
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
    Design 具体设计 20 25
    Coding 具体编码 120 150
    Code Review 代码复审 20 30
    Test 测试(自我测试,修改代码,提交修改) 10 20
    Reporting 报告 20 20
    Test Report 测试报告 10 10
    Size Measurement 计算工作量 10 15
    Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 15 30

    总结

    我认为两人合作真的能够带来1+1>2的效果,首先一个人总有累的时候,这时候出错的概率就会大大增加,而结对编程就避免了这种低级错误。

  • 相关阅读:
    #ifndef/#define/#endif使用详解
    快速排序
    一分钟看懂Docker的网络模式和跨主机通信
    Docker:网络模式详解
    Docker中使用Tomcat并部署war工程
    Docker学习笔记--Docker 启动nginx实例挂载目录权限不够(转)
    Centos 7 如何卸载docker
    Centos-7修改yum源为国内的yum源
    centOS 7镜像文件下载
    Python 垃圾回收机制(转)
  • 原文地址:https://www.cnblogs.com/NIGGRZZ2333/p/10618997.html
Copyright © 2020-2023  润新知