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开发(二十三)——Application
参考: [1] Android中Application类用法.http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.htm ...
- iOS开发支付宝支付
iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析 浏览: 149 发布日期: 2016-10-19 分类: ios 最近在项目中接入了微信支付和支付宝支付,总的来说没有那么 ...
- 在linux下用命令行编译 java的eclipse项目
由于jdk的版本问题导致在windows上编译打包好的jar包放在linux服务器上运行的时候出现一点小异常,所以决定在linux上进行一次项目编译,这有两个选择1.在相同的linux环境下安装lin ...
- 跨浏览器的placeholder-jQuery版(jQuery插件EnPlaceholder)
案例:整搜索框,需要默认占位符为"请输入关键词",获取焦点时,占位符消失或不可用(不影响正常输入),丢失焦点后,若用户无内容输入,占位符继续出现,继续占位.这种代码我想前端们已经很 ...
- How to Catch Ctrl-C in Shell Script
ref: https://stackpointer.io/script/how-to-catch-ctrl-c-in-shell-script/248/ #!/bin/sh # this func ...
- Oracle relink 重新编译
如此而已! export ORACLE_HOME=/opt/oracle/11.2 export LD_LIBRARY_PATH=/lib:/lib64:$ORACLE_HOME/lib:$ORACL ...
- [UFLDL] Generative Model
这一部分是个坑,应该对绝大多数菜鸡晕头转向的部分,因为有来自物理学界的问候. Deep learning:十九(RBM简单理解) Deep learning:十八(关于随机采样) 采样方法 [B ...
- [Bayes] prod: M-H: Independence Sampler for Posterior Sampling
M-H是Metropolis抽样方法的扩展,扩展后可以支持不对称的提议分布. 对于M-H而言,根据候选分布g的不同选择,衍生出了集中不同的变种: (1)Metropolis抽样方法 (2)随机游动Me ...
- word中替换【换行符】与【回车符】
- luanet更名为distri.lua
为了更好的体现luanet的设计意图和避免与网上另一个开源项目重名造成混淆, luanet正式更名为distri.lua.后需开发工作包括跨平台,日志,通过Fork创建新线程正在开发中. 新地址:ht ...