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地址点击☞此处

posted @ 2019-04-02 20:09  jessi艺璇  阅读(326)  评论(3编辑  收藏  举报