当前位置: 首页 > 编程日记 > 正文

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=1;
else if (aword)
{
cword++;
aword=0;
}
}
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 = 0;
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 1;
}

拓展功能:测试返回代码行,注释行,空行和txt文件数

int count_blankline(char *file) //返回文件的空行数 
{ FILE *f;
int b_num = 0;
int ch_num = 0;
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<= 1)
b_num++;
ch_num = 0;
}
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 = 0;int note_num=0;
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==2) note_num++; ch_num=0;}
else if(ch=='/') ch_num++;
else if(ch_num==1){if(ch=='/') ch_num++;} 
} 
fclose(f);
printf("注释行:%d ",note_num);
} 
int count_codeline(char *file)//返回文件的代码行数 
{ int ch_num = 0;
int code_num=0;
FILE *f;
int tag=0; int flag=0;
char a; 
f = fopen(file, "r");
if(NULL==(f=fopen(file,"r")))
{printf("文件不存在");}
else
while (!feof(f))
{
a=fgetc(f);if(flag==2) {
flag=0;tag++;}
else{if(a=='\n'&&ch_num>1)
{code_num++; 
ch_num=0;    }
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=0;if( (handle=_findfirst( "d:\\wordcount\\*txt", &filefind)) == -1L ) 
{
printf( "没找到txt文件\n");
}
else
do{
t++;
printf("找到文件:%s\n", filefind.name); 
}while (_findnext(handle,&filefind)==0);_findclose(handle);printf("txt文件数量:%d\n",t);
return 0;
}

三:单元测试

由于本次项目采用传统的C语言,就没有很好的工具可供使用。于是我们就手写了部分功能的单元测试(单元测试大同小异,选了几个单元进行测试)。

首先是字符数统计的测试

int countc(char *file); 
int main ()
{FILE *fpt;char filename[30];printf("输入测试文件\n");scanf("%s",&filename) ;fpt=fopen(filename, "rb");countc(filename);return 0;} 

输入正确的txt文件名,输出结果如下

然后是注释行统计的测试

int count_noteline(char *file);
int main ()
{FILE *fpt;char filename[30];printf("输入测试文件\n");scanf("%s",&filename) ;fpt=fopen(filename, "rb");count_noteline(filename);return 0;} 

同样,测试结果如下

四:总结

通过这次的结队编程合作,了解到了在团队合作时应该具备的基本素质,需要和队友及时沟通,完成代码的结合配对。同时本次过程中对WordCount的功能有了更加全面的了解与掌握,也对单元测试有了更深的了解。

转载于:https://www.cnblogs.com/WLYW/p/9826403.html

相关文章:

进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

我发现网上关于标题上的内容介绍的都很零碎&#xff0c;因此为了方便查找、也为了本人对这一部分的充分理解&#xff0c;就想着写一篇这样的博客&#xff08;我分成了几个部分&#xff0c;以便查找&#xff09;&#xff1a; 一、进制转换 让我们先来看看各个进制的定义&#…

第三方物流是什么

​​第三方物流是指生产经营企业为集中精力搞好主业&#xff0c;把原来属于自己处理的物流活动&#xff0c;以合同方式委托给专业物流服务企业&#xff0c;同时通过信息系统与物流企业保持密切联系&#xff0c;以达到对物流全程管理的控制的一种物流运作与管理方式。 第三方物流…

ROS中cv_bridge如何用python3进行编译

最近遇到了个问题&#xff0c;cv_bridge实现了opencv和ros中图像数据类型的转换&#xff0c;但ros-melodic默认python版本是python2。在配置yolact环境的时候&#xff0c;要求是python3。 这就导致在ros自带的cv_bridge是python2版本&#xff0c;想使用python3的话需要自己去编…

Ansible06-管理roles

目录 一、roles的结构 二、RHEL系统roles 三、创建角色 四、部署角色 随着 playbook 的增多&#xff0c;有很多代码重用的机会。ansible 提供了一种方式——roles&#xff0c;只需将 roles 从一个项目复制到另一个项目&#xff0c;然后用 play 调用即可实现代码重用。这里的…

用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)

不废话&#xff0c;上代码&#xff1a; 先创建一个Student类&#xff1a; public class Student {private String id;private String name;private String mobile;private String address;public String getId() {return id;}public void setId(String id) {this.id id;}pub…

[BZOJ 2054]疯狂的馒头(并查集)

Description CQF十分喜欢吃馒头。兴奋之下他一下子买了N 个馒头请所有认识他的人吃。 但是CQF不喜欢白色&#xff0c;喜欢红色、黄色、绿色等鲜艳的颜色。于是他把所有白色的馒头排成一列。然后进行M 次染色操作。每个染色操作都是用一个神奇的刷子把连续的多个馒头染成特定的某…

RealSenseD435与ORB-SLAM2实现稠密建图

一、RealSenseD435介绍 RealSenseD435是一款结构光相机&#xff0c;使用左右目相机和红外光实现测距。有效测距范围为0.2~10m 二、ORBSLAM2_with_pointcloud_map的安装 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.gitclone代码&#xff0c;无法…

使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文

解决方案&#xff1a; driver中增加以下2行配置&#xff1a; "unicodeKeyboard":True, #unicode编码输入 "resetKeyboard":True #隐藏软键盘 转载于:https://www.cnblogs.com/Inbreeze/p/9828568.html

centos8安装KVM/QEUM虚拟化

centos8安装KVM/QEUM。安装虚拟化主机组。启动libvirtd服务。 yum groupinstall "Virtualization Host" systemctl enable libvirtd systemctl start libvirtd 谁可以使用虚拟化呢&#xff1f;加入libvirt组即可。 usermod -aG libvirt <username> 安装Vir…

病毒的灵魂拷问(绝对原创)

哈哈哈&#xff0c;我敢说&#xff0c;这篇博客绝不会有重复的&#xff0c;因为它是我上课的走神之作&#xff0c;哈哈哈&#xff01; 不废话&#xff0c;上代码&#xff1a; import java.util.Scanner; import java.util.*; public class Test {public static void main(Str…

js:深入prototype(下:原型重写)

//当属性和方法特别多时&#xff0c;编写起来不是非常方便&#xff0c;能够通过json的格式来编写 //因为原型重写。并且没有通过Person.prototype来指定&#xff0c;此时的constructor不会再指向Person而是指向Object //假设constructor真的比較重要&#xff0c;能够在json中说…

全国所有省市县地理坐标Json格式

https://www.cnblogs.com/yzbubble/p/7707129.html转载于:https://www.cnblogs.com/loveMis/p/9829217.html

ubuntu设置不同的eigen版本

下载Eigen并进行编译 下载eigen库&#xff0c;创建build文件夹进行编译 设置安装路径 这里会设置make install的路径 随后进行make install 移动到usr/include路径下 找到第二步中安装的位置&#xff0c;移动到usr/include路径下 这样&#xff0c;需要用那个版本的eige…

MySQL01-安装mysql数据库

MySQL 可以从 YUM 源直接安装 rpm 包&#xff0c;但是这样的定制化程度低&#xff0c;不利于后期维护升级。因此&#xff0c;今天记录一种更灵活的二进制安装方式。参考 MySQL 5.7 官方文档 2.2 章节&#xff0c;具体做法和官方文档略有出入。 1、配置防火墙规则 firewall-cm…

SVO学习笔记(一)

SVO学习笔记&#xff08;一&#xff09;这篇文章FrameFeaturedetectionFeatrue_matcher三角测量求深度特征匹配非线性优化寻找匹配特征极线搜索匹配特征总结这篇文章 一个很年轻的叔叔踩进了SLAM的坑&#xff0c;现在正在学习视觉SLAM中的SVO系统。本着好记性不如烂笔头的思想&…

如何用eclipse操作MySQL数据库进行增删改查?

我们首先需要在Navicat Premium上创建一个数据库实例&#xff08;test&#xff09;&#xff0c;然后创建一个stu_info表&#xff08;id&#xff0c;name&#xff0c;mobile&#xff0c;address&#xff09; 接着创建一个Test类进行操作&#xff1a; 在这之前需要导一个包&#…

机房测试10.22

wzz的观察 简单的递推。 \(f[i][j]\)表示以\((i,j)\)这个点为右下角时最大的正方形大小。 如果这个格子为0&#xff0c;\(f[i][j]0\) 否则\(f[i][j]min(f[i-1][j],f[i][j-1],f[i-1][j-1])1\) 或者可以二分答案&#xff0c;每一次\(O(n*m)\)进行check。 递推代码&#xff1a; #i…

$.when()方法翻译

地址&#xff1a;http://api.jquery.com/jQuery.when/ jQuery.when( deferreds )&#xff0c;returns Promise 正文 Description: Provides a way to execute callback functions based on zero or more Thenable objects, usually Deferred objects that represent asynchrono…

Anaconda3 离线安装 Django-3.2.7 及依赖项setuptools、sqlparse 、asgiref、typing_extensions等模块

目录 一、背景 二、离线安装 setuptools、sqlparse 、asgiref、typing_extensions等依赖模块 三、离线安装django 一、背景 因为信息安全管理的规定&#xff0c;这台服务器不能连接互联网&#xff0c;只能离线安装 django。anaconda3 安装完成以后&#xff0c;从默认虚拟环…

倍增LCA NOIP2013 货车运输

货车运输 题目描述 A 国有 n 座城市&#xff0c;编号从 1 到 n&#xff0c;城市之间有 m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有 q 辆货车在运输货物&#xff0c; 司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。…

SVO学习笔记(二)

SVO学习笔记&#xff08;二&#xff09;这篇文章稀疏图像对齐地图点投影(地图与当前帧间的关系)reprojectMapreprojectPointreprojectCell特征点对齐中的非线性优化结尾这篇文章 这次仍是关于SVO系统的学习记录&#xff08;冲冲冲&#xff01;&#xff09;。这次的主要内容是sp…

用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)

