Wordcount

一:

合作者:    201631062614 ;  201631062608      

代码地址:https://gitee.com/chengsh/word.git

本次作业的链接地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203

二:解题思路

  刚拿到这个作业时,脑子里完全是懵的,不知道从何处入手。通过从网上查找资料,发现在CSDN和博客园里有许多关于Word Count的例子,通过学习和下载一些源码,我们逐渐有了思路。最后经过讨论,决定用所熟悉的C语言编写Word Count。

三:实现的功能

3.1基本功能

wordcountc.exe -c     //返回文件的字符数

wordcountc.exe -w    //返回文件的单词总数

wordcountc.exe -l     //返回文件的总行数

3.2扩展功能

wordcountc.exe -a     //返回更复杂的数据(代码行 / 空行 / 注释行)

其中,

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

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

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

四:主要相关代码如下:

4.1//统计字符个数

 1 int CodeCount(char *Path) { //计算字符个数
 2 
 3 FILE *file = fopen(Path, "r");
 4 assert(file != NULL);    //若文件不存在则报错
 5 
 6 char code;
 7 int count = 0;
 8 
 9 while ((code = fgetc(file)) != EOF) //读取字符直到结束
10 count+= ((code != ' ') && (code != '\n') && (code != '\t'));    //判断是否是字符
11 
12 fclose(file);
13 
14 return count;
15 }

 

4.2//统计单词数

 1 int WordCount(char *Path) { //计算单词个数
 2 
 3 FILE *file = fopen(Path, "r");
 4 assert(file != NULL);
 5 
 6 char word;
 7 int is_word = 0;    //用于记录字符是否处于单词中
 8 int count = 0;
 9 
10 while ((word = fgetc(file)) != EOF) {
11 if ((word >= 'a' && word <= 'z') || (word >= 'A' && word <= 'Z')) {    //判断是否是字母    
12 count += (is_word == 0);
13 is_word = 1;    //记录单词状态
14 }
15 else 
16 is_word = 0;    //记录不处于单词状态
17 }
18 fclose(file);
19 
20 return count;
21 }

 

4.3//统计行数

 1 int LineCount(char *Path) { //计算行数
 2 
 3 FILE *file = fopen(Path, "r");
 4 assert(file != NULL);
 5 
 6 char *s = (char*)malloc(200 * sizeof(char));
 7 int count = 0;
 8 
 9 for (; fgets(s, 200, file) != NULL; count++);    //逐次读行
10 
11 free(s);
12 fclose(file);
13 
14 return count;
15 }

 

4.4//主函数

 1 int main(int argc, char *argv[]) {
 2 
 3 char Path[100] = "*.txt";    //默认参数
 4 char Type = 's';
 5 char Type2;// = 'a';
 6 char userput;
 7 //scanf("%c",&userput);
 8 for(;scanf("%c",&userput);userput=='c'||userput=='w'||userput=='l'||userput=='a')
 9 {
10 Type2=userput;
11 if (argv[1]) {    //有输入参数则以输入为准
12 Type = *(argv[1] + 1);
13 if (Type == 's') {
14 Type2 = *(argv[2] + 1);
15 strcpy(Path, argv[3]);
16 }
17 else
18 strcpy(Path, argv[2]);
19 }
20 
21 Run(Type, Type2, Path);    //调用启动函数
22 printf("\n");
23 }
24 
25 getchar();
26 
27 return 0;
28 }

 

五:相关截图

 

 

 六:等价类分析

有效等价类 无效等价类

(1)字符串(-c,-w,-l,-a,)

 

(2)其他字符串    

测试用例 覆盖等价类 运行结果
-w  (1) 有效
-c  (1) 有效
-l (1) 有效
-a (1) 无效
 -(空格) (2) 无效
-3 (2) 无效

 

 

 

 

 

七:总结

本次项目开发提高了自己和搭档的默契度,增强了自己阅读别人代码的理解能力和灵活引用手段。即便如此,自己平时练习不足的短板非常清晰的暴露出来,编写代码的能力不足,思路不清晰,严重影响力我们的开发速度。

对于C语言的测试方法,除了静态检验代码,我们还尝试运用FlawFinder工具进行单元测试,遗憾的是,对于此工具不够熟悉,未能达到理想目标。

本次开发实验,使我们学会了使用博客园和Gitee的使用,锻炼了项目记录的能力。

正如老师所说的,不积跬步无以成江海,每天50行的代码就会让我们不断进步,自己要在以后的生活中坚持学习计划,不断努力。

posted @ 2018-10-21 17:10  三千‖弱水  阅读(156)  评论(0)    收藏  举报