WC

 

github地址

项目相关要求

 

实现一个统计程序,它能正确统计文本文件中的字符数、单词数、行数,以及还具备其他的扩展功能,并能够快速地处理多个文件。

  • 具体功能
    • -c 返回文件字符数✅
    • -w 返回词的数目✅
    • -l 返回行数✅
  • 扩展功能
    • -s 递归处理目录下符合条件的文件❌
    • -a 返回更复杂的数据(代码行 / 空行 / 注释行)✅
  • 高级功能
    • -x 命令行输入-x参数,程序显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。❌

 

遇到的困难及解决方法

 

  • 文本的定义和判定

字符:ASCII字符

词:由空白字符分割的字符串

行:一个换行符\n为一行

空行:没有任何字符,或者由空格、控制字符组成的行

注释行:多行或单行注释

代码行:存在有效字符

 

  • 文件FILE类文件操作

FILE* 指针作为文件句柄,是文件访问的唯一标识,它由fopen函数创建,fopen打开文件成功,则返回一个有效的FILE*指针,否则返回空指针NULL,以及各种字符操作的函数

 

关键代码&设计说明

 

GetLine:取到换行符则 line++

GetWord :判断是否为 ASCII 字符,字符串标记为开始,没有字符是判断为字符串结束,也就是一个单词

GetLetter:除了换行标记,其余都++

Moredata:

空行:空白后没有字符

注释行对单多行的判断

if (mark == 3) //判定注释行
        {
            while (!feof(f))
            {
                letter = fgetc(f);
                if (letter == '/' && notemark == 0) //单行注释起始判定
                    notemark = 1;
                else if (letter == '*' && notemark == 0) //多行注释起始判定
                    notemark = 2;
                else if (letter == '*' && notemark == 2) //多行注释结束判定
                    notemark = 3;
                if (notemark == 1) //单行注释结束判定
                {
                    while (!feof(f) && letter != '\n')
                        letter = fgetc(f);
                    note++;
                    mark = 0;
                    notemark = 0;
                    break;
                }
               
                if (notemark == 2)  //多行注释中间行数计算
                {
                    while (!feof(f) && letter != '\n')
                        letter = fgetc(f);
                    note++;
                }

                if (notemark == 3 && letter == '/') //多行注释结束判定
                {
                    while (!feof(f) && letter != '\n')
                       letter = fgetc(f);
                    note++;
                    mark = 0;
                    notemark = 0;
                    break;
                }

                else if (notemark == 3 && letter != '*') 
                    notemark = 2;
            }
        }

 

 

  • 选择菜单
 while (1)
    {
        switch (choose)
        {
            case 1:
                GetLetter(fp);
                rewind(fp);
                break;
            case 2:
                GetWord(fp);
                rewind(fp);
                break;
            case 3:
                GetLine(fp);
                rewind(fp);
                break;
            case 4:
                MoreData(fp);
                rewind(fp);
                break;
            case 100:
                fclose(fp);
                free(func);
                exit(0);
            case 101:
                printf("错误输入\n\n");
                while (getchar() != '\n')
                    continue;
                break;
        }

        printf("输入:q 退出\t w 获取词数\t l 获取行数\t c 获取字符数\t a 获取更多信息\t");
        scanf("%c", &com);
        getchar();
        if (com == 'c')
            choose = 1;
        else if (com == 'w')
            choose = 2;
        else if (com == 'l')
            choose = 3;
        else if (com == 'a')
            choose = 4;
        else if (com == 'q')
            choose = 100;
        else
            choose = 101;

 

    

PSP

 

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

 

测试报告

WC_第1张图片

 

 

 

项目小结

 

平常对编程知识的学习大都停留在理论层面,从 PSP 预估的不合理就能看出自己的实战经验之少。刚开始自己仅能实现简单的字符、行等统计,但事实上附加功能并没有在技术上增加多少,只是需要耐心分析,在逻辑和结构上有清晰的设计。

 

你可能感兴趣的:(WC)