首先需要用Navicat Premium创建一个student表 用Java连接好MySQL数据库&#xff08;需要copy一个mysql-connector-java-5.1.44-bin.jar包&#xff0c;该包可在网上找到&#xff09;后&#xff0c;我们开始用Java写一个学生管理系统&#xff1a; 我们首选需要定义好添加、删除、…

tensorflow在训练和验证时监视不同的summary的操作

如果想在训练和验证时监视不同的summary&#xff0c;将train summary ops和val summary ops放进不同的集合中即可。 train_writer tf.summary.FileWriter(log_dir /train, sess.graph) val_writer tf.summary.FileWriter(log_dir /val, sess.graph)# 假设train_loss和val_l…

Anaconda3 离线安装和配置 Django-3.2.7 使用 MySQL-5.7 数据库

Django文档 Settings / Core Settings / DATABASES 一节阐述了django与数据库交互配置的内容。 先在 MySQL 5.7 版本数据库中创建一个名为 learning_log_db 的数据库&#xff0c;和名为 myuser 的用户&#xff0c;并分配权限。 create databases learning_log_db; create use…

用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)(二)

本文上接用JDBC写一个学生管理系统&#xff08;添加、删除、修改、查询学生信息&#xff09; 这次主要是对上一文中的查询方法做一下调整&#xff0c;用创建内部类的方法来实现学生信息的查询。 我们先要定义一个接口IRowMapper&#xff1a; import java.sql.ResultSet;public…

