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 ...
随机推荐
- bootstrap table 的简单Demo
暂时够用,不够用再补充 T_T script: <link rel="stylesheet" href="lib/bootstrap.min.css"&g ...
- 这些APP开发技巧可少花60万!
用户需求——我偏不用干嘛要装? 随着手机的普及,大众流量的端口从电脑转移到手机,传统的商业平台从线下到电脑再到手机进行了转换.手机APP作为移动互联网的入口,众多创业者凭借一个手机APP成就了亿万财富 ...
- Python 爬虫实例(7)—— 爬取 新浪军事新闻
我们打开新浪新闻,看到页面如下,首先去爬取一级 url,图片中蓝色圆圈部分 第二zh张图片,显示需要分页, 源代码: # coding:utf-8 import json import redis i ...
- dajpper使用教程
1.表结构 2.程序对应的实体类 3.基本操作 3.1 插入 123456789 public int Insert(Person person, string _ConnString){ using ...
- Linux零基础入门第四课
根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 ...
- 我们在学习JDBC的时候会过度到J2EE。
我们在学习JDBC的时候会过度到J2EE. 在Swing的组件中,基本上都是在AWT组件的名称前面加“J”. 一般情况下,除了Choise等组件: import javax.swing.*;好要加 ...
- netty 对象序列化传输示例
package object.server.impl; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Chann ...
- 火车头采集器如何采集QQ群成员中的QQ号
如何采集QQ群群员QQ号,采集QQ号,批量采集QQ号 众所周知,QQ群群员QQ号无法导出,即使会员也不可以,那我们只能通过三方工具来实现我们的要求,那今天我们讲讲如何通过火车采集器来采集QQ群群员QQ ...
- js 对象转&拼接
function pars(param, key, encode) { if (param == null) return ''; var arr = []; var t = typeof (para ...
- 蜕变成蝶~Linux设备驱动中的并发控制
并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...