WordCount是一个常见的工具,它能统计文本文件的字数、单词数和行数。在本次项目中,要求写一个命令行程序,模仿已有的WordCount.exe的功能,并加以扩充,统计出某程序设计语言源文件的字符数、单词数和行数。在此基础上,还实现了对某程序设计语言源文件的空行、代码行和注释行的统计。

程序处理用户需求的模式为:

wc.exe [parameter][filename]

各个参数的意义

基本功能列表

wc.exe -c file.c 对字符数的统计

wc.exe -w file.c 对单词数的统计

wc.exe -l file.c: 对行数的统计

扩展功能

wc.exe -a 对空行、代码行和注释行的统计

空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“}”。

代码行:本行包括多余一个字符的代码。

注释行:本行不是代码行,并且本行包括注释。

本项目一共分成了四个模块:分别是字符统计模块、单词统计模块、行数统计模块和综合统计模块,综合统计模块包括代码行、空行和注释行的统计。设计如下:

void CharCount();  //字符统计函数
void WordCount(); //单词统计函数
void LineCount(); //行数统计函数
void Muiltiple(); //综合统计函数,包括代码行,空行,注释行

字符统计模块:

void CharCount() //字符统计函数
{
FILE *fp;
int c = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
c ++;
ch = fgetc(fp);
}
printf("char count is :%d.\n",c);
fclose(fp);
}

本模块以只读的方式打开在程序目录中的file.c文本文件,依次访问文本文件中的每个字符,统计变量依次加1,直到文本文件结束为止。

单词统计模块:

void WordCount() //单词统计函数
{
FILE *fp;
int w = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <='Z')||(ch >= ''&&ch <= ''))
{
while ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <= 'Z')||(ch >= ''&&ch <= '')||ch == '_')
{
ch = fgetc(fp);
}
w ++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("word count is :%d.\n",w);
fclose(fp); }

本模块统计的是以字母、数字和下划线组成,且首字母不为下划线的所有单词。统计过程同字符统计模块,此处不再赘述。

行数统计模块:

void LineCount() //行数统计函数
{
FILE *fp;
int l = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if (ch == '\n')
{
l ++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("line count is :%d.\n",l);
fclose(fp);
}

此模块行数的初始化为1,依次访问文本文件中的字符,遇到换行符依次加1,直到文本结束为止。

综合统计模块:

void Muiltiple()  //综合统计函数,包括代码行,空行,注释行
{
FILE *fp;
char ch;
int c=,e=,n=;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if (ch == '{'||ch == '}')
{
e ++;
ch = fgetc(fp);
}
else if (ch == '\n')
{
ch = fgetc(fp);
while(ch == '\n')
{
e ++;
ch = fgetc(fp);
}
}
else if (ch == '/')
{
ch = fgetc(fp);
if (ch == '/')
while(ch != '\n')
{
ch = fgetc(fp);
}
n ++;
ch = fgetc(fp);
}
else
{
c ++;
while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF)
{
ch = fgetc(fp);
}
} }
printf("code line count is :%d.\n",c);
printf("empt line count is :%d.\n",e);
printf("note line count is :%d.\n",n);
fclose(fp);
}

此模块能够实现对空行、代码行和注释行的统计。依次访问文本文件中的字符,若该字符为“{”或“}”,则空行变量加1。若该字符为两个连续的“/”,则注释行变量加1。否则代码变量加1。依次循坏,直到文本结束为止。

总模块的设计:

int main(int argc,char *argv[])
{
if ((strcmp(argv[], "-c") == ) && (strcmp(argv[], "file.c") == ))
{
CharCount();
} if ((strcmp(argv[], "-w") == ) && (strcmp(argv[], "file.c") == ))
{
WordCount();
}
if ((strcmp(argv[], "-l") == ) && (strcmp(argv[], "file.c") == ))
{
LineCount();
}
if ((strcmp(argv[], "-a") == ) && (strcmp(argv[], "file.c") == ))
{
Muiltiple();
}
return ;
}

总模块对命令行参数中字符串数组进行判断,第一个字符串数组为程序名,若第二个字符串为“-c”、“-w”、“-l”、“-a”,且第三个字符串数组为file.c,则依次调用CharCount、WordCount、LineCount、Muiltiple函数以实现对字符数、单词数、行数和空行数、代码行数和注释行数的统计。

程序运行测试:

需要统计的文本文件:

void main() //main
{
int x,y,s;
scanf("%d%d",&x,&y);
s = Add(int x,int y);
printf("x + y = %d.",s);
} int Add(int x,int y) //Add
{
return x + y;
}

找到程序所在目录。注:需要统计的文本文件file.c在此目录中。

字符数的统计测试:

单词数的统计测试:

行数的统计测试:

对空行数、代码行数、注释行数的统计测试:

本次项目任有没能实现的功能,wc.exe -s递归处理目录下符合条件的文件和wc.exe -x 显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。对于递归处理目录下符合的文件功能,暂时还没有能够很好解决的思想,所以等待下次作业的完善。对于显示图形界面的功能,由于还没有做图形界面的经历,再加上本次项目时间有些仓促,也是没能完美完成。

附上完整代码:

