1.Github项目地址https://github.com/JameMo/WordCount-for-C

       2.在程序的各个模块的开发上耗费的时间

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

10

8

· Estimate

· 估计这个任务需要多少时间

10

8

Development

开发

350

350

· Analysis

· 需求分析 (包括学习新技术)

150

120

· Design Spec

· 生成设计文档

20

30

· Design Review

· 设计复审 (和同事审核设计文档)

20

15

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

10

10

· Design

· 具体设计

30

25

· Coding

· 具体编码

70

90

· Code Review

· 代码复审

20

30

· Test

· 测试(自我测试,修改代码,提交修改)

30

30

Reporting

报告

60

60

· Test Report

· 测试报告

30

35

· Size Measurement

· 计算工作量

20

15

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

10

10

合计

420

418

   3. 解题思路

  首先,认真审题,将题目中的具体需求写出来,然后再思考具体模块。然后,细化到各个模块内,每个模块如何实现,如何满足需求,并判断自己是否能做到。接下来,将自己所需要的知识写下,并寻找自己所需要的资料,逐一学习,并开始着手打码。最后,对每个模块进行测试,并编辑博文。

  4.设计实现过程

  代码一共含有九个函数(其中包含主函数)。其中char_num、word_num、line_num、blankline_num、codeline_num、commentline_num这六个函数为主要功能函数,而main、traverse两个函数主要是用来调用上面的六个函数,还有最后一个fun函数则是用来将两个字符串连接。

  5.代码说明

  头文件:

      #include<stdio.h>
    #include<io.h>

   具体函数:

  ①char_num函数

 1 void char_num(char *file)
2 {
3 //查询file.c文件中字符数目的函数
4 int num = 0;
5 FILE *f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while((a = fgetc(f))!=EOF)
11 {
12 //避开空格、换行、Tab字符
13 if(a!=' ' && a!='\n' && a!='\t')
14 num++;
15 }
16 }
17 else
18 {
19 printf("this file does not exist.\n");
20 }
21 fclose(f);
22 printf("char_num:%d\n",num);
23 }

  ②word_num函数

 1 void word_num(char *file)
2 {
3 //查询file.c文件中单词数目的函数
4 int num = 0,flag;
5 FILE *f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while(!feof(f))
11 {
12 a = fgetc(f);
13 //判断字符是否为大小写字母
14 if((a<='z'&&a>='a')||(a<='Z'&&a>='A'))
15 flag = 1;
16 //计算单词数目
17 else if(flag)
18 {
19 num++;
20 flag = 0;
21 }
22 }
23 }
24 else
25 {
26 printf("this file does not exist.\n");
27 }
28 fclose(f);
29 printf("word_num:%d\n",num);
30 }

  ③line_num函数

 1 void line_num(char *file)
2 {
3 //查询file.c文件中行数的函数
4 int num = 1;
5 FILE *f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while(!feof(f))
11 {
12 a = fgetc(f);
13 //换行符为计数标志
14 if(a=='\n')
15 num++;
16 }
17 }
18 else
19 {
20 printf("this file does not exist.\n");
21 }
22 fclose(f);
23 printf("line_num:%d\n",num);
24 }

  ④blankline_num函数

 1 void blankline_num(char *file)
2 {
3 //查询file.c文件中空行数的函数
4 int num = 0,count = 0,flag;
5 FILE *f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while(!feof(f))
11 {
12 a = fgetc(f);
13 //换行时进行判断
14 if(a=='\n')
15 {
16 //字符少于、等于1和不为注释行时进行计数
17 if(count<=1&&flag!=2)
18 num++;
19 count = 0;
20 }
21 else if(a!='\t'&&a!=' '&&a!='/')
22 count++;
23 else if(a=='/')
24 flag++;
25 }
26 }
27 else
28 {
29 printf("this file does not exist.\n");
30 }
31 fclose(f);
32 printf("blankline_num:%d\n",num);
33 }

  ⑤codeline_num函数

 1 void codeline_num(char *file)
2 {
3 //查询file.c文件中代码行数的函数
4 int num = 0,count = 0,flag = 0;
5 FILE *f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while(!feof(f))
11 {
12 a = fgetc(f);
13 //先作字符分类,再进行判断
14 if(a!=' '&&a!='\t'&&a!='\n'&&a!='/')
15 count++;
16 else if(a=='\n')
17 {
18 if(count>1&&flag!=2)
19 num++;
20 count = 0;
21 }
22 else if(a=='/')
23 {
24 flag++;
25 }
26 }
27 }
28 else
29 {
30 printf("this file does not exist.\n");
31 }
32 fclose(f);
33 printf("codeline_num:%d\n",num);
34 }

  ⑥commentline_num函数

 1 void commentline_num(char *file)
