WordCount 的实现与测试
一、开头
(1)合作者:201631062627,201631062427
(2)代码地址:https://gitee.com/catchcatcat/WordCount.git
二、正文
(1)基本功能
统计file.c的字符数(实现)
int CharacterCount(char *Character) { //字符个数的计算
FILE *file = fopen(Character, "r");
assert(file != NULL); //容错处理
char character;
int count = ;
while ((character = fgetc(file)) != EOF) //读取字符直到结束
count+= ((character != ' ') && (character != '\n') && (character != '\t')); //判断输入是否是字符并合法
fclose(file);
return count;
}
统计file.c的单词数(实现)
int WordCount(char *Character) { //单词个数的计算
FILE *file = fopen(Character, "r");
assert(file != NULL);
char word;
int isword = ; //用于记录字符是否处于单词中
int count = ;
while ((word = fgetc(file)) != EOF) {
if ((word >= 'a' && word <= 'z') || (word >= 'A' && word <= 'Z')) { //判断输入是否是字母并合法
count += (isword == );
isword = ; //记录单词状态
}
else
isword = ; //记录不处于单词状态
}
fclose(file);
return count;
}
统计file.c的行数(实现)
void AllDetail(char *Character) { //显示空行, 代码行,注释行
FILE *file = fopen(Character, "r");
assert(file != NULL);
char *s = (char*)malloc( * sizeof(char));//申请内存空间
int i;
int is_codeline = ; //状态记录变量
int is_annoline = ;
int AnnoLock = ;
int AnnoFileLock = ;
int codecount = ;
int annocount = ;
int blankcount = ;
while (fgets(s, , file) != NULL) { //逐次取文件中的行
for (i = ; *(s+i) != '\0'; i++) {
if ( ( ( *(s+i) >= 'a' && *(s+i) <= 'z') || ( *(s+i) >= 'A' && *(s+i) <= 'Z') ) && AnnoFileLock == ) {//判断是否是代码行
codecount += (is_codeline == && AnnoLock == ); //进入代码行的时候代码行加一
is_codeline = ;
}
if ( *(s+i) == '/' && *(s+i+) == '/' && is_codeline == && AnnoFileLock == ){ //判断是否为注释行
annocount++;
AnnoLock = ;
}
if (*(s + i) == '/' && *(s + i + ) == '*'){ //判断文档注释开始
AnnoFileLock = ;
annocount -= is_codeline; //注释在代码后不算注释行,减一
}
if (*(s + i) == '*' && *(s + i + ) == '/') { //判断文档注释结束
AnnoFileLock = ;
annocount += (*(s + i + ) == '\n'); //注释后换行情况
}
}
annocount += AnnoFileLock; //注释行结束时算作注释行加一
blankcount++; //每一行结束计数加一,并清空状态
is_codeline = ;
is_annoline = ;
AnnoLock = ;
}
free(s);
fclose(file);
blankcount = blankcount - codecount - annocount;
printf("codeline:%d, annoline:%d, blankline:%d\n", codecount, annocount, blankcount);
}
int LineCount(char *Character) { //行数的计算
FILE *file = fopen(Character, "r");
assert(file != NULL);
char *s = (char*)malloc( * sizeof(char));
int count = ;
for (; fgets(s, , file) != NULL; count++); //逐次读行
free(s);
fclose(file);
return count;
}
拓展功能
递归处理目录下符合类型的文件(实现)
void Scan(char *Character, char Test1) {
char *FileName = NULL;
char *FileType = NULL;
char Temp[];
long Head;
struct _finddata_t FileData;
int i = ;
FileName = Character;
while (*(Character + i) != '\0') { //找出文件名和文件类型的位置
if (*(Character + i) == '\\')
FileName = Character + i + ;
if (*(Character + i) == '.')
FileType = Character + i + ;
i++;
}
strcpy(Temp, FileType);//调整字符串状态
*FileType = '*';
*(FileType + ) = '\0';
Head = _findfirst(Character, &FileData);
strcpy(FileType, Temp);//恢复字符串状态
do {
if ( !strcmp(FileData.name, "..") || !strcmp(FileData.name, ".")) //删除前驱文件路径
continue;
if (_A_SUBDIR == FileData.attrib) //如果是文件夹
{
strcpy(Temp, FileName); //调整字符串状态
for (i = ; *(FileData.name + i) != '\0'; i++) {
*(FileName + i) = *(FileData.name + i);
}
*(FileName + i) = '\\';
*(FileName + i + ) = '\0';
strcat(Character, Temp);
Scan(Character, Test1);
strcpy(FileName, Temp); //恢复字符串状态
}
else//如果是文件的话
{
for (i = ; *(FileData.name + i) != '.'; i++);
if (!strcmp(FileData.name + i + , FileType)) { //如果是指定的类型文件
strcpy(Temp, FileName);
strcpy(FileName, FileData.name); //调整字符串状态
printf("%s: ", FileData.name);
Start(Test1, NULL, Character); //将地址及功能传递到启动函数
printf("\n");
strcpy(FileName, Temp);//恢复字符串
}
}
} while (_findnext(Head, &FileData) == );
_findclose(Head);
}
显示代码行、空行、和注释行的行数(实现)附在行数统计
(2)代码互审情况
大部分的代码都没有问题,在主函数传递和计算单词量时出现了一些函数传递不一致和变量问题,已修改
int WordCount(char *Character) { //单词个数的计算
FILE *file = fopen(Character, "r");
assert(file != NULL);
char word;
int isword = ; //用于记录字符是否处于单词中
int count = ;
while ((word = fgetc(file)) != EOF) {
if ((word >= 'a' && word <= 'z') || (word >= 'A' && word <= 'Z')) { //判断输入是否是字母并合法
count += (isword == );
isword = ; //记录单词状态
}
else
isword = ; //记录不处于单词状态
}
fclose(file);
return count;
}
int main(int argc, char *argv[]) {
char Character[] = "*.c"; //给定的默认参数
char Test1 = 's';
char Test2 = 'c';
if (argv[]) { //有输入参数则以输入为准
Test1 = *(argv[] + );
if (Test1 == 's') {
Test2 = *(argv[] + );
strcpy(Character, argv[]);
}
else
strcpy(Character, argv[]);
}
Start(Test1, Test2, Character); //调用启动函数
printf("\n请输入任意字符以继续...");
getchar();
return ;
}
(3)静态代码检查情况
我将C++代码放在如图所示的文件夹中欧冠,但是运用CPPCHECK试着去做,测试结果显示了基础信息和未发现错误

