2020秋软件工程 (东北师范大学 - 计算机)

  1. 班级首页
  2. 作业列表
  3. 详情

作业要求 20200917-2 词频统计 [已截止]


词频统计 SPEC

老五在寝室吹牛他熟读过《鲁滨逊漂流记》,在女生面前吹牛热爱《呼啸山庄》《简爱》和《飘》,在你面前说通读了《战争与和平》。但是,他的四级至今没过。你们几个私下商量,这几本大作的单词量怎么可能低于四级,大家听说你学习《构建之法》,一致推举你写个程序名字叫wf,统计英文作品的单词量并给出每个单词出现的次数,准备用于打脸老五。

希望实现以下效果。以下效果中数字纯属编造。

功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键
盘在控制台下输入命令。

>type test.txt
My English is very very pool.

>wf -s test.txt
total 5

very    2
my      1
english 1
is      1
pool    1

为了评估老五的词汇量而不是阅读量,total一项中相同的单词不重复计数数,出现2
次的very计数1次。

因为用过控制台和命令行,你早就知道,上面的">"叫做命令提示符,是操作系统的一部分,而不是你的程序的一部分。

此功能完成后你的经验值+10.

功能2 支持命令行输入英文作品的文件名,请老五亲自录入。

>wf gone_with_the_wand
total  1234567 words

the    5023
a      4783
love   4572
fire   4322
run    3822
cheat  3023
girls  2783
girl   2572
slave  1322
buy     822

此功能完成后你的经验值+30. 输入文件最大不超过40MB. 如果你的程序中途崩
了,会被老五打脸,不增加经验值。

功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。
>dir folder
gone_with_the_wand
runbinson
janelove
>wf folder
gone_with_the_wand
total 1234567 words
the 5023
a 4783
love 4572
fire 4322
run 3822
cheat 3023
girls 2783
girl 2572
slave 1322
buy 822
----
runbinson
total 1234567 words

friday    5023
sea       4783
food      4572
dog       4322
run       3822
hot       3023
cood      2783
cool      2572
bible     1322
eat        822
----
janelove
total  1234567 words

love    5023
chat    4783
lie     4572
run     4322
money   3822
inheritance     3023
class   2783
attribute       2572
data    1322
method  822

因为单词量巨大,只列出出现次数最多的10个单词。
此功能完成后你的经验值+8.

功能4 从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋
友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活
的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管
这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。

>wf -s < the_show_of_the_ring

total 176
the  6
a    3
festival   2
dead 2
for 2
...

>wf
A festival for the dead is held once a year in Japan. The festival is
a cheerful occation, for the dead are said to return to their homes
and they are welcomed by the living.

total 176
the  6
a    3
festival   2
dead 2
for 2
...

此功能完成后你的经验值+10.

功能5 此功能为选做题,如果完成正确得30经验值,如果不做得0经验值,不会倒扣分数。

你完成了所有功能,后面的博客、PSP等也都精心准备了,去食堂的路上心情大悦。坐下挠了挠手机访问cnblogs上的班级,却发现大家的作业也都非常优秀,自己并不突出,心下黯然。怎么才能更加杰出呢?一抬头,看到老杨老师和和邹欣老师正坐桌对面吃饭,你说出了自己的困惑。

老杨说,“精益求精,一步步榨出自己的潜力来,正是走向杰出的开始啊。”

你说,“老师你具体点呗。”

邹欣老师说,“这样,我想知道5个字母的单词中最频繁出现的是哪10个单词,top10,你怎么办呢?”

你一下就想到了,说了思路,应该blablabla。邹欣老师又问,“6个字母的单词中最频繁出现的是哪10个单词呢,top10?”

老杨追问,“6个字母的字母的单词中最频繁出现的是哪100个单词呢,top100?”

你问,“算法我想好了,性能估计也没问题,命令行参数老师怎么规定呢?”

老杨说,"你来规定,写个简单的文档,包括如何运行,给出运行实例的截图。"

"可变的参数就是(1)几个字母和(2)排行前多少是吧?没有问题。"

此时,你想起自己一直做作业还没有吃饭。肚子咕咕叫得声音如此之大,把你吵醒了。是赶紧去吃饭呢,还是做完这题再说?

功能实现

(以上每1经验值对应 1分。)
要求在同一个可执行程序中实现全部功能,而不是每个功能单独用一个可执行程序实现。

博客
(10分)
发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。