2 {
3 //查询file.c文件中注释行数的函数
4 int num = 0,flag = 0;
5 FILE* f;
6 char a;
7 f = fopen(file,"r");
8 if(f!=NULL)
9 {
10 while(!feof(f))
11 {
12 a = fgetc(f);
13 //换行时标志归零
14 if(a=='\n')
15 {
16 flag = 0;
17 }
18 //对注释符进行计数
19 else if(a=='/')
20 {
21 flag++;
22 if(flag==2)
23 num++;
24 }
25 }
26 }
27 else
28 {
29 printf("this file does not exist.\n");
30 }
31 fclose(f);
32 printf("commentline_num:%d\n",num);
33 }

  ⑦fun函数

 1 char *fun(char *c1,char *c2)
2 {
3 //将两个字符串进行连接
4 int i,j;
5 char *ch;
6 for(i=0;c1[i]!='*';i++)
7 {
8 ch[i]=c1[i];
9 }
10 for(j=0;c2[j]!='\0';j++,i++)
11 {
12 ch[i]=c2[j];
13 }
14 ch[i]='\0';
15 return ch;
16 }

  ⑧traverse_all函数

 1 void traverse_all(char *file_folder)
2 {
3 //文件夹内所有*.c文件的所有信息
4 long handle;
5 char *ch;
6 struct _finddata_t fileinfo;
7 handle = _findfirst(file_folder,&fileinfo);
8 if(handle==-1L)
9 return;
10 do
11 {
12 printf("file name:%s\n",fileinfo.name);
13 ch = fun(file_folder,fileinfo.name);
14 char_num(ch);
15 word_num(ch);
16 line_num(ch);
17 blankline_num(ch);
18 codeline_num(ch);
19 commentline_num(ch);
20 }while(!_findnext(handle,&fileinfo));
21 }

  ⑨main函数

 1 int main(int a,char* arg[])
2 {
3 //运行wc.exe的主函数。
4 FILE *f;
5 while(1)
6 {
7 //判断文件是否存在
8 //对文件作不同的处理
9 if((f=fopen(arg[2],"r"))==NULL)
10 {
11 if(!strcmp("-s",arg[1]))
12 {
13 traverse_all(arg[2]);
14 }
15 else
16 {
17 printf("NO FILE NOW\n\n");
18 scanf("%s%s%s",arg[0],arg[1],arg[2]);
19 continue;
20 }
21 }
22 else if(!strcmp("-c",arg[1]))
23 {
24 char_num(arg[2]);
25 }
26 else if(!strcmp("-w",arg[1]))
27 {
28 word_num(arg[2]);
29 }
30 else if(!strcmp("-l",arg[1]))
31 {
32 line_num(arg[2]);
33 }
34 else if(!strcmp("-a",arg[1]))
35 {
36 blankline_num(arg[2]);
37 codeline_num(arg[2]);
38 commentline_num(arg[2]);
39 }
40 else
41 {
42 printf("Out of specification\n\n");
43 }
44 scanf("%s%s%s",arg[0],arg[1],arg[2]);
45 }
46 return 0;
47 }

  6.测试运行

  测试文件:

  ①testing1.c

  

  ②testing2.c

  

  测试结果:

  ①-c

  

  ②-w

  

  ③-l

  

  ④-a

  

  ⑤-s

  

  7.项目小结:

  这次项目是我做得最完整的一次项目,而且也是我的第一次做如此困难的项目。在这次项目中,我懂得了如何使用PSP去控制自己做项目的时间,此外,PSP还教会了我如何去完成一个项目。同时在这次项目中学会使用了许多新的函数,利用这些函数可以打开文件以及文件夹,从而在文件层面进行操作。我认为此次项目的最大的缺点是没有用到其他语言去实现,只停留在C语言中。

最新文章

  1. Selenium_等待页面加载完毕
  2. spark 你要喧宾夺主么?好好干。
  3. MyEclipse 2014 GA 和 MyEclipse 2015 CI 和 Eclipse Luna 最新最全下载地址
  4. 耿丹CS16-2班第一次作业汇总
  5. OwinStartupAttribute
  6. IO-同步,异步,阻塞,非阻塞
  7. 使用nmon监控服务器性能
  8. RC4加密解密算法
  9. Enumeration 接口
  10. html5 750 REM JS换算方法
  11. BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
  12. 【日报C在23】堆和栈的深入了解
  13. HDU 3339 最短路+01背包
  14. jQuery serializeArray()方法改写多维对象以及自定义
  15. 学号:201521123116 《java程序设计》第九周学习总结
  16. web管理kvm ,安装webvirtmgr
  17. 了解PID控制
  18. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents
  19. 【读书笔记】iOS-UDID
  20. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡

热门文章

  1. 包装类和基本数据类型(以int和Integer为例)
  2. linux kernel 的 procfs sysfs 对查问题的帮助
  3. MFC窗口通过OpenCV显示图片
  4. python实战GUI界面+mysql
  5. 查看 /var/log目录下文件个数 命令tree 、cut
  6. Pinpoint 编译环境搭建(Pinpoint系列一)
  7. Ramnit蠕虫病毒分析和查杀
  8. 不会吧!做了这么久开发还有不会NIO的,看看BAT大佬是怎么用的吧
  9. Java基础教程——数组
  10. VisualStudio 编写汇编代码相关设置