软工项目WordCount

  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语言中。

posted on 2020-03-15 01:49  政B  阅读(315)  评论(0编辑  收藏  举报