(4)单元测试情况
测试行数

测试单词数

测试字符数

(5)性能测试和优化
性能测试选择.JProfiler
性能测试有些难以使用,并且有许多地方不懂,询问同学和学长都很少有涉及到的,所以暂时放下了这个点
三、实验总结
这次项目的合作对于我们来说是比较困难的。因为之前的代码量比较少,所以很多功能在实现和合并时出现很多BUG,而且由于自身知识量的不够在测试或优化时未能尽善尽美,所以我们虚心请教学长还有学霸后最终完成了项目。对项目本身还有一点疑问未能解决,有些算法也是在网上查询,不能有效理解,还需要继续努力。
WordCount 的实现与测试的更多相关文章
- 软件质量与测试——WordCount编码实现及测试
1.GitHub地址 https://github.com/noblegongzi/WordCount 2.PSP表格 PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟) ...
- 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 一.开头 (1)合作者:201631107110,201631083416 (2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git ...
- 安装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 ...
随机推荐
- DIOCP-DIOCPv5的处理能力
今天和BB讨论了下DiocpV5的单连接处理能力.一直没有做过这方面的测试,稍微试了一下. 把开始的时候客户端Sleep(10),为了测试处理能力,把Sleep(10)去掉了,20秒(实际应该算17秒 ...
- 2. RNN神经网络模型的不同结构
1. RNN神经网络模型原理 2. RNN神经网络模型的不同结构 3. RNN神经网络-LSTM模型结构 1. 前言 RNN( Recurrent Neural Network 循环(递归)神经网络) ...
- 15款css3鼠标悬停图片动画过渡特效
分享15款css3鼠标悬停图片动画过渡特效.这是一款15款不同效果的css3 hover动画过渡效果代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
- 【emWin】例程二十六:窗口对象——Listbox
简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...
- [译]我们为何基于FreeBSD打造解决方案?
[译注]翻译这篇文章,主要是觉得老外在思考问题时,勇于打破固有的技术栈积累,尝试不同的选择,从而找到最合适自己的技术方案.得到真正的实惠. Synergy SKY提供多种软件解决方案,本文想讨论的是关 ...
- MyCAT简易入门 (Linux)
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之.于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显.这篇文章主要是MyCAT的入门部署. ...
- DWZ使用中遇到的坑
DWZ官方文档中关于文件上传表单的提交: 因为Ajax不支持enctype="multipart/form-data" 所以用隐藏iframe来处理无刷新表单提交. <for ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- 利用Google开源Java容器化工具Jib构建镜像
转载:https://blog.csdn.net/u012562943/article/details/80995373 一.前言 容器的出现让Java开发人员比以往任何时候都更接近“编写一次,到处运 ...
- [Bayes] Multinomials and Dirichlet distribution
From: https://www.cs.cmu.edu/~scohen/psnlp-lecture6.pdf 不错的PPT,图示很好. 伯努利分布 和 多项式分布 Binomial Distribu ...