前言
github地址:https://github.com/X-dh/SoftwareEngineering
项目简介
- wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
-
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数,实现
wc.exe -w file.c //返回文件 file.c 的词的数目,实现
wc.exe -l file.c //返回文件 file.c 的行数,实现
-
扩展功能:
-s 递归处理目录下符合条件的文件,未实现
-a 返回更复杂的数据(代码行 / 空行 / 注释行),实现 -
高级功能:
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息,未实现
PSP发开耗时
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 | 100 |
· Estimate |
· 估计这个任务需要多少时间 |
60 | 100 |
Development |
开发 |
570 | 520 |
· Analysis |
· 需求分析 (包括学习新技术) |
150 | 150 |
· Design Spec |
· 生成设计文档 |
60 | 100 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 | 20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
60 | 60 |
· Coding |
· 具体编码 |
60 | 100 |
· Code Review |
· 代码复审 |
40 | 30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 | 30 |
Reporting |
报告 |
100 | 100 |
· Test Report |
· 测试报告 |
40 | 40 |
· Size Measurement |
· 计算工作量 |
30 | 30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 30 |
合计 |
730 | 720 |
开发思路
- 因为平时使用的最多的是JavaScript,在看到本项目的需求时,第一想法是可以使用Node.js+控制台实现,于是一开始花了点时间去看FileSystemObject 对象,但是在初步尝试过后便发现使用面对对象的语言去操作本地文件难度较大,于是就放弃了使用JS实现的想法
- C是面向过程的语言,在放弃使用Js实现后就想到了使用C语言实现,而且是大一时候的基础专业课,用起来也比较熟悉
- 项目需求在键盘敲" wc.exe -options filePath "的形式,关于-options的判断,就直接用其在数组中的位置连续进行两个判断来识别;filePath也差不多,不过记得最后加上一个'\0'结束符
- 之后就是慢慢完善功能函数代码了,大概框架如下
void CharCount(char path[]); //字符统计函数 void WordCount(char path[]); //单词统计函数 void LineCount(char path[]); //行数统计函数 void AllCount(char path[]); //综合统计函数,包括代码行,空行,注释行 int main() { char input[100],path[50]; gets(input); int count=strlen(input); strncpy(path, input + 10, count - 10);//将命令行输入的地址赋值给path path[count - 9] = '\0';//路径结尾添加结束符,避免统计类型时出错 int check = 1; //检查类型 while (check) { int i = 7; if ((input[i] == '-') && (input[i + 1] == 'Char')) //Char表示想查询的类型 { function(path); break; } } return 0; }
程序设计流程
关键代码
主函数:
int main() { char input[100],path[50]; printf("wc.exe程序启动...\n"); printf("命令格式: wc.exe -options filePath\n"); printf("options选项:-c/-w/-l/-a\n"); printf("请输入命令:"); gets(input); int count=strlen(input); strncpy(path, input + 10, count - 10);//将命令行输入的地址赋值给path path[count - 9] = '\0';//路径结尾添加结束符,避免统计类型时出错 int check = 1; //检查类型 while (check) { int i = 7; if ((input[i] == '-') && (input[i + 1] == 'c')) { CharCount(path); break; }else if ((input[i] == '-') && (input[i + 1] == 'w')) { WordCount(path); break; }else if ((input[i] == '-') && (input[i + 1] == 'l')) { LineCount(path); break; }else if ((input[i] == '-') && (input[i + 1] == 'a')) { AllCount(path); break; }else { printf("输入字符无效\n"); break; } } return 0; }
逻辑函数:
基础功能(-c,-w, -l)
//CharCount()功能部分 ch = fgetc(fp); //fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。 while (ch != EOF) { c++; ch = fgetc(fp); }
//WordCount()功能部分 while (ch != EOF) { if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9'))//非空 { while ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9') || ch == '_') { ch = fgetc(fp);//直到遇见非字母/数字/下划线 } w++; ch = fgetc(fp); } else { ch = fgetc(fp); } }
//LineCount()功能部分 while (ch != EOF) { if (ch == '\n') { l++; ch = fgetc(fp); } else { ch = fgetc(fp); } }
拓展功能(-a)
//AllCount()功能部分 while (ch != EOF) { if (ch == '{' || ch == '}') { e++; ch = fgetc(fp); } else if (ch == '\n') { ch = fgetc(fp); while (ch == '\n') { e++; ch = fgetc(fp); } } else if (ch == '/') { ch = fgetc(fp); if (ch == '/') while (ch != '\n') { ch = fgetc(fp); } n++; ch = fgetc(fp); } else { c++; while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF) { ch = fgetc(fp); } }
测试运行
启动程序
文本
基本功能
- -c
- -w
- -l
拓展功能
- -a
项目小结
经过这个项目,我重新回顾了一边C语言并且第一次使用C语言操作本地的目录文件,同时也将上课的内容转变成了行动,完成了一个项目从0到1的过程,从预估,尝试,设计,发开,测试过了一遍简单的软件开发流程。
而且此博文是我写的第一篇博文,之前虽然有自己建站的想法但是还没实施,也算是一个从0到1的过程。