wordcount个人项目

Github项目地址:https://github.com/charnem/WC/tree/wordcount

一、题目描述:

Word Count
1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

二、项目要求:

wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

具体功能要求:
程序处理用户需求的模式为:

wc.exe [parameter] [file_name] 

基本功能列表:

wc.exe -c file.c     //返回文件 file.c 的字符数 ---已实现

wc.exe -w file.c    //返回文件 file.c 的词的数目  ---已实现

wc.exe -l file.c      //返回文件 file.c 的行数 ---已实现

扩展功能:
    -s   递归处理目录下符合条件的文件。---未实现
    -a   返回更复杂的数据(代码行 / 空行 / 注释行)。---未实现

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

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

注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

    } //注释
在这种情况下,这一行属于注释行。

[file_name]: 文件或目录名,可以处理一般通配符。

高级功能:---未实现

 -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

需求举例:
  wc.exe -s -a *.c

返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。

三、解题思路

看到题目的时候觉得很茫然,不知道因该怎样实现项目的要求。通过上网查资料,学习到fgetc()、fopen()、fclose()、feof()等函数可以实现读取文件,才慢慢开始有了思路。通过if else判断字符是否符合对应功能的要求,并且记录。

四、设计实现过程

 wordcount个人项目_第1张图片

五、代码说明

 字符统计

int CharCount(char *file)// 返回文件file.c的字符数
{
  FILE *path=fopen(file,"r");
  int ch,num=0;//num表示字符数 
  if(NULL==path)
    {
     printf("文件读取失败!");
     system("pause"); 
     exit(-1);
    }
  ch=fgetc(path);//因为不明原因,测试字符数总比实际数目+1,只能以此方法纠正 
     while(!feof(path))
       {
           ch=fgetc(path);
           if(ch!=' '&&ch!='\n'&&ch!='\t') 
           num++;
       }    
   fclose(path);    
   printf("文件中的字符数为:%d\n",num);
   return num;
}

词数统计

int WordCount(char *file)// 返回文件file.c的词的数目 
{
  FILE *path=fopen(file,"r");
  int ch,num=0,flag;//num表示词数 
  if(NULL==path)
    {
     printf("文件读取失败!");
     system("pause"); 
     exit(-1);
    }

    while(!feof(path))
       {
           ch=fgetc(path);
           if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
               flag=0;
           else if(flag==0)
                  {
                      flag=1;
                      num++;
                  }
       }
  fclose(path);          
  printf("文件中的单词数为:%d\n",num);
  return num;
}

行数统计

int LineCount(char *file)// 返回文件file.c的行数
{
  FILE *path=fopen(file,"r");
  int ch,num=0;//num表示行数 
  if(NULL==path)
    {
     printf("文件读取失败!");
     system("pause"); // 
     exit(-1);
    }
  if(ch=fgetc(path)&&!feof(path))//针对空文件情况 
  num++;
     while(!feof(path))
       {
           ch=fgetc(path);
           if(ch=='\n')
               num++;
       }
  fclose(path);                 
  printf("文件中的行数为:%d\n",num);
  return num;
}

主函数

int main()
{
    char name[30];    
    printf("请输入您所需要统计的文件名:") ;
    scanf("%s",name);
    printf("\n");
    CharCount(name);
    WordCount(name);
    LineCount(name);
    ExtendCount(name); 
    system("pause"); 

}

 

六、测试运行

 wordcount个人项目_第2张图片多行单词wordcount个人项目_第3张图片一行

wordcount个人项目_第4张图片空文件wordcount个人项目_第5张图片一个字母

wordcount个人项目_第6张图片一个单词不存在文件

 

七、PSP

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 30

25

· Estimate

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

30

 25

Development

开发

380

 525

· Analysis

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

 120

 150

· Design Spec

· 生成设计文档

 30

 25

· Design Review

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

 10

 20

· Coding Standard

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

 0

· Design

· 具体设计

 30

 46

· Coding

· 具体编码

 100

84

· Code Review

· 代码复审

 30

20

· Test

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

 60

 180

Reporting

报告

 60

 70

· Test Report

· 测试报告

 30

 25

· Size Measurement

· 计算工作量

 10

 10

· Postmortem & Process Improvement Plan

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

 20

 35

 合计    470  620

 

八、项目小结

 项目的基本要求其实不难,但是因为我比较菜,所以花费的时间比较多。我觉得在编码的时候需要集中精神,不然稍微走神就会思路乱掉,有时候打码的话也会需要到前面翻看捋一下思路。在测试的过程中发现当程序和被测文件放在同一目录下,就可以不输入被测文件的地址,也算是一个小小的发现。

你可能感兴趣的:(wordcount个人项目)