GitHub地址

https://github.com/jiaxuansun/wordcount

PSP表格

PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 5
·Estimate 估计这个任务需要多少时间 10 5
Development 开发 510 500
·Analysis 需求分析 (包括学习新技术) 40 30
·Design Spec 生成设计文档 20 20
·Design Review 设计复审 (和同事审核设计文档) 10 10
·Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
·Design 具体设计 30 30
·Coding 具体编码 300 240
·Code Review 代码复审 40 40
·Test 测试(自我测试,修改代码,提交修改) 60 120
Reporting 报告 70 80
·Test Report 测试报告 30 40
·Size Measurement 计算工作量 10 10
·Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 30
合计 590 585

解题思路

对整体程序的功能需求进行划分如下:

  • 参数分析功能:判断命令行的参数,保存所做的选项,并根据选项执行相应的命令,然后输出的结果

  • 查找文件功能:查找输入的文件需要支持如"*.c"等简单匹配符,在有-s选项的情况下,需要在当前目录下递归查找文件

  • 基本计数功能:实现课设基本功能要求的计算文件字符数、行数、单词数的功能

  • 代码计数功能:实现课设扩展功能要求的计算文件代码行数、空行数、注释行数的功能

根据功能复杂程度选择Python语言完成作业

程序设计实现

根据分析结果将代码分为如下几个模块:

  • 入口代码:设定所需要支持的参数内容
  • main函数:查找目录下所有的目标文件,对每一个文件调用基本功能函数和扩展功能函数,并将结果返回;若选择-s选项,则递归查找当前目录下的各个目录
  • wordcount函数:实现课设要求的基本功能
  • codecount函数:实现课设要求的扩展功能

代码说明

入口和标准库的参数解析对象初始化:

if __name__ == "__main__":
parser = argparse.ArgumentParser(description="word count")
parser.add_argument("-o", "--output", type=str, default="result.txt")
parser.add_argument("-c", "--bytes", action="store_true")
parser.add_argument("-w", "--words", action="store_true")
parser.add_argument("-l", "--lines", action="store_true")
parser.add_argument("-s", "--recursive", action="store_true")
parser.add_argument("-a", "--code", action="store_true")
parser.add_argument("-e", "--stoplist", type=str)
parser.add_argument("filename", type=str)
args = parser.parse_args()
result = main(args, os.getcwd())
print_result(args, result)

查找目录并根据不同的参数来调用不同的功能函数:

def main(args, rootpath):
result = []
filename = args.filename.replace("*", "\\w*")
if args.recursive:
for name in os.listdir(rootpath):
path = os.path.join(rootpath, name)
if os.path.isdir(path):
result += main(args, path)
elif re.findall(filename, name):
fd = open(path)
wc = wordcount(fd.read())
if args.stoplist:
fd.seek(0)
content = fd.read()
stoplist = open(args.stoplist)
stopchars = stoplist.read().split()
count = 0
for c in stopchars:
count += len(re.findall(c, content))
r["words"] -= count
stoplist.close()
if args.code:
fd.seek(0)
wc.update(codecount(fd))
wc["filename"] = name
result.append(wc)
fd.close()
else:
for name in os.listdir(rootpath):
path = os.path.join(rootpath, name)
if os.path.isdir(path):
pass
elif re.findall(filename, name):
fd = open(path)
wc = wordcount(fd.read())
if args.stoplist:
fd.seek(0)
content = fd.read()
stoplist = open(args.stoplist)
stopchars = stoplist.read().split()
count = 0
for c in stopchars:
count += len(re.findall(c, content))
r["words"] -= count
stoplist.close()
if args.code:
fd.seek(0)
wc.update(codecount(fd))
wc["filename"] = name
result.append(wc)
fd.close() return result

基本功能实现:

def wordcount(content):
print(re.split(r"[\s,]+", content))
result = {
"words": len(re.split(r"[\s,]+", content))-1, # 单词数
"lines": len(content.split('\n'))-1, # 行数
"bytes": len(content)-1 # 字符数
} return result

扩展功能实现

def codecount(fd):
codelines = 0
blanklines = 0
commentlines = 0
isComment = False
isString = False
isCode = False
for line in fd.readlines():
line = line.strip().replace('{', '').replace(
'}', '').replace(';', '') # 去掉{};以便计算空行
if not isComment and not line:
blanklines += 1
continue
if isComment:
commentlines += 1
elif line.replace('/', '').replace('*', ''):
codelines += 1
line = '\n'+line+'\n'
for i in range(1, len(line)):
if line[i] == '"' and line[i-1] != '\\':
isString = not isString
if not isString:
if line[i] == '/' and line[i+1] == '/' and not isComment:
if not line[:i].split():
blanklines += 1
commentlines += 1
break
if line[i] == '/' and line[i+1] == '*' and not isComment:
isComment = True
commentlines += 1
i += 1
if line[i] == '*' and line[i+1] == '/':
isComment = False
i += 1 result = {
"codelines": codelines,
"blanklines": blanklines,
"commentlines": commentlines
} return result

测试设计过程

如何设计测试用例

测试时应重点考虑边界值以及特殊情况,使测试用例最大程度覆盖代码。

思想是使每一个判断语句都执行一遍,实现条件覆盖,尽量让每一个判断语句在是与否的情况下都能执行一遍,实现语句覆盖。

哪些地方会导致程序高风险

当输入文件内容为空或输入大于文件内容的边界时会导致程序高风险

测试代码设计

  • test1.c
