WordCount程序及测试
Github地址:https://github.com/CG0317/WordCount
PSP表:
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
30 | 30 |
|
· Estimate |
· 估计这个任务需要多少时间 |
720 | 1200 |
|
Development |
开发 |
360 | 600 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 120 |
|
· Design Spec |
· 生成设计文档 |
30 | 30 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 | 20 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 | 20 |
|
· Design |
· 具体设计 |
30 | 60 |
|
· Coding |
· 具体编码 |
300 | 420 |
|
· Code Review |
· 代码复审 |
30 | 60 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 | 240 |
|
Reporting |
报告 |
30 | 120 |
|
· Test Report |
· 测试报告 |
30 | 30 |
|
· Size Measurement |
· 计算工作量 |
10 | 10 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 20 |
|
合计 |
710 | 1180 |
解题思路:
看到题目首先想到的是上学期编译技术课设实现的编译器,通过对输入文件的词法分析对单词,字符和行进行计数,通过语法分析区分代码行,注释行和空行。所以就参照编译器对这次作业进行实现。主要问题有:代码行,空行和注释行的定义,输入内容的需求及报错,实现过程源代码的管理。
程序设计实现过程:
首先定义判定字符的变量,然后函数wc对单词,行和字符进行计数。对于输入,通过count函数判定输入的正确性,同时实现输入所需求的功能。
代码说明:
函数wc:
void wc()//统计单词,字符,行的数量
{
chars = ;
words = ;
lines = ;
while ((c = fgetc(file)) != EOF)
{
chars++;//字符+1
if (!isSeparator(c))
{
words++;//不是分隔符则单词+1
while ((c = fgetc(file)) != EOF)
{
chars++;
if (!isSeparator(c))
{
}//不是分隔符依然算一个单词,若是则继续判定
else if (isLine(c))//若是新行,行数+1
{
lines++;
break;
}
else if (isSpace(c) || isComma(c) || isTab(c))//单词判定结束
{
break;
}
}
}
else if (isLine(c))
lines++;
}
if (chars !=)//有字符的最后一行无换行符依然令行数+1
lines++;
}
逐个读入字符,字符数+1,若不是分隔符,单词数+1,知道读到分隔符,单词计数结束,循环读入,若读到分隔符为换行符,则行数+1,有字符的最后一行没有换行符但行数显然也应该+1.
count函数部分:
char *resultFile = "result.txt", *fileName = NULL,*outputFile = NULL;
int isc=, isw=, isl=,iso = ;//是否有字符、单词、行数计数和指定文件输出结果的需求
for (int i = ; i < argc; i++)
{
if (strcmp(argv[i], "-o") == )//若有-o,则接着输入指定输出文件名
{
if (iso == )
iso = i;
else
{
cout << "error :input format is wrong." << endl;//参数输入重复
return ;
}
if (i < argc - )
outputFile = argv[i + ];
else
{
cout << "error :output file is empty." << endl;//没有输入指定输出文件报错
return ;
}
}
else if (strcmp(argv[i], "-c") == )
{
if (isc == )
isc = i;
else
{
cout << "error :input format is wrong." << endl;
return ;
}
}
else if (strcmp(argv[i], "-w") == )
{
if (isw == )
isw = i;
else
{
cout << "error :input format is wrong." << endl;
return ;
} }
else if (strcmp(argv[i], "-l") == )
{
if (isl == )
isl = i;
else
{
cout << "error :input format is wrong." << endl;
return ;
} }
else if (i!= && i < && fileName == NULL && argv[i][] != '-')
{
fileName = argv[i];
} }
对输入输出文件定义,按照输入参数的顺序规定输入格式,同时对不规则的输入进行判断,给出错误提示。
输出结果:
fstream resFile;
resFile.open(resultFile, ios_base::out);
for (int i = ; i < argc; i++)
{
if (strcmp(argv[i], "-c") == )
{
cout << "字符数:" << chars << endl;
if (resFile.is_open())
{
resFile << fileName << ", 字符数:" << chars << endl;
}
}
else if (strcmp(argv[i], "-w") == )
{
cout << "单词数:" << words << endl;
if (resFile.is_open())
{
resFile << fileName << ", 单词数:" << words << endl;
}
}
else if (strcmp(argv[i], "-l") == )
{
cout << "行数:" << lines << endl;
if (resFile.is_open())
{
resFile << fileName << ", 行数:" << lines << endl;
}
}
}
resFile.close();
}
将计算结果输入到默认输出文件,若判定有“-o”输入到指定文件。
测试设计过程:
测试需要覆盖程序中所有可执行语句,所以要尽量测试出程序功能的问题,程序易出现风险的地方有:注释行判定,输入参数规范判定,停用词表的判定等。程序功能有,统计单词,字符,行数,统计代码行,注释行,空行数,将统计结果输入到默认或指定文件,递归处理目录下符合条件的文件,排除停用词表内容的单词计数,错误输入的报错等。测试用例对应代码的功能及易出错的地方进行检验,测试用例如下:
test1:测试-c功能
输入:WCtest.exe -c file.c
test2:测试-w功能
输入:WCtest.exe -w file.c
test3:测试-l功能
输入:WCtest.exe -l file.c
test4:测试-a功能
输入:WCtest.exe -a file.c
test5: 测试-o功能
输入:WCtest.exe -c file.c -o outputFile.txt
test6: 测试-e功能
输入:WCtest.exe -c file.c -e stop.txt
test7:测试多个参数共用
输入:WCtest.exe -c -w -l -a file.c -e stop.txt -o outputFile.txt
test8: 测试-s功能
输入:WCtest.exe -s -c -w -l *.c
test9:测试参数错误报错
输入:WCtest.exe -c -c -b file.c
test10:测试输入/输出文件为空报错
输入:WCtest.exe -c -w -o outputFile.txt/WCtest.exe -c -w file.c -o
参考文献如下:
【1】:https://www.cnblogs.com/xiaoyongwu/p/5303132.html
【2】:http://www.cnblogs.com/xinz/p/5044037.html
【3】:http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
【4】:http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html
WordCount程序及测试的更多相关文章
- spark学习11(Wordcount程序-本地测试)
wordcount程序 文件wordcount.txt hello wujiadong hello spark hello hadoop hello python 程序示例 package wujia ...
- WordCount程序与测试
Github地址: https://github.com/hcy6668/wordCount PSP表格: PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 40 ...
- Hadoop集群测试wordcount程序
一.集群环境搭好了,我们来测试一下吧 1.在java下创建一个wordcount文件夹:mkdir wordcount 2.在此文件夹下创建两个文件,比如file1.txt和file2.txt 在fi ...
- WordCount小程序及测试
Github项目地址:https://github.com/792450735/wc PSP表格: PSP2.1表格[1] PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Plann ...
- wordcount程序实现与测试
GitHub地址 https://github.com/jiaxuansun/wordcount PSP表格 PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 5 ...
- 软件工程:Wordcount程序作业
由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...
- Hadoop环境搭建及wordcount程序
目的: 前期学习了一些机器学习基本算法,实际企业应用中算法是核心,运行的环境和数据处理的平台是基础. 手段: 搭建简易hadoop集群(由于机器限制在自己的笔记本上通过虚拟机搭建) 一.基础环境介绍 ...
- hadoop学习笔记——用python写wordcount程序
尝试着用3台虚拟机搭建了伪分布式系统,完整的搭建步骤等熟悉了整个分布式框架之后再写,今天写一下用python写wordcount程序(MapReduce任务)的具体步骤. MapReduce任务以来H ...
- hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002
一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...
随机推荐
- git常用命令收藏
git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase origin m ...
- 【机器学习】集成学习之xgboost的sklearn版XGBClassifier使用教程
XGBClassifier是xgboost的sklearn版本.代码完整的展示了使用xgboost建立模型的过程,并比较xgboost和randomForest的性能. # -*- coding: u ...
- MongoDB shell基本操作
shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的.使用shell 命令,需要启动mongo.exe.mongodb百科 常用shel ...
- bzoj 3887: Grass Cownoisseur Tarjan+Topusort
题目: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) 题解: 首先考虑简单 ...
- SPI编程1:用户空间的读写操作
spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它.在内核中 ...
- Mybatis代码学习
Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...
- rtsp/rtp over http
转载:http://linux-expert.blog.163.com/blog/static/764585292008530912712/ rtsp/rtp over http C->S (g ...
- 数据库:sql语句分别按日,按周,按月,按季统计金额
如: 表:consume_record 字段:consume (money类型) date (datetime类型) 请问怎么写四条sql语句分别按日,按周,按月,按季统计消费总量. 如:1月 120 ...
- pa15-三省吾身
序号 项 1 凡事提前10分钟 凡事提前10分钟,会让你有充裕的时间应对可能的突发事件,更加从容. 试着把起床闹钟提前10分钟,你就会发现你出门不必急匆匆,早饭也可慢慢享用,一整天的状态也 ...
- java 多线程系列基础篇(八)之join()、start()、run()方法
1. join()介绍 join() 定义在Thread.java中.join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行.这句话可能有点晦涩,我们还是通过例子去理解: // 主线程 ...