WordCount的实现和测试
WordCount
一、开头
(1)合作者:201631107110,201631083416
(2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git
(3)本次作业链接地址:https://www.cnblogs.com/zhaoxiaoqin/articles/9824449
二、正文
1.项目完成情况:
1.1 基本功能(完成)
wc.exe -c input.c //返回文件 file.c 的字符数
wc.exe -w input.c //返回文件 file.c 的单词总数
wc.exe -l input.c //返回文件 file.c 的总行数
1.2 扩展功能(未完成)
wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a input.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符
2.实现代码
2.1 main函数实现参数传递
int main(int argc, char* argv[]) {
Test(argc, argv);//测试
getchar();
return ;
}
2.2 GetOption函数实现参数解析
int *GetOptions(int argc,char* argv[])
{
/* 返回0代表参数有错
* 1 表示读取字母
* 3 表示读取单词
* 5 表示读取行数
* 它们的和代表所要的功能
*/ char* params;
for(int i=;i<argc;i++)
{
params = argv[i];
if(strcmp("-c",params) == )
{
ret[] += ;
}
else if(strcmp("-w",params) == )
{
ret[] += ;
}
else if(strcmp("-l",params) == )
{
ret[] += ;
}
//启动图形界面,则退出命令行结口 }
if(argc > ) {
params = argv[argc - ];
if (strcmp("-o", params) == && argv[argc - ] != NULL) {
result = argv[argc - ];
ret[] = argc - ;
}
else
{
ret[]= argc - ;
}
}else {
ret[] = argc - ;
}
//处理 -o之前缺少输入文件
return ret;
}
2.3 WordCount函数根据解析的参数执行相应操作
void WordCount(int argc,char* argv[])
{
list = createlist();//创建单词列表
char* fileName;
if (argc <= ) {
Help();
exit();
}
GetOptions(argc,argv);
fileName = argv[ret[]];
switch(ret[])
{
case :
ReadChar(fileName);
break;
case :
ReadWord(fileName);
break;
case :
Readlines(fileName);
break;
case : {
ReadChar(fileName);
flag = ;
ReadWord(fileName);
break;
}
case : {
ReadChar(fileName);
flag = ;
Readlines(fileName);
break;
}
case :{
ReadWord(fileName);
flag = ;
Readlines(fileName);
break;
}
case : {
CharWordLine(fileName);
break;
}
default:
Help();
break;
}
}
2.4 ReadChar函数实现对文件的字符统计
void *ReadChar(char* fileName)
{
char* feature = "字符数: ";
char buf;
//int count[1] = {0}; //用来储存字母出现过的次数
int sum = ;
FILE* fp = fopen(fileName,"r");
if (fp == NULL)
{
printf("Fail to open the file!\n");
Help();
exit(-);
}
while(!feof(fp))
{
buf = fgetc(fp);
sum ++;
}
fclose(fp);
int count[] = {sum};
WriteToFile(fileName,count,,feature);
print(fileName, count, , feature);
}
2.5 ReadWord实现对文件的单词统计
void *ReadWord(char* fileName)
{
/*在记录单词个数 的时候,
* 我们通过统计逗号和空格的个数
* 然后通过计算得到单词的个数
* 假设每个单词的长度不超过256字母
*/ char *feature = "单词数:";
getwordCount(fileName);//得到文件的单词统计
printword();
int sum = ;
for (int i = ; i < list.count; i++)
sum += list.list[i].count;//计算总量
int count[] = { sum };
WriteToFile(fileName, count, , feature);
return NULL;
}
2.6 ReadLine 实现对文件行数的统计
void *Readlines(char* fileName)
{
char buf = '\0';
char* feature = "行数: ";
FILE* fp = NULL;
fp = fopen(fileName,"r");
if (fp == NULL)
{
printf("Fail to open the file!\n");
Help();
exit(-);
}
int space[] = {}; //记录行数
while(!feof(fp))
{
buf = fgetc(fp);
if (buf == ) //换行符的ASCII码为10 只要找出所有的换行符就好
{
space[] ++;
}
}
space[] ++; //在最后一个行中会把换行符设置为其他字符,随意需要加1
WriteToFile(fileName,space,,feature);
print(fileName, space, , feature);
//关闭文件
fclose(fp);
}
2.7 WriteToFile函数实现将统计信息存入文件中
void WriteToFile(char* fileName,int count[],int Csize,char* feature)
{
/*fileName 表示读取的文件
* count 表示记录的个数
* Csize 表示记录数组的大小
* feature表示记录的内容 单词或者字母或者行数
* flag 表示只写,还是追加模式,0 表示只写,1表示追加
*/
char *mode = '\0';
if (flag == )
{
mode = "a+";
}
else
{
mode = "w+";
}
int index = ; //记录字符数
for(int i=;i<Csize;i++)
{
if(count[i] != )
{
index += count[i]; //计算总的单词个数
}
}
FILE *fp = NULL;
fp = fopen(result,mode); //将结果写入文件
if (fp == NULL)
{
printf("Failed when writing the count to file\n");
exit(-);
}
fprintf(fp,"%s,%s %d\n",fileName,feature,index); //写入文件 if (list.count > )
{
for (int i = ; i < list.count; i++)
{
fprintf(fp, "%s:%d\n", list.list[i].wordstring, list.list[i].count); //写入文件
}
}
fclose(fp);
}
2.8 getwordCount函数实现对文件中各单词的分离和统计
void getwordCount(char *filename)//得到各单词的个数统计
{
char data[];//假设每行最多100个字符
FILE* fp = NULL;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("Fail to open the file!\n");
Help();
getchar();
exit(-);
}
while (!feof(fp))
{
fscanf(fp, "%s", &data);
char str[n];
for (int i = ; i < n; i++)
{
str[i] = '\0';
}
int len = ;
for (int i = ; i < strlen(data); i++)
{
char c = data[i];
if (!issplitchar(c))//若不为单词分隔符
{
str[len] = c; len++;
}
else//若为单词分隔符且指针不超过字符长度
{
if (len > )
{
additem(&list, str);//添加
} for (int i = ; i < n; i++)
{
str[i] = '\0';
}
len = ;
}
}
if (len > )
{
additem(&list, str);//添加
}
}
fclose(fp); }
2.9 word和wordlist结构体用于保存单词和单词的个数
typedef struct word//保存单词信息
{
char* wordstring;//内容
int count;//数量
}word; typedef struct wordlist//单词列表定义
{
word *list;//单词列表
int count;//单词种类个数
}wordlist;
3.互审代码情况
| 参数 | 功能 |
| -w | 统计文件中的单词个数以及各单词的个数并写入输出文件中 |
| -l | 统计文件的行数并写入输出文件中 |
| -c | 统计文件中的字符个数并写入输出文件中 |
| -o | 文件的路径 |
已完成WordCount的基本功能,包括字符计数、行数计数、单词统计等,但在单词统计和行数统计同时存在时,输出文件中的行数会写错位,该版本的WordCount可以接收多个参数,比如-w -c -l等,可以同时存在,而-w参数可以统计文本文件中的各单词的个数并将其保存在输出文件中。
4.静态代码检查情况
利用VisualStudio自带的静态代码检测工具对项目进行代码检测后,结果如下:

在对出现的风险代码进行修改后,对项目进行测试。
5.测试
5.1 测试用例
| 用例编号 | 输入 | 输出 | 测试结果 |
| 1 | WordCount.exe -c text.txt | 文件字符数:726 | 通过 |
| 2 | WordCount.exe -l text.txt | 文件行数:8 | 通过 |
| 3 | WordCount.exe -w text.txt |
单词种类数:80 |
通过 |
| 4 |
WordCount.exe -c -l text.txt |
文件字符数: :736 |
通过 |
|
5 |
WordCount.exe -c -l -w text.txt |
文件字符数: :736 文件行数:8 |
通过 |
5.2 测试
测试用例1

测试用例2

测试用例3

测试用例4

测试用例5

6.总结
在对项目进行了一系列测试后,发现该项目不存在较大bug,在输入命令参数时,若输入了不合规则的参数,程序会输出提示字符串,但其中的单词统计不能统计诸如I_ptr等带有下划线的单词,可以在后期的改进中,改良分隔字符串检测的算法,该项目的总体思路为:用户在输入参数后,通过main函数的参数传递,将参数传递到GetOption函数中,GetOption函数通过输入参数的个数和种类来解析用户想要执行的命令,并将命令传递到WordCount函数中,对文件执行相应的操作,而在单词统计模块中,该项目自定义了一个结构体来保存单词的字符串和出现次数,当统计函数对文件进行扫描时,每当扫描出一个单词便判断该单词是否在单词列表中,若不在单词列表中则将该单词添加,若在单词列表中则将该单词的次数加1,从而实现了对文件中不同单词的分隔和个数统计。
WordCount的实现和测试的更多相关文章
- 软件质量与测试——WordCount编码实现及测试
1.GitHub地址 https://github.com/noblegongzi/WordCount 2.PSP表格 PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟) ...
- WordCount 的实现与测试
一.开头 (1)合作者:201631062627,201631062427 (2)代码地址:https://gitee.com/catchcatcat/WordCount.git 二.正文 (1)基本 ...
- 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 ...
- 安装Hadoop系列 — 新建MapReduce项目
1.新建MR工程 依次点击 File → New → Ohter… 选择 “Map/Reduce Project”,然后输入项目名称:mrdemo,创建新项目: 2.(这步在以后的开发中可能 ...
- MapReduce-CombineTextInputFormat 切片机制
MapReduce 框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,如果有大量小文件,就会产生大量的 MapTask,处理小文件效率非常低. CombineTextInpu ...
- MapReduce-TextInputFormat 切片机制
MapReduce 默认使用 TextInputFormat 进行切片,其机制如下 (1)简单地按照文件的内容长度进行切片 (2)切片大小,默认等于Block大小,可单独设置 (3)切片时不考虑数据集 ...
- 【原创】大数据基础之词频统计Word Count
对文件进行词频统计,是一个大数据领域的hello word级别的应用,来看下实现有多简单: 1 Linux单机处理 egrep -o "\b[[:alpha:]]+\b" test ...
- CDH- 测试mr
cdh的mr样例算法的jar包在 [zc.lee@ip---- hadoop-0.20-mapreduce]$ pwd /opt/cloudera/parcels/CDH--.cdh5./lib/ha ...
随机推荐
- [python]兔子问题,斐波那契数列 递归&非递归
假设一对幼年兔子需要一个月长成成年兔子,一对成年兔子一个月后每个月都可以繁衍出一对新的幼年兔子(即兔子诞生两个月后开始繁殖).不考虑死亡的情况,问第 N 个月时共有多少对兔子? 结果前几个月的兔子数量 ...
- Django REST Framework之权限组件
权限控制是如何实现的? 一般来说,先有认证才有权限,也就是用户登录后才能判断其权限,未登录用户给他一个默认权限. Django接收到一个请求,首先经过权限的检查,如果通过检查,拥有访问的权限,则予以放 ...
- Spring Boot(三) 使用Lombok
C#写的多了用习惯了众多的语法糖,再写起来Java总会有一些非常不舒服的地方.比如用惯了C#的属性在用起来Java的属性,写起来就会感觉不够优雅.如:定义一个Person类 public cl ...
- ArchLinux安(重)装指南
说实话,我其实是不想要出这篇博客的.在我这一个月安装Arch的过程中,让我感触比较深的一点是: 没有谁比这个系统的官方更懂它. 尤其是这种比较复杂的系统,更是如此. 这几天,我经历了一次重装,系统坏了 ...
- 死磕 java线程系列之线程模型
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...
- Docker 为非root用户授权
Docker 为非root用户授权: 当运行docker pull busybox时候,会提示sky用户无法调用docker. 那么应该把sky用户加入docker用户组,不过在添加的时候,又提示了如 ...
- PHP 微信机器人 Vbot 结合 Laravel 基础入门及实例
新来了项目,需要能监听指定微信群的消息并进行转发.基于 PHP 7 的 web 微信机器人 Vbot 可以满足需求.Vbot 本质上就是实现了登录网页版微信来进行自动回复.群管理等等操作. githu ...
- Springboot + Mysql8实现读写分离
在实际的生产环境中,为了确保数据库的稳定性,我们一般会给数据库配置双机热备机制,这样在master数据库崩溃后,slave数据库可以立即切换成主数据库,通过主从复制的方式将数据从主库同步至从库,在业务 ...
- raspbian修改swap分区为硬盘上的分区
一直以为raspbian的swap分区和平常装系统时候的swap分区是一样的,最近用u盘插在树莓派上运行后发现这个交换分区和我想象中不一样. 百度后发现它是一个文件挂上去的.直接搞把! pi@rasp ...
- 【windows】远程桌面 把远程服务器的explorer.exe进程关掉了,咋办?
在操作windows2008R2服务器时不小心把explorer.exe进程关闭了,瞬间整个界面就蓝色了. 重启,做不到,各种快捷键用不了,最后发现Alt+Tab可以用,刚好打开了IIS, 打开其中一 ...