结对作业——WordCount进阶版

Deadline:

2018-10-7 22:00PM,以博客提交至班级博客时间为准
要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
https://edu.cnblogs.com/campus/buaa/BUAASummerSETraining/homework/2013

  1. 实现一个能够对文本文件中的单词词频进行统计的GUI程序。
  2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
  3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
  4. 使用源代码管理系统 (码云)。

Task1:编码要求

  1. Fork 码云项目 https://gitee.com/SE-net16/PairProject-C
    https://gitee.com/SE-net16/PairProject-Java 到自己的仓库,在自己的码云仓库中新建一个学号命名(两人学号的末尾3位)的文件夹。
  2. 在开始实现程序之前,在PSP表格[附录1]记录下你估计在程序开发各个步骤上耗费的时间,在你实现程序之后,在PSP表格记录下你在程序的各个模块上实际花费的时间。
  3. 使用C++或者Java语言实现,C++请使用Visual Studio Community 2017进行开发,Java请使用,运行环境为64-bit Windows 10。
  4. 编写的代码遵守代码规范
  5. 使用码云来管理源代码和测试用例,代码有进展即签入码云,可以看到两人的提交信息。签入记录不合理的项目会被助教抽查询问项目细节。
  6. 使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;并写出至少10个测试用例确保你的程序能够正确处理各种情况。
  7. 在完成结对项目后,请正确发起一个Pull Request,并确保自己的代码最终成功签入到 https://gitee.com/SE-net16/PairProject-C
    https://gitee.com/SE-net16/PairProject-Java 中。(如果成功签入会在原始项目主页看到自己学号为名的文件夹)

Task2:博客要求

  1. 在文章开头给出博客作业要求地址
  2. 给出结对小伙伴的学号、博客地址,结对项目的码云地址。
  3. 给出结对的PSP表格。
  4. 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。
  5. 设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?
  6. 代码说明。展示出项目关键代码,并解释思路与注释说明。
  7. 结合在构建之法中学习到的相关内容与结对项目的实践经历,描述结对的感受,是否1+1>2?
    注:结对共同部分,可在其中一个人的博客给出(另一个人给出链接),不同部分分别写在自己的博客。

Task3:WordCount 结对项目要求

在个人项目的基础上,增加新的功能。

第一步,增加新功能

我们希望各位在个人项目的基础上,添加一些新的功能:

  • 词组统计:能统计文件夹中指定长度的词组的词频
  • 自定义输出:能输出用户指定的前n多的单词与其数量
    为了实现上述软件,我们首先要在个人项目基础上增量改进,实现一个Core模块,并基于Core模块实现在命令行测试程序中支持下述命令行参数(原有命令行参数不变)

1. -i 参数设定读入的文件路径
格式如下
wordCount.exe -i [file]

一个例子如:

wordCount.exe -i input.txt

2.-m 参数设定统计的词组长度
格式如下

wordCount.exe -m [number]
词组定义:m个由分隔符隔开的单词组成一个词组
-m参数与数字配套使用,用于设置词组长度
命令行中使用-m参数,例:

wordCount.exe -m 3 -i input.txt
/*
 *要求程序统计input.txt中长度为3的词组,最终输出
 *例:input文件中内容为"Monday Tuesday Wednesday Thursday"
 *则输出如下
 */
characters: 33
words: 4
lines: 1
Monday Tuesday Wednesday: 1
Tuesday Wednesday Thursday: 1

3. -n参数设定输出的单词数量
格式如下

wordCount.exe -n [number]
-n参数与数字搭配使用,用于限制最终输出的单词的个数
表示输出最多的前[number]个单词
命令行中使用-n参数,例:

wordCount.exe -n 1 -i input.txt
/*
 *程序会输出文件中出现次数最多的那个单词
 */

4. -o 参数设定生成文件的存储路径
格式如下

wordCount.exe -o output.txt
则将统计信息输出到文件 output.txt中。

第二步,设计单元测试

请使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;另外,请准备至少10个测试用例确保程序能够正确处理各种情况,并且不会崩溃。

第三步,回归测试

请使用个人作业2中设计的测试用例对该程序进行回归测试。

第四步,GUI程序设计

将基于控制台的程序设计成具有图形界面的程序(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的)


评分基准

博客评分

本次博客作业总分 20分,由以下部分组成:

  1. 在文章开头给出结对的小伙伴博客地址,码云项目地址。(2')
  2. 在开始实现程序之前,在下述PSP表格记录下估计将在程序的各个模块的开发上耗费的时间。(1')
  3. 功能改进的设计与实现过程。 改进包括代码是否重构,如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的改进思路(不必列出源代码),以及独到之处。(8')
  4. 功能改进模块部分单元测试展示。 展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。(4')
  5. 回归测试部分展示。 (3')
  6. 描述结对的过程,提供非摆拍的两人在讨论的结对照片。(1')
  7. 在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。(1')

程序评分

本次程序作业总分40分,由以下部分组成:

  1. 正确性(30')
  2. GUI(10‘)

注:

  • 如能积极响应助教和老师的反馈并在评论2天内做出相应修改,会在已有评分上有一定加分,但原则上获得分数不超过本次作业总分。
  • 如对分数有意见,只给一次向助教申诉的机会
  • 迟交一周扣实际分数的一半
  • 迟交两周或以上,不给分
  • 抄袭倒扣分

参考资料

转载于:https://www.cnblogs.com/happyzm/p/9626779.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mapreduce实例-WordCount是一个经典的MapReduce程序,用于统计文本中每个单词出现的次数。它的工作原理是将输入的文本划分为多个片段,每个片段由多个键值对组成,其中键是单词,值是1。然后通过Map阶段将每个片段中的单词提取出来,并将每个单词映射为键值对,其中键是单词,值是1。接下来,通过Shuffle和Sort阶段将具有相同单词的键值对聚集在一起。最后,通过Reduce阶段将相同单词的计数值进行累加,得到每个单词的总次数。 以下是一个示例代码片段,展示了WordCount程序的基本结构和关键组件: ```java import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Job job = Job.getInstance(); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值