Word Count 个人作业

Github项目地址:https://github.com/KenneyLourve/Li/blob/master/WC

PSP

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

解题思路

题目描述

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

WC 项目要求

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

设计实现过程

编程语言的选择:C

需要用到的新知识:文件操作函数、文件函数code的思路、文件函数的使用方式

结构分析:每个功能预设使用一个函数,不同功能调用不同函数。主函数实现调用和用户界面。

遇到的困难

  1.文件操作类的代码一窍不通,只能在不断的参考中快速学习,现学现用。在这个过程中发生了许多谬误,只能一一解决,所幸代码不算太长。

  2.实现-a功能时候要考虑的内容太多样,比较耗费时间和心力,仍然感觉是不是少了什么。(可能这里就需要充分样本的测试吧)

代码说明

1. -c:计算文件字符数

  在数据流中截取计算字符数。

void Letter(FILE *f) //Letters counting
{
    int letter = 0, num = 0;
    while (!feof(f))
    {
        letter = fgetc(f);
        if (letter == '\n')
            continue;
        num++;
    }
    printf("共有字符数 %d\n\n", num - 1);
}

 2. -l:计算文件行数

  在-c的基础上,通过空行计算行数。

void Line(FILE *f)   //lines counting
{
    int letter = 0, line = 0,c=0;
    while (!feof(f))
    {
        letter = fgetc(f);
        if (letter!=0)c=1;
        if (letter == '\n')
            line++;
    }
    if(c==1)line++;
    printf("共有行数 %d\n\n", line);
}

 3. -w:计算文件单词数

void Word(FILE *f)   //words counting
{
    int letter = 0, word = 0;
    int t = 0;
    while (!feof(f))
    {
        letter = fgetc(f);
        if ((letter >= 'a'&&letter <= 'z') || (letter >= 'A'&&letter <= 'Z'))
        {
            if (t == 0)
                t = 1;
        }else
        {
            if (t == 1)
            {
                word++;
                t = 0;
            }
            else
                continue;
        }
    }
    printf("共有词数 %d\n\n", word);
}

 4. -a:计算文件空行、代码行和注释行

  先判断是否为一整行,然后再分别统计不同类别的数目。

void ElseData(FILE *f)
{
    int letter = 0, code = 0, emp = 0;
    char a[100];
    int note = 0, mark = 0, notemark = 0;
    int i;

    while (!feof(f))
    {
        letter = fgetc(f); 
        if (mark == 0 || mark == 1)
        {
            if (letter == ' ') 
                continue;
            else if (letter == '\n')  
            {
                emp+=1;
                mark = 0;
                continue;
            }
            else if ((letter == '{' || letter == '}') && mark == 0)
            {
                mark = 1;
                continue;
            }
            else
            {
                if (letter == '/')
                    mark = 2;  
                else
                    mark = 3;
            }
        }

        if (mark == 3)
        {
            while (!feof(f) && letter != '\n')
                letter = fgetc(f);
            mark = 0;
            code+=1;
            continue;
        }

        if (mark == 2)
        {
            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+=1;
                    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;
            }
        }
    }
    printf("共有:空行数 %d  代码行数 %d  注释行数 %d\n", emp, code - 1, note);
}   

程序运行

 

 

项目小结

   现学现用,我经历了太多。感谢分享经验的前辈们,有学到很多,你们的思路打开了的我的思域。谢谢。

猜你喜欢

转载自www.cnblogs.com/kenneyLourve/p/12498148.html
今日推荐