Github项目地址:
https://github.com/LittleTaro/Chaos
解题思路
拿到题目后,我从几个重要的、我却不了解的相关知识下手,比如命令行程序、文件的读写。
结合题目的相关要求,我在”菜鸟教程“的c语言模块针对性地学习了命令行参数的使用、读写文件的相关函数。
同时,我还利用百度得知了windows命令行如何运行C/C++程序。
对于不同的计数功能要求,要使用循环语句,注意每个元素的终止条件,有的还要注意使用变量标注状态,再fgetc、fgets配合就能实现基础功能。
设计实现过程
代码中除了一个主函数,还有3个自定义函数;主函数调用3个自定义函数;
代码说明
wc.exe -c file.c
思路:利用fgetc函数从 fp 所指向的输入文件中读取一个字符。
若返回值是 EOF 则输入字符结束,结束循环;
若返回字符则计数器的值加1。
1 //返回文件file.c的字符数 2 int CCount(char *filename){ 3 FILE *fp=fopen(filename,"r"); 4 int count=0; 5 char c; //接收返回的字符 6 if(fp==NULL){ 7 exit(-1); 8 } 9 c=fgetc(fp); 10 while(c!=EOF){ 11 count++; 12 c=fgetc(fp); 13 } 14 fclose(fp); 15 return count; 16 }
wc.exe -w file.c
思路:利用fgetc函数从 fp 所指向的输入文件中读取一个字符。
若返回值为EOF则结束循环;
若返回一个字符,则判断其是不是字母,配合InWord变量的状态变化,
再判断它在不在一个新的词里,从而可以判断新词的出现来计数。
1 //计算纯英文单词个数 2 int WCount(char *filename){ 3 FILE *fp=fopen(filename,"r"); 4 if(fp==NULL) 5 exit(-1); 6 char c; 7 int count=0; 8 int InWord=1; 9 c=fgetc(fp); 10 while (c!=EOF){ 11 if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) //字符是字母 12 { 13 count+=InWord; 14 InWord=0; //表示当前字母在词中 15 } 16 else 17 { 18 InWord=1; //表示当前字符不在词中 19 } 20 c=fgetc(fp); 21 } 22 fclose(fp); 23 return count; 24 }
wc.exe -l file.c
思路:利用fgets函数读取最后一个字符之前就遇到一个换行符 ' ' 或文件的末尾 EOF就会返回已读字符串并停止读取的性质,
配合循环,把每一次读取的字符串暂存在字符数组str中,
每读一次,计数器加一,可得文件行数。
1 //计算行数 2 int LCount(char *filename){ 3 FILE *fp; 4 char str[200]; 5 int count=0,n; 6 fp=fopen(filename,"r"); 7 if(fp==NULL) 8 exit(-1); 9 for(;fgets(str,200,fp)!=NULL;count++); //读取一行字符串 10 fclose(fp); 11 return count; 12 }
测试运行
测试文件:
程序运行的截图
PSP:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
30 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
30 |
Development |
开发 |
1010 |
830 |
· Analysis |
· 需求分析 (包括学习新技术) |
90 |
90 |
· Design Spec |
· 生成设计文档 |
30 |
90 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
10 |
· Design |
· 具体设计 |
60 |
60 |
· Coding |
· 具体编码 |
400 |
300 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
350 |
240 |
Reporting |
报告 |
450 |
160 |
· Test Report |
· 测试报告 |
360 |
60 |
· Size Measurement |
· 计算工作量 |
30 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
90 |
合计 |
|
1490 |
1020 |
项目小结
- 困难描述:实现不了-a功能,难于计算注释行;
- 做过哪些尝试:尝试用字符数组存储每行的前两个非空字符,若为"//"或"/*"则判为注释行,但这无法用于判断多行注释的情况;
- 是否解决:否;
- 有何收获:在这次个人项目的实施过程中,我更加熟悉了个人个人开发的流程,还学习了一些c语言的知识(命令行参数、文件的读取等);
- 教训:我从这次的实践中感受到本人应该再至少多掌握一门别的编程语言、同时还应该提高编程的能力,才能利用已学知识满足该项目的高级需求;