File write,name = new File(outputPath);
writename.createNe|wFile();
Buffe,redWriter out = new BufferedWrit,er(new FileWriter(writename));
out.close();

测试字符数统计

  • test2.c
test()
{
File writename = new File(outputPath);
writename.createNewFile();
codeLine */
BufferedWriter out = new BufferedWriter(new FileWriter(writename));
// note line
out write(outputBuffer);
/* noteLine
/* noteLine
*/
/* noteLine */
/* noteLine
// noteLine
*/
out.flush();
out.close();
}
// noteLine
for(){}/* noteLine */

测试代码行数、注释行数、空行数统计

  • test3.c
test()
{
File writename = new File(outputPath);
writename.createNewFile();
codeLine */
BufferedWriter out = new BufferedWriter(new FileWriter(writename));
// note line
out write(outputBuffer);
/* noteLine
/* noteLine
*/
/* noteLine */
/* noteLine
// noteLine
*/
out.flush();
out.close();
} // noteLine
for(){
}/* noteLine */

测试单词数、行数统计

  • end.txt
for
new
out
  • 测试递归查找文件:文件夹test1,其中有一个test3.c文件,选择-s选项测试即可

-测试命令:

wordcount.exe

wordcount.exe -c test1.c

wordcount.exe -w test3.c

wordcount.exe -l test3.c

wordcount.exe -a test2.c -o testout1.txt

wordcount.exe -s -w test3.c

wordcount.exe -w -e end.txt test2.c

wordcount.exe -a -w -e end.txt test1.c

wordcount.exe -l -w -a -c test2.c -o testout2.txt

wordcount.exe -l -w -a -c -s test3.c -o testout2.txt

参考文献

  1. http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
  2. http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
  3. http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html

wordcount程序实现与测试的更多相关文章

  1. Hadoop集群测试wordcount程序

    一.集群环境搭好了,我们来测试一下吧 1.在java下创建一个wordcount文件夹:mkdir wordcount 2.在此文件夹下创建两个文件,比如file1.txt和file2.txt 在fi ...

  2. spark学习11(Wordcount程序-本地测试)

    wordcount程序 文件wordcount.txt hello wujiadong hello spark hello hadoop hello python 程序示例 package wujia ...

  3. 软件工程:Wordcount程序作业

    由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...

  4. Hadoop环境搭建及wordcount程序

    目的: 前期学习了一些机器学习基本算法,实际企业应用中算法是核心,运行的环境和数据处理的平台是基础. 手段: 搭建简易hadoop集群(由于机器限制在自己的笔记本上通过虚拟机搭建) 一.基础环境介绍 ...

  5. hadoop学习笔记——用python写wordcount程序

    尝试着用3台虚拟机搭建了伪分布式系统,完整的搭建步骤等熟悉了整个分布式框架之后再写,今天写一下用python写wordcount程序(MapReduce任务)的具体步骤. MapReduce任务以来H ...

  6. hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002

    一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...

  7. 021_在Eclipse Indigo中安装插件hadoop-eclipse-plugin-1.2.1.jar,直接运行wordcount程序

    1.工具介绍 Eclipse Idigo.JDK1.7-32bit.hadoop1.2.1.hadoop-eclipse-plugin-1.2.1.jar(自己网上下载) 2.插件安装步骤 1)将ha ...

  8. 50、Spark Streaming实时wordcount程序开发

    一.java版本 package cn.spark.study.streaming; import java.util.Arrays; import org.apache.spark.SparkCon ...

  9. 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)

    什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...

随机推荐

  1. 真机环境spotlight光源丢失

    maya做好的模型生成的fbx,导入到unity之后,pc运行正常,到了ios真机上发现光线丢失,场景内物体都是暗暗的,查出来原因是spot光源丢失了,选中spot光源,在其Render Mode里, ...

  2. 洛谷 P1854 花店橱窗布置

    题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...

  3. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

  4. LCD升压反压驱动电路

    在嵌入式系统里,较多场合需要LCD人机界面.分析以下LCD驱动电路. LCD_VIN是3.6~5V,经过DC/DC burst升压得到LCD_AVDD,LCD_AVDD为LCD需要的模拟电压,根据LC ...

  5. LR录制https协议设置方法

    1.New一个脚本,option --> port mapping --> 选择第二个  WinNet level data 2.Run-time Setting --> Prefe ...

  6. shell脚本 - 快速到达目录

    服务器中存放很多工程目录,通过ssh登录,需要手动敲命令,很麻烦,可以建立自动登录脚本 1.在服务器登录是默认的目录中建立脚本文件 vi drivers.sh #建立登录脚本 cd data/work ...

  7. c# OrderBy 实现List升序降序

    本文转载自:http://blog.csdn.net/chadcao/article/details/8730132 1)前台代码 <%@ Page Language="C#" ...

  8. 网页效果分析 VCD分解

    VCD分解分为三部分: 1. view 视觉                   HTML + CSS 基本界面模板 2. controller 控制            javascript  内 ...

  9. Oracle 11g R2(11.2.0.4) RAC 数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件

    Oracle 11g R2(11.2.0.1) RAC  数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件 oracle 11g R2(11.2.0.4) rac--scan ...

  10. 侯捷STL学习(九)--关联式容器(Rb_tree,set,map)

    layout: post title: 侯捷STL学习(九) date: 2017-07-21 tag: 侯捷STL --- 第十九节 容器rb_tree Red-Black tree是自平衡二叉搜索 ...