代码片断要求1 凡不缩进的,此题目拒绝接收。不知道什么是“缩进”的同学,请自行补课,不接受以“不知道”作为理由。
代码片断要求2 要求使用cnblogs代码控件,参见往届同学黄兴、宫成荣的作业。凡粘贴IDE中的代码截图,或者贴文字而没有关键字高亮或彩色的,0分。
[http://www.cnblogs.com/huangxman/p/5871201.html]
[http://www.cnblogs.com/gongcr/p/5873493.html]

图表过小、字迹不清、错别字、句子不通顺的,教师会因为读不懂而对此题扣分。

PSP
(8分)

在同一篇博客中,参照教材第35页表2-2和表2-3,为上述“项目”制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。

要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求2中每项时间花费的差距,分析原因。

代码及版本控制
(5分。虽然只有5分,但此题如果做错,因为教师得不到你的代码,所以会导致“功能实现”为负分。)
代码要求在 coding.net 做版本控制。要求push&pull时使用git客户端,不允许使用web页面。
要求频繁checkin。要求在PSP中记录的每次离开键盘5分钟以上,需要checkin。如果你持续长达4小时不离开键盘,教师要求展示此项能力。
推荐git客户端tortoisegit。
推荐先pull [https://github.com/weijunying2019102969/novelsfortest.git],里面有测试用例。

要求项目设置为“公开源代码(公开后,任何人都可以访问代码仓库,请慎重考虑!)”,保证教师、助教、其他同学、兄弟院校的师生、教师邀请的专家和老师可以在不需要你授权的情况下访问到源代码。
在项目创建时,请参考下图中红框位置。

代码要求1 在同一篇博客中,发布代码的地址,形如 [https://github.com/weijunying2019102969/novelsfortest.git]。
代码要求2 代码规范要求,凡不缩进的,此题目拒绝接收。不知道什么是“缩进”的同学,请自行补课,不接受以此作为理由。

本版本对于使用语言没有要求。不过考虑到下周作业将有效能分析,所以建议谨慎选择语言。推荐VS环境。不反对本周使用你熟悉的语言,下周再迁移到适合的语言。建议不要通过本作业学习不熟悉的语言,完成任务优先。

教师会使用脚本pull所有项目,如果你的提交不符合规范,非人力所能关怀。

测试

“从控制台读入英文单篇作品”中的英文作品,包括不限于[https://github.com/weijunying2019102969/novelsfortest.git]中的测试用例。大量英文原版(无版权,不是盗版)的测试用例在[http://www.gutenberg.org/]可以找到。

有同学问过“什么是单词”,教师也不确认。

我们在此约定,以下面的数据作为对单词定义(及分界)的猜测。
以[https://github.com/weijunying2019102969/novelsfortest.git]中的wordfreq.sh的运行结果为标准,如果你的程序得到的单词总数与这一脚本统计结果相同,那么对单词的定义符合要求。
WORD统计以上测试用例中《战争与和平》568,286单词,统计 The Dead Return共189词。即,如果你的程序得到的单词总数与WORD相同,那么对单词的定义符合要求。
这一要求作为用户需求,值得质疑和改进。比如,cat和cats算不算同一个单词,do和did呢?估且如此,以wordfreq.sh脚本的运行结果作为需求范围的边界。

教师不仅会使用[https://github.com/weijunying2019102969/novelsfortest.git]中公开的测试用例,也会使用未在此通知你的测试用例。

命令行参数、重定向、标准输入、控制台,是重要概念。如果你此前并未掌握握,一定要先行学习再提交作业。

凡不符合要求的,虽然你可能花费很多辛苦,教师在分数上爱莫能助。

 

合规脚本 https://e.coding.net/nenutest/wf_check/wf_pull_check.git

假装学生的作业 https://e.coding.net/nenutest/wf_check/wf_check.git

readme.md

#合规检测脚本

 

## 用途

 

用于学生自行检测目录结构、文件命名、命令行参数是否正确。

 

## 原理

 

此脚本将会从两个不来git来源pull代码,然后执行、比较执行结果是否与期待的相同。

 

## 使用方法

 

使用前修改 pull_check.sh,在“declare -A map=”接下来的脚本中增加你或你的同学的姓名和git repository地址。

 

## 不保证条款

 

此脚本只供参考,不提供任何保证,包括不限于以下条款。

 1. 教师会使用此脚本以外的测试用例检测学生作业中的代码,因此能够通过示例测试数据检验并不意味着代码正确。

 2. 如果使用此脚本能够正确pull到代码的话,你的git和文件命名很可能合规。

 3. 如果使用此脚本不能够正确pull到代码或者不能自动执行wf的话,你的git和文件命名极其可能不合规。

 

## 运行示例

 

运行效果大致如下,这是pull了两位同学的代码,并且检测通过。

```

$ ./pull_check.sh

mkdir: cannot create directory ‘老吉’: File exists

Reinitialized existing Git repository in C:/git/xxhb_docs_20200908@zhumao/log/lo                                                    gs工作记录/20200925/构建之法/老吉/.git/

From https://github.com/younggiftgit/wf_check

 * branch            master     -> FETCH_HEAD

Already up-to-date.

mkdir: cannot create directory ‘小扣’: File exists

Reinitialized existing Git repository in C:/git/xxhb_docs_20200908@zhumao/log/logs工作记录/20200925/构建之法/小扣/.git/

From https://e.coding.net/nenutest/wf_check/wf_check

 * branch            master     -> FETCH_HEAD

Already up-to-date.

IN 老吉

diff war and peace,没有消息就是好消息

diff simple,没有消息就是好消息

IN 小扣

diff war and peace,没有消息就是好消息

diff simple,没有消息就是好消息

```

 

## 目录结构要求

 

此脚本需要与同目录下的以下目录和文件一同使用,保持目录结构不变。

```

│  pull_check.sh

├─data_exp

│      simple.exp

│      war_and_peace.exp

└─data_in

       simple.txt

       war_and_peace.txt

```

 

## 运行环境

 

在以下环境运行通过。

 

windows操作系统下,git自带的bash。

 

```

git version 2.6.4.windows.1

```

 

```

GNU bash, version 4.3.42(4)-release (x86_64-pc-msys)

```

 

 

readme.md

#wf_check

 

##用途

 

作业demo,以作弊的方式输出正确答案。

用于向学生提供正确的目录结构、文件命名、命令行参数示例。

假装这是一位同学提交的作业。

 

##执行

 

以下运行效果是在bash下截取的,在windows下也符合作业要求。但是,(1)由命令行参数指定文件名与(2)由控制台输入文件,*不可*混淆。

 

以-s simple.txt作为命令行参数,执行wf得到如下结果。

 

```

$ ./wf -s simple.txt

Total 17

      2 the

      2 face

      1 rose

      1 quick

      1 over

      1 lazy

      1 jumps

      1 fox

      1 dog

      1 desk!

      1 brown

      1 bee

      1 bed

      1 bag

      1 a

```

 

##原理

 

C++代码*并未*对词频计数,而是根据文件名输出答案,答案来自类似以下执行的结果。

 

```

$ ./demo.sh -s simple.txt

Total 17

      2 the

      2 face

      1 rose

      1 quick

      1 over

      1 lazy

      1 jumps

      1 fox

      1 dog

      1 desk!

      1 brown

      1 bee

      1 bed

      1 bag

      1 a

```

 

备忘

  1. 李文涛同学的提问及教师答复。

第一,前四个功能的评判标准是什么?命令行输入程序能运行且得到的统计和您的答案一致才是合格?还是说,统计的词频数可以有一定的误差,具体如何评分?

完成功能得分; 尝试实现功能,但是结果错误不得分; 没有尝试功能,视为此小题作业未交,倒扣分数。
统计词频以word为准,你说的"有一定的误差",是什么意思呢,能否举个例子?

第二,老师您批改作业时测试的环境是什么?win7/win10 64/32?,是否要将生成的可执行文件也push到coding上?

非常不错的问题,表明对于测试以结果为准的观点,并且能意识到外部环境对测试的影响。
本周作业教师不运行,但是要求学生可以运行并截图。不能编译和运行的的作业,计为0分。
下周的作业,包括性能上的评估,如你所说,要求push可执行程序到下次作业指定的目录中。就是课堂上提到的,需要在指定的目录下找不到指定名字的exe文件。

下一次作业,为公平和可观测起见,教师的运行环境,以教室内的机器为准。教师的运行环境与教室内机器的环境差异如果产生运行结果的差异,同学指出后,教师会在教室内机器上再运行一遍。所以,教师的机器环境版本对于与运行结果无关。不过,可以保证的是,教师机器内没有java和python,因此使两种语言的同学,需要编译为exe,且不依赖java虚拟机和python解释器。教师机器内没有c/c++语言运行时库,因此同学作业需要编译为release static程序。教师机器内有.net平台,如果同学的作业需要,可以安装任何.net版本。以上术语,建议不懂的同学去搜索,不要略过。工作中的上级工程师或要求,也是如此,"我不懂""当时没看明白就略过了",不会被原谅。从技术的角度,搜索引擎建议不可使用百度,校内IPv6下google可用,或者使用bing。

第三,功能3支持命令行输入存储有英文作品文件的目录名 如果当前目录下有相同名字的文件和文件夹 这样程序应该执行什么操作?(功能2就是 wf 文件名)

考虑周到,赞。"如果当前目录下有相同名字的文件和文件夹",操作系统保证,不会有这样的情况出现。不可相信教师的话,自己测试一下。

  1. 应注明要求在同一个程序中实现全部功能,而不是每个功能用一个程序实现。

  2. 作业需要指出 type是真的有这么一个指令,不是程序的一部分。在没有开始写程序的时候,同学们可以测试一下。">"是提示符,什么是提示符可自行搜索。

4.“此功能完成后你的经验值+30. 输入文件最大不超过40MB. 如果你的程序中途崩
了,会被老五打脸,不增加经验值。”还需指定文件大小的下限,包括不限于 gone with the wind全本作为测试用例。测试用例不大于40MB;不小于新概念第二册任意一篇课文。

5.代码版本控制可以使用github,coding.net等任何符合git规范(包括支持匿名 git pull )的站点。感谢邹欣老师的提醒。

以下是教师的备忘,不是本作业要求的组成部分

助教高远博建议: 把 1.(如有疑问)过度沟通需求 以及 2.读脚本 加粗,3.并在课堂上讲什么是需求 如何理解需求。虽然我们是硕士研究生,但同学们没接触过确实会困惑。

 

感谢韩亚光同学指出 tortoisegit 拼写错误。


提交: 33 人,未提交: 6 人
未提交名单: Yuan&yc    板砖组    _Wetry    最美构建    null小组    背个棒