一、开头

(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 的实现与测试的更多相关文章

  1. 软件质量与测试——WordCount编码实现及测试

    1.GitHub地址       https://github.com/noblegongzi/WordCount 2.PSP表格 PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟) ...

  2. WordCount小程序及测试

    Github项目地址:https://github.com/792450735/wc PSP表格: PSP2.1表格[1] PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Plann ...

  3. wordcount程序实现与测试

    GitHub地址 https://github.com/jiaxuansun/wordcount PSP表格 PSP PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 5 ...

  4. WordCount的实现和测试

    WordCount 一.开头 (1)合作者:201631107110,201631083416 (2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git ...

  5. 安装Hadoop系列 — 新建MapReduce项目

    1.新建MR工程 依次点击 File → New → Ohter…  选择 “Map/Reduce Project”,然后输入项目名称:mrdemo,创建新项目:     2.(这步在以后的开发中可能 ...

  6. MapReduce-CombineTextInputFormat 切片机制

    MapReduce 框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,如果有大量小文件,就会产生大量的 MapTask,处理小文件效率非常低. CombineTextInpu ...

  7. MapReduce-TextInputFormat 切片机制

    MapReduce 默认使用 TextInputFormat 进行切片,其机制如下 (1)简单地按照文件的内容长度进行切片 (2)切片大小,默认等于Block大小,可单独设置 (3)切片时不考虑数据集 ...

  8. 【原创】大数据基础之词频统计Word Count

    对文件进行词频统计,是一个大数据领域的hello word级别的应用,来看下实现有多简单: 1 Linux单机处理 egrep -o "\b[[:alpha:]]+\b" test ...

  9. CDH- 测试mr

    cdh的mr样例算法的jar包在 [zc.lee@ip---- hadoop-0.20-mapreduce]$ pwd /opt/cloudera/parcels/CDH--.cdh5./lib/ha ...

随机推荐

  1. ADO.NET 数据库备份等操作

    public class SqlServerBackup { private string database; private string server; private string uid; p ...

  2. 查看SQL SERVER数据库的连接数

    1,查看连接到‘TestDB2’数据库的连接 select * from master.dbo.sysprocesses where dbid = DB_ID('TestDB2') *查询某个数据库用 ...

  3. 3D点云的深度学习

    使用卷积神经网络(CNN)架构的深度学习(DL)现在是解决图像分类任务的标准解决方法.但是将此用于处理3D数据时,问题变得更加复杂.首先,可以使用各种结构来表示3D数据,所述结构包括: 1  体素网格 ...

  4. java获取视频的第一帧

    //------------maven配置文件--------------- <dependency> <groupId>org.bytedeco</groupId> ...

  5. CLOS架构是啥?

    有多少种技术能够在六十五年后依旧能够熠熠生辉,在IT的基础架构中扮演着重要角色?CLOS架构应该算是一项.Clos架构,诞生于1952年,是由由贝尔实验室一位叫Charles Clos的人提出的.CL ...

  6. 稍稍解读下ThreadPoolExecutor

    # 说说ThreadPoolExecutor ## 认识 先来看看它所在的架构体系: ```java package java.util.concurrent; public interface Ex ...

  7. 第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1

    第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1 1.检查系统是否安装了python [root@192 ~]# rpm -qa ...

  8. 学习Mysql过程中拓展的其他技术栈:Docker入门介绍

    一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...

  9. python初级 2 字符串格式化

    一.回顾 上次我们讲解的数据类型,有int,float,str,bool,NoneType五种 前两种和后两种都比较简单,str较为复杂 二.字符串格式化的使用场景: 有一种字符串, xxx 的内容都 ...

  10. ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景

    ① 备份   ocrconfig -export 文件名   或者   ocrconfig -manualbackup   或者   找到备份      ocrconfig -local -showb ...