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 ...
随机推荐
- Selenium Web 自动化 - Selenium(Java)环境搭建
Selenium Web 自动化 - Selenium(Java)环境搭建 2016-07-29 1 下载JDK JDK下载地址:http://www.oracle.com/technetwork/j ...
- Numpy数组与PIL Image转换
引用于这个博客
- Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- Java知多少(39)interface接口
在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加“抽象”. 接口使用 interface 关键字来声明,可以看做是一种特 ...
- 关于指针*前后const代表的意思——记住一个口诀“左内右本”
记住一个口诀“左内右本”:const出现在*的左边,则说明指针所指向的内容是常量const出现在*的右边,则说明指针本身是常量如果*左右两边都出现const,那么说明指针本事是常量,它所指向的内容也是 ...
- 【转】Android开发教程 --- Android调用WS
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/23/2297950.html Hi,大家好! 上节我们搭建了Java版的WS,那么在Andro ...
- 仿迅雷播放器教程 -- C++ 100款开源界面库 (10)
(声明:Alberl以后说到开源库,一般都是指著名的.或者不著名但维护至少3年以上的.那些把代码一扔就没下文的,Alberl不称之为开源库,只称为开源代码.这里并不是贬低,像Alberl前面那个系 ...
- [IR] Suffix Trees and Suffix Arrays
前缀树 匹配前缀字符串是不言自明的道理. 1. 字符串的快速检索 2. 最长公共前缀(LCP) 等等 树的压缩 后缀树 Let s=abab, a suffix tree of s is a comp ...
- 8 -- 深入使用Spring -- 5...2 使用@Cacheable执行缓存
8.5.2 使用@Cacheable执行缓存 @Cacheable可用于修饰类或修饰方法,当使用@Cacheable修饰类时,用于告诉Spring在类级别上进行缓存 ------ 程序调用该类的实例的 ...
- distri.lua线程间通信的设计
首先简单介绍下distri.lua中的线程设计方案. distri.lua提供一个API函数fork用于创建新的C线程,这个C线程运行独立的lua虚拟机,为了在各线程之间通信 每个线程都会创建一个ch ...