201671030112 李晓雪 《英文文本统计分析》结对项目报告

本文记录了一次结对编程的实践经历,包括项目需求分析、软件设计、核心代码展示及运行流程等内容。通过该项目,作者们体验了软件开发中的合作模式,并掌握了GitHub上的增量发布操作。
项目内容
作业所属课程http://www.cnblogs.com/nwnu-daizh/
作业要求https://www.cnblogs.com/nwnu-daizh/p/10569690.html
课程学习目标体验软件项目开发中的两人合作,练习结对编程(Pair programming)。掌握Github上增量发布软件的操作方法。
在哪个具体方面帮助我们实现目标能够在同学之间更好的进行合作与交流
本次项目源代码https://github.com/Lxiaoxue/Work

任务一

项目内容
点评作业的博客https://www.cnblogs.com/shl0/p/10556765.html
github链接地址https://github.com/SHL0/Word-Count
博文评论内容:整体来说写的挺好,功能方面也都基本实现了。在按字典排序写入result.txt文件功能实现的不错,写入的很整齐。但是在查询单词这个功上还可以进行优化,连续输入不同的单词一次性查询。还有就是可以学习一下在博文中如何使用表格。继续努力! 在代码方面,代码写的很规范,能容易理解,每个类和函数都有注释,是值得学习的地方。希望继续努力。
点评心得:在看了她的博文之后,相比与自己在有些方面还是很有学习的地方,比如在写入result文件中,写入的很整齐。应该学习。 在看了她的代码之后,相比与自己 还有学习的地方,有些代码写注释很重要,方便以后的学习。

任务二

结对项目源代码

a.需求分析

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

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

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

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

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

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

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

b.软件设计

1616081-20190403092127589-1096815021.png

  1.首先输入任意正确的文件名。进入功能选择,点击每个功能进行测试。

  2.本次项目需要用到图形用户界面。在Mianclass类中编写,设置面板,动作监听。

  3.在柱状图和排序编写到不同的类中进行调用。

c.核心功能代码展示

界面按钮监听及输入文件名进行获取时间。

surebt.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event){
         if(event.getSource()==surebt){
        JOptionPane.showConfirmDialog(null, "是否退出程序?","查找结果",JOptionPane.DEFAULT_OPTION);
        frame1.dispose();//销毁当前界面
        }
     }
    });
   okbt.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
              if(e.getSource()==okbt) {
             String src = t1.getText();
              File file =new File(src);
             FileReader reader = null;
             try {
                    reader = new FileReader(src);
                  } catch (FileNotFoundException e1) {
                     // TODO Auto-generated catch block
                     e1.printStackTrace();
                    }
                      if(!file.exists())
                        {
                          JOptionPane.showConfirmDialog(null, "请输入正确的文件名","查找结果",JOptionPane.DEFAULT_OPTION);
                        }
                      BufferedReader br = new BufferedReader(reader);
                      String readline = null;
                        int row=0;
                        int wordnumber=0;
                        long startTime = System.currentTimeMillis();    //获取开始时间    
                        ArrayList<String> lists = new ArrayList<String>(); 
                        try {
                            while ((readline = br.readLine()) != null)
                            {
                                String[] wordsArray=readline.split("[^a-zA-Z]");
                                for(String word :wordsArray) 
                                {
                                    if(word.length() != 0)
                                    {  
                                        word=word.toLowerCase();
                                        lists.add(word);  
                                    }
                                }
                                row++;  
                            }
                        } catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                          System.out.println(row); 
                        try {
                            br.close();
                        } catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                                               wordMap=new HashMap<String,Integer>();
                              for (String l : lists) 
                              {  
                                if(wordMap.get(l) != null)
                                {  
                                    wordMap.put(l,wordMap.get(l) + 1);  
                                }else
                                {  
                                    wordMap.put(l,1);  
                                }  
                                wordnumber++;
                            }
                              long endTime = System.currentTimeMillis();    //获取结束时间  
                              JOptionPane.showConfirmDialog(t1, "文本统计完成!"+"\n 文本统计所消耗时间:"+ (endTime - startTime)+"\n 文本行数有:"+row+" 单词数:"+wordnumber,"结果",JOptionPane.DEFAULT_OPTION);
                  }
              }
          });