// WC.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h" void CharCount(); //字符统计函数
void WordCount(); //单词统计函数
void LineCount(); //行数统计函数
void Muiltiple(); //综合统计函数,包括代码行,空行,注释行 int main(int argc,char *argv[])
{
if ((strcmp(argv[], "-c") == ) && (strcmp(argv[], "file.c") == ))
{
CharCount();
} if ((strcmp(argv[], "-w") == ) && (strcmp(argv[], "file.c") == )) WordCount();
}
if ((strcmp(argv[], "-l") == ) && (strcmp(argv[], "file.c") == ))
{
LineCount();
}
if ((strcmp(argv[], "-a") == ) && (strcmp(argv[], "file.c") == ))
{
Muiltiple();
}
return ; } void CharCount() //字符统计函数
{
FILE *fp;
int c = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
c ++;
ch = fgetc(fp);
}
printf("char count is :%d.\n",c);
fclose(fp);
} void WordCount() //单词统计函数
{
FILE *fp;
int w = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <='Z')||(ch >= ''&&ch <= ''))
{
while ((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <= 'Z')||(ch >= ''&&ch <= '')||ch == '_')
{
ch = fgetc(fp);
}
w ++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("word count is :%d.\n",w);
fclose(fp); } void LineCount() //行数统计函数
{
FILE *fp;
int l = ;
char ch;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if (ch == '\n')
{
l ++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("line count is :%d.\n",l);
fclose(fp);
} void Muiltiple() //综合统计函数,包括代码行,空行,注释行
{
FILE *fp;
char ch;
int c=,e=,n=;
if((fp = fopen("file.c","r")) == NULL)
{
printf("file read failure.");
}
ch = fgetc(fp);
while(ch != EOF)
{
if (ch == '{'||ch == '}')
{
e ++;
ch = fgetc(fp);
}
else if (ch == '\n')
{
ch = fgetc(fp);
while(ch == '\n')
{
e ++;
ch = fgetc(fp);
}
}
else if (ch == '/')
{
ch = fgetc(fp);
if (ch == '/')
while(ch != '\n')
{
ch = fgetc(fp);
}
n ++;
ch = fgetc(fp);
}
else
{
c ++;
while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF)
{
ch = fgetc(fp);
}
} }
printf("code line count is :%d.\n",c);
printf("empt line count is :%d.\n",e);
printf("note line count is :%d.\n",n);
fclose(fp);
}

WordCount 程序的实现的更多相关文章

  1. 软件工程:Wordcount程序作业

    由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...

  2. 标志数在wordcount程序中的应用与拓展

    wordcount程序要求测出文本中的单词数,字符数和行数. 设计思路: 将文件读入,逐字检测,检测到空格单词数加一,检测到回车行数单词数加一,如果既不是回车也不是空格则说明是字符,字符数加一 编程时 ...

  3. Hadoop入门实践之从WordCount程序说起

    这段时间需要学习Hadoop了,以前一直听说Hadoop,但是从来没有研究过,这几天粗略看完了<Hadoop实战>这本书,对Hadoop编程有了大致的了解.接下来就是多看多写了.以Hado ...

  4. [转] 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...

  5. Hadoop下WordCount程序

    一.前言 在之前我们已经在 CenOS6.5 下搭建好了 Hadoop2.x 的开发环境.既然环境已经搭建好了,那么现在我们就应该来干点正事嘛!比如来一个Hadoop世界的HelloWorld,也就是 ...

  6. Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式

    一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...

  7. Mapreduce概述和WordCount程序

    一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...

  8. Hadoop集群测试wordcount程序

    一.集群环境搭好了,我们来测试一下吧 1.在java下创建一个wordcount文件夹:mkdir wordcount 2.在此文件夹下创建两个文件,比如file1.txt和file2.txt 在fi ...

  9. Eclipse环境搭建并且运行wordcount程序

    一.安装Hadoop插件 1. 所需环境  hadoop2.0伪分布式环境平台正常运行 所需压缩包:eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz 在Linu ...

  10. 09、高级编程之基于排序机制的wordcount程序

    package sparkcore.java; import java.util.Arrays; import java.util.Iterator; import org.apache.spark. ...

随机推荐

  1. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  2. vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用

    Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...

  3. pytorch GPU的程序kill后未释放内存

    使用PyTorch设置多线程(threads)进行数据读取(DataLoader),其实是假的多线程,他是开了N个子进程(PID都连着)进行模拟多线程工作,所以你的程序跑完或者中途kill掉主进程的话 ...

  4. WorldWind源码剖析系列:地形访问器类TerrainAccessor

    地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...

  5. 最邻近规则分类(K-Nearest Neighbor)KNN算法

     自写代码: # Author Chenglong Qian from numpy import * #科学计算模块 import operator #运算符模块 def createDaraSet( ...

  6. CSS2.0实现面包屑

    CSS2.0实现面包屑 面包屑这样的 我们以前都是用背景图片做这块工作,但是直到大概2个星期之前在新浪微博上看到用css3.0实现这样的面包屑 但是目前情况下IE6-8并不支持css3.0 只有标准游 ...

  7. PAT B1018 锤子剪刀布 (20 分)

    大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第 1 行给出正整数 ...

  8. 代码段:js表单提交检测

    市面上当然有很多成型的框架,比如jquery的validation插件各种吧.现在工作地,由于前端童鞋也没用这些个插件.根据业务的要求,自己就在代码里写了个简单的表单提交的检测代码(php的也写了一个 ...

  9. bat输出重定向

    重定向符号主要有:>,>>,<,>&,<&和|,而本文只讨论前五个. 第一节 首先从一个经典问题开始,“1>nul 2>nul”的意思是 ...

  10. 手机视频编辑软件APP

    1. VUE    iOS/Android 2.Alive    iOS/Android 3.Splice  iOS 4. Plotagragh+   能让照片动起来的app 5.Cinepic  能 ...