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 ...
随机推荐
- 【Android】Android布局文件的一些属性值
第一类:属性值 true或者 false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 androi ...
- c++对c的加强
1.register关键字的加强 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度,这只是一种请求,编译器可以拒绝这种申请. ( ...
- 为app录制展示gif
已同步更新至个人blog:http://dxjia.cn/2015/07/make-gif-for-app/ 在github上好多不错的开源项目展示demo的时候,都是采用了一个gif图片,很生动具体 ...
- 【转】燃烧吧,TestMice!
...当我们几个人碰面的时候,就感觉应该做点测试业内的实事. 记得当时的17站出了一些QTP辅件,给了我一些灵感.2008年做了一整年的QTP企业级实施,从方案到最后的收尾支持,得到最大的教训就是,当 ...
- HAVANA 团队简介
在Ensembl 下载的gtf 文件中,会有一部分来源自 HAVANA havana 的全称叫做 human and vertebrate analysis and annotation, 是sag ...
- Ubuntu:双(多)网卡绑定(bonding)配置
step 0:安装网卡绑定的功能 apt-get install ifenslave step 1:加载内核模块:编辑 /etc/modules,添加: bonding step 2:编辑网卡配 ...
- 4. Oracle数据库用户管理备份与恢复
一. Oracle用户管理备份介绍 Oracle物理备份核心就是将物理文件拷贝一份副本:存放在磁盘上.物理文件指的是:数据文件,控制文件,日志文件,参数文件等等. 根据数据库状态而分:备份可分为热备份 ...
- Maven传递依赖的坑:父pom中dependencyManagement版本优先级高于传递依赖版本
一.由来 之前同事问了个问题,就是当前工程为spring boot项目,假设版本号为2.0.3 这个项目中依赖了一个spring boot项目依赖(先别管为啥有这么奇葩的依赖,这个版本是1.5.9). ...
- 实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
前几天看到了有人在android5.0上实现了如下图一样的效果,我自己就去搜了下.参考了国外一篇文章和国内的一篇文章,最终实现了想要的效果.具体参考的网址我已经贴到文章末尾,大家可以去英文的那个网站看 ...
- JavaScript----特效代码
1.不同时间段显示不同问候语 <Script Language="JavaScript"> <!-- var text=""; day = n ...