WordCount扩展与优化
合作者:201631062327,201631062128
码云地址:https://gitee.com/LIUJIA6/WordCount3
一:项目说明
本次项目是在上次作业WorldCount的基础上,利用结对编程的思想,完成对WorldCount项目的功能扩展
-s 递归处理目录下符合条件的文件。(实现)
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
其中,代码行:本行包括多于一个字符的代码。
空 行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释。[file_name]: 文件或目录名,可以处理一般通配符。
二:部分代码
基础功能:测试返回单词数,字符数,行数
int countw(char *file)//返回文件词的数目
{ FILE *f;
f=fopen(file,"r");
char ch;
if(NULL==(f=fopen(file,"r")))
{
printf("文件");
}
else
while(!feof(f))
{
ch=fgetc(f);
if((ch >= 'a'&&ch <= 'z')||(ch>='A'&&ch<='Z')||ch=='_')
aword=;
else if (aword)
{
cword++;
aword=;
}
}
fclose(f); printf("单词数:%d ",cword);
}
int countc(char *file) //返回文件的字符数
{ FILE *f;
f = fopen(file, "r");
char a;
if(NULL==(f=fopen(file,"r")))
{
printf("file is NULL");
}
else
while (!feof(f))
{
a=fgetc(f);
if (a != ' '&&a != '\n'&&a != '\t')
cchar++;
}
fclose(f);printf("字符数:%d ",cchar);
}
int countl(char *file) //返回文件的行数
{ FILE *f;
f = fopen(file, "r");
int cline = ;
char a;
if(NULL==(f=fopen(file,"r")))
{printf("file is NULL");}
else while(!feof(f))
{
a=fgetc(f);
if(a=='\n'||a=='\t')
cline++;
} fclose(f);printf("行数:%d ",cline);
return ;
}
拓展功能:测试返回代码行,注释行,空行和txt文件数
int count_blankline(char *file) //返回文件的空行数
{ FILE *f;
int b_num = ;
int ch_num = ;
char ch;
f = fopen(file, "r");
if(NULL==(f=fopen(file,"r")))
{
printf("file is NULL");
}
else
while (!feof(f))
{
ch= fgetc(f);
if (ch=='\n'){
if (ch_num<= )
b_num++;
ch_num = ;
}
else if (ch!=' '&&ch!='\t'&&ch!='}')
ch_num++;
else if(ch=='}')b_num++;
}
fclose(f);printf("空行数:%d ",b_num);
}
int count_noteline(char *file) //返回文件的注释行数
{ FILE *f;
int ch_num = ;int note_num=;
char ch;
f=fopen(file, "r");
if(NULL==(f=fopen(file,"r")))
{
printf("文件不存在");
}
else
while (!feof(f))
{
ch= fgetc(f);
if(ch=='\n'){if(ch_num==) note_num++; ch_num=;}
else if(ch=='/') ch_num++;
else if(ch_num==){if(ch=='/') ch_num++;}
}
fclose(f);
printf("注释行:%d ",note_num);
}
int count_codeline(char *file)//返回文件的代码行数
{ int ch_num = ;
int code_num=;
FILE *f;
int tag=; int flag=;
char a;
f = fopen(file, "r");
if(NULL==(f=fopen(file,"r")))
{printf("文件不存在");}
else
while (!feof(f))
{
a=fgetc(f); if(flag==) {
flag=;tag++;}
else{ if(a=='\n'&&ch_num>)
{code_num++;
ch_num=; }
else if(a != ' '&&a != '\n'&&a != '\t'&&a!='/') {
ch_num++;} else if(a=='/'){ flag++;}
} } fclose(f); printf("代码行数:%d ",code_num-tag);
}
int searchfile(void) //寻找文件夹中的txt文件
{
struct _finddata_t filefind;
long handle;
int t=; if( (handle=_findfirst( "d:\\wordcount\\*txt", &filefind)) == -1L )
{
printf( "没找到txt文件\n");
}
else
do{
t++;
printf("找到文件:%s\n", filefind.name);
}while (_findnext(handle,&filefind)==); _findclose(handle); printf("txt文件数量:%d\n",t);
return ;
}
三:单元测试
由于本次项目采用传统的C语言,就没有很好的工具可供使用。于是我们就手写了部分功能的单元测试(单元测试大同小异,选了几个单元进行测试)。
首先是字符数统计的测试
int countc(char *file);
int main ()
{
FILE *fpt;
char filename[];
printf("输入测试文件\n");
scanf("%s",&filename) ;
fpt=fopen(filename, "rb");
countc(filename);
return ;
}
输入正确的txt文件名,输出结果如下

