Github项目地址:
https://github.com/haomeili/project3/tree/master
基本功能
-c 统计文件字符数(实现)
-w 统计文件词数(实现)
-l 统计文件行数(实现)
PSP2.1表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
15 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
180 |
210 |
Development |
开发 |
300 |
360 |
· Analysis |
· 需求分析 (包括学习新技术) |
200 |
200 |
· Design Spec |
· 生成设计文档 |
10 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
· 具体设计 |
60 |
60 |
· Coding |
· 具体编码 |
300 |
360 |
· Code Review |
· 代码复审 |
10 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
40 |
60 |
Reporting |
报告 |
30 |
30 |
· Test Report |
· 测试报告 |
10 |
10 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
10 |
合计 |
1180 |
1350 |
解题思路:刚开始拿到题目,基本功能不难实现,建立一个缓冲区,每次从文件中读取一行,放到缓冲区buffer,然后遍历缓冲区,统计当前行的字符和单词数。
(空白字符(空格和tab缩进)不计入字符总数; 单词以空格为分隔; 不考虑一个单词在两行的情况; 限制每行的字符数不能超过100)
设计实现过程:基本功能简单,只设计了一个函数来实现三个功能。
代码说明:
三个基本功能实现代码:
1 int *GetCharNum(char *filename, int *TotalNum) 2 { 3 FILE *p;//指向文件的指针 4 char buffer[103];//缓冲区,存储读取到的每行的内容 5 int len;//缓冲区中实际存储的内容的长度 6 int i;//当前读到缓冲区的第i个字符 7 char c;//读取到的字符 8 int blank = 0;//上个字符是否是空格 9 int charNum = 0;//当前行的字符数 10 int wordNum = 0;//当前行的单词数 11 if((p = fopen(filename,"rb")) == NULL) 12 { 13 perror(filename); 14 return NULL; 15 } 16 printf("line words chars\n"); 17 while(fgets(buffer,103,p)!=NULL) 18 { 19 len = strlen(buffer); 20 //遍历缓冲区的内容 21 for(i=0;i<len;i++) 22 { 23 c = buffer[i]; 24 if(c == ' '||c == '\t')//遇到空格 25 { 26 !blank&&wordNum++;//如果上个字符不是空格,那么单词数加1 27 blank = 1; 28 } 29 else if(c!='\n' && c!='\r')//忽略换行符 30 { 31 charNum++;//如果既不是换行符也不是空格,字符数加1 32 blank = 0; 33 } 34 } 35 !blank && wordNum++;//如果最后一个字符不是空格,那么单词数加1 36 blank = 1;//每次换行重置为1 37 //一行结束,计算总字符数、总单词数、总行数 38 TotalNum[0]++;//总行数 39 TotalNum[1] += charNum;//总字符数 40 TotalNum[2] += wordNum;//总单词数 41 printf("%-10d%-10d%-10d\n", TotalNum[0],wordNum,charNum); 42 //置零,重新统计下一行 43 charNum = 0; 44 wordNum = 0; 45 46 } 47 return TotalNum; 48 }
主函数:
1 int main() 2 { 3 char filename[30]; 4 //TotalNum[0]:总行数 TotalNum[1]:总字符数 TotalNum[2]:总单词数 5 int TotalNum[3] = {0,0,0}; 6 printf("Please input the file name:"); 7 scanf("%s",filename); 8 if(GetCharNum(filename,TotalNum)) 9 { 10 printf("Total:%d lines, %d words, %d chars\n", TotalNum[0],TotalNum[2], TotalNum[1]); 11 } 12 else 13 { 14 printf("Error!\n"); 15 } 16 system("pause"); 17 return 0; 18 }
测试运行:
实际花费的时间: 见上表
项目小结: 本次功能实现不难,主要是之前没有接触过读取文件的函数,在本次项目中花了不少时间学习新的知识。最后在博客和GitHub的使用上也花了不少时间。