(原)ubuntu中使用conda安装tensorflow-gpu

转载请注明出处&#xff1a; https://www.cnblogs.com/darkknightzh/p/9834567.html 参考网址&#xff1a; https://www.anaconda.com/blog/developer-blog/tensorflow-in-anaconda/ 之前的一篇&#xff0c;直接安装tensorflow的&#xff1a; https://www.cnblogs.com/darkknig…

SVO中 Inverse Compositional Image Alignment方法的学习笔记

SVO中 Inverse Compositional Image Alignment方法的学习笔记这篇文章光流法简介逆向光流法结尾这篇文章 在SVO系统中的"Relaxation Through Feature Alignment"部分使用的是一种特别的LK光流法&#xff1a;the inverse compositional Lucas-Kanade algorithm&#x…

Head First设计模式之目录

只有沉淀、积累&#xff0c;才能远航&#xff1b;沉沉浮浮&#xff0c;脚踏实地。 这本书已经闲置了好久&#xff0c;心血来潮&#xff0c;决定写个目录&#xff0c;让自己坚持看完这本书 创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖…

HANA 数据库备份hang住的解决办法

今天遇到 HANA 数据库备份hang住的情况。经过查 SAP NOTE 解决&#xff0c;记录一下过程。两个NOTE如下&#xff1a; 2452735 - HANA Backup failing with "[447]: backup could not be completed: [110122] A data backup cannot be created because another data backu…

简单DP【p2642】双子序列最大和

Description 给定一个长度为n的整数序列&#xff0c;要求从中选出两个连续子序列&#xff0c;使得这两个连续子序列的序列和之和最大&#xff0c;最终只需输出最大和。一个连续子序列的和为该子序列中所有数之和。每个连续子序列的最小长度为1&#xff0c;并且两个连续子序列之…