然后是注释行统计的测试
int count_noteline(char *file);
int main ()
{
FILE *fpt;
char filename[];
printf("输入测试文件\n");
scanf("%s",&filename) ;
fpt=fopen(filename, "rb");
count_noteline(filename);
return ;
}
同样,测试结果如下

四:总结
通过这次的结队编程合作,了解到了在团队合作时应该具备的基本素质,需要和队友及时沟通,完成代码的结合配对。同时本次过程中对WordCount的功能有了更加全面的了解与掌握,也对单元测试有了更深的了解。
WordCount扩展与优化的更多相关文章
- WordCount扩展
码云地址:https://gitee.com/xjtsh/ExpandedWordCount 功能实现: wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe ...
- PHP扩展--XHProf优化PHP程序
简介 XHProf 是一个轻量级的分层性能测量分析器. 在数据收集阶段,它跟踪调用次数与测量数据,展示程序动态调用的弧线图. 它在报告.后期处理阶段计算了独占的性能度量,例如运行经过的时间.CPU 计 ...
- Java架构师/高并发/高可用/高扩展/性能优化/框架源码分析实战
https://ke.qq.com/course/401944?taid=3389721334391320
- Update(Stage4):sparksql:第1节 SparkSQL_使用场景_优化器_Dataset & 第2节 SparkSQL读写_hive_mysql_案例
目标 SparkSQL 是什么 SparkSQL 如何使用 Table of Contents 1. SparkSQL 是什么 1.1. SparkSQL 的出现契机 1.2. SparkSQL 的适 ...
- 【GoLang】GoLang map 非线程安全 & 并发度写优化
Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource.每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁 ...
- C#原始类型扩展方法—this参数修饰符
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...
- GNU C 扩展(转)
GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.这里对支持支持 GNU 扩展的 C 语言成为 GN ...
- C#扩展方法入门
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 仅当你使用 using 指令将命名空间显式导入到源代码 ...
- Linux 内核使用的 GNU C 扩展
gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...
随机推荐
- JAVA与C#的区别
Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace ...
- AYUI7 响应式开发
AYUI7 爱奇艺某页面 响应式DEMO,AY响应式框架在MVC中,使用起来xaml级别,支持 显示器水平/垂直/任意 显示: 大于宽度和大于高度 触发器,小于宽度和小于高度 触发器,每个触发器支持是 ...
- 爬取 Caused by SSLError(SSLError("bad handshake: Error
在爬虫中遇到如下报错: Traceback (most recent call last): File "C:/Users/xuchunlin/PycharmProjects/A9_25/h ...
- RTP推流及验证
[时间:2018-07] [状态:Open] [关键词:rtp,rtcp, ffmpeg,ffplay,sdp,h264,mp2,ts,推流] 近期在学习有关RTP/RTCP的资料,发现看了很多资料, ...
- .net reactor使用教程(一)——界面各功能说明(转)
概述:安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.chm,目前没有中文版本,里面详细介绍了.net reactor的各功能及使用场景. 安装了.net ...
- Laravel-mix 中文文档
镜像地址 : https://segmentfault.com/a/1190000015049847原文地址: Laravel Mix Docs 概览 基本示例 larave-mix 是位于w ...
- go for-range中的循环变量
测试的时候发现一个有意思的地方,就是go始终利用同一块内存来接收集合中的一个值,只是在每次循环的时候重新赋值而已. package main import ( "fmt" ...
- java jdk 打开出错 Failed to load the JNI shared library
``` Failed to load the JNI shared library 解决方法 换了JDK 32位x86的 打开32位 eclipse 2017 oxygen 出现这个问题,修改 配置文 ...
- javap的使用
今天听的分享里在介绍String时,提到了javap,学习了好久的java,但是好像从来没有了解过这个工具. javap是JDK提供的一个命令行工具,javap能对给定的class文件提供的字节代码进 ...
- win10专业版密钥 亲测可用 不断更新
DR9VN-GF3CR-RCWT2-H7TR8-82QGT 更新时间2018年10月11日