柱状图

public class Graph extends Wordcount{
    ChartPanel frame1;
    public  Graph(Map<String, Integer> Map1,String s1){

        DefaultCategoryDataset dataset = getDataSet(Map1,s1);
        JFreeChart chart = ChartFactory.createBarChart3D(
                             "单词频数", // 图表标题
                            " ", // 目录轴的显示标签
                          //  "数量", // 数值轴的显示标签
                            "单词表",
                            dataset, // 数据集
                            PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                            true,           // 是否显示图例(对于简单的柱状图必须是false)
                            false,          // 是否生成工具
                            false           // 是否生成URL链接
                            );
        
        //从这里开始
        CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
       CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表
         domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题
         ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
         rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
          chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
          chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
         
         frame1=new ChartPanel(chart,true);        //这里也可以用chartFrame,可以直接生成一个独立的Frame
         
    }     
        
} 
    public DefaultCategoryDataset getDataSet(Map<String, Integer> Map,String s) {

        Map<String,Integer> Map2 = new TreeMap<String, Integer>(); 
        String[] word= s.split(",");
        for(int i=0; i<word.length; i++) {
            for(Entry<String,Integer> entry : Map.entrySet()) { 
                if(word[i].equals(entry.getKey()))
                {
                     Map2.put(entry.getKey(), entry.getValue());
                     break;
                }
            } 
        }
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        Set<Entry<String,Integer>> mapEntrySet = Map2.entrySet();
        for(Entry<String,Integer> entry : Map2.entrySet()) {
            Integer value=entry.getValue();
            dataset.setValue((Number)value,entry.getKey(),entry.getKey());
        }
        return dataset;     
        
    }   
    public ChartPanel getChartPanel(){
        return frame1;
        
    }
}

d.程序运行

1.运行程序

1616081-20190402225455298-780756528.jpg

2.输入任意文本

(若输入的文件名不正确)
1616081-20190402225513536-732585321.jpg

(输入正确的文件名)
1616081-20190402225625378-1822375461.jpg

3.输入任意单词,查询词频。

1616081-20190402230144448-955422826.jpg

4.查询高频词。

1616081-20190402230225194-1306666841.jpg

5.显示柱状图。

1616081-20190402230303734-1339966949.jpg

6.按字典排序写如result.txt中。

1616081-20190402230416063-1088022169.jpg

1616081-20190403085549585-37255188.png

7.附加功能1,查询除代词介词冠词之外的单词词频。

1616081-20190402230650996-1451826712.jpg

8.退出。

1616081-20190402230714940-1706385773.jpg

e.结对过程描述

1616081-20190402230910866-1368167003.jpg

  在一起合作的时候也会有很多分歧,需要讨论和尝试很多次话费许多的时间。在遇到困难时我们会首先进行查阅书籍,然后一起讨论解决方法。尝试各自的方法,选择最好的方法。

f.PSP展示

任务内容计划完成需要的时间(min)实际完成需要的时间(main)
计划3025
估计这个任务需要多少时间,并规划大致工作步骤4030
开发240300
需求分析3025
生成设计文档6050
设计复审 (和同学审核设计文档)2025
代码规范 (为目前的开发制定合适的规范)1015
具体设计3030
具体编码300350
代码复审2025
测试(自我测试,修改代码,提交修改)2015
报告3045
测试报告3025
计算工作量2015
事后总结 ,并提出过程改进计划6045

g.总结

   本次项目的重难点就是图形用户界面,在功能部分我们实现的还算是顺利。但是到了做界面的时候就遇到了很大的困难,虽然之前学习过,大部分方法都忘记了,在编写代码的过程中查阅了书籍。这次项目是结对完成的完成的还可以,在两个人的合作中也体会到了交流的重要性,我们合作的很顺利。希望可以在编程方面更进一步。

转载于:https://www.cnblogs.com/LXxue/p/10575997.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值