zoukankan      html  css  js  c++  java
  • 个人项目作业

    个人项目作业


     项目github地址:https://github.com/gduthai/WC2

    项目相关要求

    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 文件的代码行数、空行数、注释行数。


    PSP

    PSP2.1

    Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning 计划    
    · Estimate · 估计这个任务需要多少时间  30  
    Development 开发    
    · Analysis · 需求分析 (包括学习新技术)  60  
    · Design Spec · 生成设计文档  120  
    · Design Review · 设计复审 (和同事审核设计文档)  30  
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)    
    · Design · 具体设计  60  
    · Coding · 具体编码  100  
    · Code Review · 代码复审    
    · Test · 测试(自我测试,修改代码,提交修改)  120  
    Reporting 报告    
    · Test Report · 测试报告 60  
    · Size Measurement · 计算工作量  20  
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划  20  
      合计  620  

     


    遇到的困难及解决方法

    1.不知道怎么判断单词的个数,自己想了一些算法,但是总是失败。之后去查询了网络,才知道具体的算法, 而且这个算法很简单。

    2.程序刚开始总是不能运行,显示fopen()函数的错误,我也百思不得其解,也检查了一遍我的代码,发现是没有问题的。后来查CSDN才发现,出现这个问题的原因是我开了软件的SDL检查,开启这个插件的 话但凡程序有编译器警告的内容就不能运行。后来关闭了这个插件,终于可以编译运行了。

    3.当初学习c语言的时候,并没有学习文件操作的内容,看到这个感觉很懵,找到了《c primer plus》电子书,自学了文件操作的内容,才开始写项目。


    解题过程:

    拿到这个项目,我首先想到的是用JAVA语言做,但是奈何JAVA刚学不熟悉,于是就改用c语言。首先这哥题目的理解我花了很长时间,慢慢地才想到这原来是一个统计程序特征的工具,然后才开始着手做项目,所以在计划方面是用了很长的时间的。这个题目的三个函数有一个共同点,就是用文件getc()函数读出每一个字符,然后识别字符特征来判断行数,列数,单词数。


    设计实现过程

    3个功能对应3个函数,一开始我就想到要分别设计统计行数,字符数,单词数的三个函数。并用主函数调用他们,用主函数实现交互的动作。


    代码说明

    计算字符数  

    这个功能是用getc函数一个一个读入文件字符,直到文件到达结尾。

    int charnumber(char* filename) {
    int num = 0; //统计字符数
    char c;
    FILE* fp;
    fp = fopen(filename, "r"); //用“只读”打开文件
    if (!fp)
    exit(-1);
    c = fgetc(fp);
    while (!feof(fp)) { //feof函数是检查文件是否运行到末端的函数
    num++;
    c = fgetc(fp);
    }
    fclose(fp);
    return num;

    计算单词数

    计算单词数的过程是,先读入字符,判断是否为字母  不是则flag=0。如果是字母且flag=0,说明这是个单词,且没有被统计过,则单词数+1。

    int wordnumber(char* filename) { //统计单词数
    int num = 0;
    int flag = 0;                  
    char c;
    FILE* fp;
    fp = fopen(filename, "r");
    if (!fp)
    exit(-1);
    c = fgetc(fp);
    while (!feof(fp)) {
    c = fgetc(fp);
    if (c < 'A' || (c > 'Z' && c < 'a') || c>'z')
    flag = 0;
    else if (flag == 0) {      //如果是字母且flag=0 则单词数加一

    flag = 1;
    num++;
    }
    }
    fclose(fp);
    return num;

    }


    统计行数

    一个一个读入字符,当字符是‘ ’换行符时则行数+1,用lc代表前一个字符,用来统计末行,若有末行则行数+1。这个函数有一个漏洞,就是当文件时空文件时仍然显示文件行数为1,所以我添加了一行代码,当此文件字符为0时则行数返回0。

    int linenumber(char* filename) {//统计行数
    FILE* fp = NULL;
    int c, lc = 0;
    int line = 0;
    fp = fopen(filename, "r");
    if (wordnumber(filename) == 0)  //当字符数为0时,返回0
    return 0;
    while ((c = fgetc(fp)) != EOF) {

    if (c == ' ')                 //若读到‘ ’符号,则行数+1
    line++;
    lc = c;
    }
    if (lc != ' ') line++;     //加入末行
    return line;
    }

    主函数

    用c[3]读入操作命令,并通过c[1]判断要执行什么操作显示出需要的数,用filename读出文件名,然后对这个文件名进行操作。

    int main() {
    int i = 0;
    FILE* fp;
    int c_num, w_number, l_number;
    char c[3];
    char filename[20];
    printf("输入命令wc.exe");
    scanf("%s %s", c, filename);        
    if ((fp = fopen(filename, "r")) == NULL) {   //若找不到文件,则输出 no found
    printf("no found");
    return 0;
    }
    switch (c[1]) {


    case 'c': {printf("char number=%d ", charnumber(filename)); break; }
    case 'w': {printf("word number=%d ", wordnumber(filename)); break; }
    case 'l': {printf("line number=%d ", linenumber(filename)); break; }

    }
    getchar();
    return 0;

    }


     项目测试

    回归测试

    在主函数中加入了for语言连续运行三次以方便测试3个功能

    空文件

    只有一个字符的文件

    只有一个单词的文件

     

    只有一行的文件

     标准源文件

     

     

    经检验这些结果都是正确的所以该程序的代码覆盖率是100%


     实际花费时间

    PSP2.1

    Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning 计划    
    · Estimate · 估计这个任务需要多少时间  30  20
    Development 开发    
    · Analysis · 需求分析 (包括学习新技术)  60  80
    · Design Spec · 生成设计文档  120  120
    · Design Review · 设计复审 (和同事审核设计文档)  30  30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)    
    · Design · 具体设计  60  60
    · Coding · 具体编码  100  120
    · Code Review · 代码复审    
    · Test · 测试(自我测试,修改代码,提交修改)  120  120
    Reporting 报告    
    · Test Report · 测试报告 60  30
    · Size Measurement · 计算工作量  20  10
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划  20  20
      合计  620  490

     

    项目小结

    1.事情要提前规划完,并且提前做完,不要快要到时间才慌慌张张。

    2.我对代码还不够熟悉,需要学习更多知识,而且实践更多。

    3.拓展功能还有高级功能都没有实现,这个很遗憾。

    4.没有学会高级的调试技巧,运用高级的工具能使测试工作事半功倍。这件事之后一定要学会。

     

     

  • 相关阅读:
    MongoDB环境配置
    Python之路【第二十七篇】:反射
    Socket网络通讯,TCP三次握手和四次释放,与UDP的差别
    iOS 常用第三方
    UISegmentedControl的使用
    OC取应用程序目录的路径
    KVC中setValuesForKeysWithDictionary
    KVC和KVO的简单对比
    C语言 内存和地址
    html基础知识
  • 原文地址:https://www.cnblogs.com/whycft/p/12493880.html
Copyright © 2011-2022 走看看