WC.exe-软工作业(一)

GitHub地址

项目要求

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


遇到的困难及解决方法

1.困难描述
  • 原本自己是对前端和设计比较感兴趣,也在学相关方面的知识,对JavaScript相对比较熟悉,所以一开始产生了用JavaScript来完成这个任务的想法。所以就开始查阅资料,用Node.js+Commander.js 开发命令行程序。但是在真正看需求的时候,发现JavaScript是脚本语言,对于实现具体的功能还是比较麻烦的。
  • 后来换成了自己在大一学过的C语言,由于很久没有接触过面向过程语言,很多东西都忘得差不多了。
2. 做过哪些尝试

用谷歌引擎查阅相关的资料,查看一些别人分享的博客。

3.是否解决

解决了,最后确定用C语言,再一步步查阅资料,慢慢debug,做出了基本功能和拓展功能。

4.有何收获

第一次一个人从头开始做出一个小型程序,也是第一次用C语言做命令行程序,以前不太喜欢C语言,感觉面向过程的语言太麻烦了,相比较之下还是喜欢面向对象语言,不过慢慢地也体会到了C语言的乐趣,感觉还是在于解决问题的思路,语言是一种辅助的工具,选择合适的语言有时候会方便很多。

关键代码

  1. 读取文件后,遍历文件的每一行,统计行数,字符数和词数
//遍历文件的每一行,统计行数,字符数和词数
fgets(st,bufsize,fp);
res.line++;
int len=strlen(st);     

for (int i=0;i<len;i++)
{
    if (is_character(st[i]))
    {
        res.character++;
        if  ( i==0 || !is_character(st[i-1]) ) 
            res.word++;         
    }
}

2.代码行与空行的判断

// 代码行与空行的判断 
int show_char=0; 
for (int i=0;i<len;i++)
{
    if (st[i]!=' ' && st[i]!='\n' && st[i]!='\t')
        show_char++;
}
if (show_char>1) res.code_line++;
else res.null_line++;

3.注释行的判断

// 注释行的判断
bool is_annotation_line=false;
show_char=0;
for (int i=0;i<len;i++)
{
    if ((st[i]!=' ') && st[i]!='\n' && st[i]!='\t')
    {
        show_char++;
        if (st[i]=='/')
        {
            if (i+1<len && st[i+1]=='/')
                is_annotation_line=true;
            break;
        }
        if (show_char>1) break;
    }
}
if (is_annotation_line==true) res.annotation_line++;    

4.递归处理目录下符合条件的文件

//递归处理目录下符合条件的文件 
void listFiles(string dir,Topt nowopt)
{
    intptr_t handle;
    _finddata_t findData;
 
    handle = _findfirst((dir+"\\*.*").c_str(), &findData);    // 查找目录中的第一个文件
    if (handle == -1)
    {
        cout << "Failed to find first file!\n";
        return;
    }
 
    do
    {
        string nextdir=dir+'/'+string(findData.name);
        if (strcmp(findData.name, ".") == 0) continue;
        if (strcmp(findData.name, "..") == 0) continue;
        if (findData.attrib & _A_SUBDIR )
        {   
                listFiles(nextdir,nowopt);
        }
        else 
        {
            printf("the file is %s\n",(nextdir).c_str());
            int len=nextdir.size();
            char filename[len+1];
            nextdir.copy(filename, len, 0);//这里5代表复制几个字符,0代表复制的位置,
            filename[len]='\0';
            work(filename,nowopt);
            printf("-------------\n");
        }
    } while (_findnext(handle, &findData) == 0);    // 查找目录中的下一个文件

    _findclose(handle);    // 关闭搜索句柄

}
PSP
PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划430680
Estimate估计这个任务需要多少时间3030
Development开发400650
Analysis需求分析 (包括学习新技术)150250
Design Spec生成设计文档2040
Design Review设计复审 (和同事审核设计文档)2030
Coding Standard代码规范 (为目前的开发制定合适的规范)划1030
Design具体设计3040
Code Review代码复审3060
Test测试(自我测试,修改代码,提交修改)3050
PReporting报告110150
Test Report测试报告3060
Size Measurement计算工作量2020
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6070
合计计划430680

转载于:https://www.cnblogs.com/Yanzery/p/9648231.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值