201671010460朱艺璇《英文文本统计分析》结对项目报告

  • 实验四 《英文文本统计分析》结对项目报告.

    项目 内容
    这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/
    这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/10569690.html
    课程学习目标 熟悉软件开发整体流程,提升自身能力
    本次作业在哪个具体方面帮助我们实现目标 第一次体验一个完整的工程
  • 任务一.
    • 两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
      对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。
      任务2需要给出结对项目源码在Github的仓库主页链接地址;
      任务2博文作为结对项目实施过程的文字资料,请完整包含下面7个部分:
      • 点评作业的博客王潇的实验二
      • github链接地址https://github.com/LAUGHwangxiao/Personal-Program
      • 点评内容:整个页面非常清爽,文档内容调理很清晰。用线条将每个模块分开,让读者看着非常清晰。唯一的一点不足就是总结有点少,不过也情有可原,从任务实践分配表可以看到王潇同学用了非常多的时间设计项目。希望我们两可以共同学习对方的长处。在阅读并测试运行代码以后,我发现她不仅完成了基础功能,还附加了输出每一行有多少个单词。软件结构完整,人机交互很有清楚。代码规范,结构完整,值得我学习。有一点小缺憾就是王潇同学也没有实现柱状图功能。希望在这一次的实验中我们能通过学习解决这个困难。
      • 点评心得:在阅读完王潇同学的实验二以后,我觉得她的博客前后条理很清楚,对每个模块的设计分析都很到位,这一点我需要向他学习,善用表格这一点,包括开头用表格形式写明博客信息,这一点我需要实践到自己的博客中。她的代码中将功能和main主函数区分开,结构完整,这一点也值得我学习。

  • 任务二.

a.需求分析.

  (1)程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
  (2)程序需要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
  (3)指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
  (4)高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
  (5)统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
  (6)统计该文本行数及字符数;
  (7)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
  (8)可处理任意用户导入的任意英文文本;
  (9)人机交互界面要求GUI界面(WEB页面、APP页面都可);

b.核心功能代码展示:展示核心功能代码.

  • 统计每一行单词的数量,并按序输出
        public void SortWords() throws IOException{
        System.out.println("已输出到result2.txt中");
        BufferedReader bufferedReader=new BufferedReader(new FileReader("src/Harrypotter.txt"));
        BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter("src/result2.txt"));
        String s;
        while((s=bufferedReader.readLine())!=null){
            Map<String, Integer> map=new TreeMap<String,Integer>();
            String[] words=s.split("[【】、.。,\"!--;:?\'\\] ]");
            for(int i=0;i<words.length;i++){
                String key=words[i].toLowerCase();
                if(key.length()>0){
                    if(!map.containsKey(key)){
                        map.put(key, 1);
                    }else{
                        int value=map.get(key);
                        value++;
                        map.put(key, value);
                    }
                }
            }
            Set<Map.Entry<String, Integer>> entrySet=map.entrySet();
            for(Map.Entry<String, Integer> entery:entrySet){
                bufferedWriter.write(entery.getKey()+"---"+entery.getValue()+"\r\n");
            }
            bufferedWriter.newLine();
            }
        bufferedReader.close();
        bufferedWriter.close();
}       


  • 绘制柱状图
    public Find(String[] word, Map<String, Integer> wordsCount) {
        super();
        this.word = word;
        this.wordsCount = wordsCount;
        setTitle("绘制柱形图");
        setBounds(word.length, 200, 450, 450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public Find() {
    }

    @Override
    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((400 - 20 * i) + "个", 8, topMargin + rulerStep * i);// 绘制Y轴上的数据
        }
        g2.setColor(Color.BLUE);
        int m = 0;
        for (int i = 0; i < word.length; i++) {
            int value = wordsCount.get(word[i]);
            int step = (m + 1) * 40;// 设置每隔柱形图的水平间隔为40
            g2.fillRoundRect(leftMargin + step * 2, Height - value, 40, value, 0, 0);// 绘制每个柱状条
            g2.drawString(word[i], leftMargin + step * 2, Height - value - 5); // 标识每个柱状条
            m++;
        }
    }

  • 统计字符数和行数
// Initializing counters
            int countWord = 0;
            int sentenceCount = 0;
            int characterCount = 0;
            int paragraphCount = 1;
            int whitespaceCount = 0;
            try {
                if (file.exists()) {
                    FileReader fr = new FileReader(file);
                    LineNumberReader lnr = new LineNumberReader(fr);
                    int lineNum = 0;
                    while (lnr.readLine() != null) {
                        lineNum++;
                    }
                    System.out.println("该文本文档的总行数为 : " + lineNum);
                    lnr.close();
                } else {
                    System.out.println("File does not exists!");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            // Reading line by line from the
            // file until a null is returned
            while ((line = reader.readLine()) != null) {
                if (line.equals("")) {
                    paragraphCount++;
                }
                if (!(line.equals(""))) {
                    characterCount += line.length();
                    // \s+ is the space delimiter in java
                    String[] wordList = line.split("/s+");
                    countWord += wordList.length;
                    whitespaceCount += countWord - 1;
                    // [!?.:]+ is the sentence delimiter in java
                    String[] sentenceList = line.split("[!?.:]+");
                    sentenceCount += sentenceList.length;
                }
            }


c.程序运行:程序运行时每个功能界面截图.

人机交互界面首页.

细节功能.

细节功能.

实现的功能.

功能实现结果.


d. 描述结对的过程.

   我们两在一起行动四年,非常有默契。由于平时的课业比较多,所以我们尽量在上课的时间多做一些,包括平时没课的时候也一起在机房自习做这个实验。

e. 提供此次结对作业的PSP。.

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

f. 小结感受.

这个项目有很多功能都和上一个词频软件功能类似,所以我们首先对比了我们两个人的实验二项目,取比较好的部分进行整合再开始这个项目。新增了四个功且补全了实验二没有实现柱状图的遗憾。我们首先在eclipse中实现了柱形图的功能,并完成了统计每行的每个单词的数量和统计该文本文档的行数,前端页面用sublime软件写的html页面,采用了css和js布局。由于很久不接触gui等人机交互页面设计,所以很生疏,这个实验室一点点重新捡起来的过程。在这次结对过程中,我们俩一起合作,尤其是作业截止的前一天,在机房呆了十个小时,终于将项目大概的样子有了个形,我相信在今后的学习中我们都会成为对方的好搭档。对于我们来说,1+1必须是>2的,就算卡bug,也能互相鼓励。

GitHub地址点击☞此处

猜你喜欢

转载自www.cnblogs.com/jessiyx/p/10612685.html