个人项目WordCount
1.Github项目地址:https://github.com/fangxiao-99/WordCount
2.解体思路:
开始拿到题目后,先思考这个题目设计的程序类似于之前写过的图书管理系统中,对于文本文件的读取,因其他语言不熟,所以选用C,可以实现对文件文件的字符数、单词数、行数的统计功能。在网络上搜索关于c的对于文件操作的函数,进行学习使用
3.设计实现过程:
代码应有四个,主函数和三个实现统计功能的函数,在主函数中调用三个功能函数实现基本功能
主函数:调用功能函数实现功能
统计字符数函数:打开文件后,用while循环调用fgetc函数直至文件结尾,对出现的字符数统计自加
统计单词数函数:打开文件后,用while循环调用fgetc函数直至文件结尾,当统计的字符出现字母时,单词数+1
统计行数函数:打开文件后,用while循环调用fgetc函数直至文件结尾,当统计的字符出现换行符号”\n“时,行数+1,注意的是行数应从1开始算起
4.代码说明:
(1)主函数:
#include <stdio.h> #include <stdlib.h> int flag; //判断文件是否为空 void x1(char address[]); void x2(char address[]); void x3(char address[]); int main() { char address[100]; //文件地址 while(1) { printf("请输入你要查找的文件的地址:\n"); scanf("%s",address); x1(address); //统计字符数 x2(address); //统计单词数 x3(address); //统计行数 } }
(2)统计字符数函数:
void x1(char address[]) //计算字符数函数 { int Charnum = 0; FILE *fp = NULL; if((fp = fopen(address,"r")) == NULL) //判空 { printf("打开文件失败\n"); exit(-1); } char x = NULL; x = fgetc(fp); while(x != EOF) { x = fgetc(fp); Charnum++; } if(Charnum == 0) //如果该文件字符数为0,则置flag为0,表示该文件为空文件 { flag = 0; } else { flag = 1; } printf("该文件的字符数为%d\n", Charnum); }
(3)统计单词数函数:
void x2(char address[]) //计算单词数函数 { int Wordnum = 0; FILE *fp = NULL; if((fp = fopen(address,"r")) == NULL) //判空 { printf("打开文件失败\n"); exit(-1); } char x = NULL; x = fgetc(fp); int word = 0; //统计单词数的标志 while(x != EOF) { if(!(x >= 'A' && x <= 'Z'|| x >= 'a' && x <= 'z')) //当字符为非字母时 { word = 0; //置单词标志为0 } else if((word == 0) && (x >= 'A' && x <= 'Z'|| x >= 'a' && x <= 'z')) //当字符为字母时 { word = 1; //置单词标志为1,表示字符串为一个单词 Wordnum++; } x = fgetc(fp); } printf("该文件的单词数为%d\n", Wordnum); }
(4)统计行数函数:
void x3(char address[]) //计算行数函数 { int Linenum = 0; FILE *fp = NULL; if((fp = fopen(address,"r")) == NULL) { printf("打开文件失败\n"); exit(-1); } char x = NULL; x = fgetc(fp); while(x != EOF) { if(x == '\n') //x为转行符号时 { Linenum++; } x = fgetc(fp); } Linenum++; //行数+1 if(flag == 0) //当文件为空,行数为0 { Linenum = 0; } printf("该文件的行数为%d\n", Linenum); }
说明:在字符数函数中应判断文件是否为空,通过计算字符数函数中字符数是否为0来判断,若是空文件则在行数统计中置行数为0,行数不能自加一
5.测试运行:
(1)空文件:
(2)一个字符的文件:
(3)一个单词的文件:
(4)只有一行的文件:
(5)典型的源文件:
6.PSP表格:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
30 |
· Estimate |
· 估计这个任务需要多少时间 |
300 |
400 |
Development |
开发 |
120 |
150 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
10 |
· Design Spec |
· 生成设计文档 |
5 |
5 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
15 |
10 |
· Design |
· 具体设计 |
30 |
30 |
· Coding |
· 具体编码 |
40 |
45 |
· Code Review |
· 代码复审 |
20 |
25 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
5 |
10 |
Reporting |
报告 |
10 |
5 |
· Test Report |
· 测试报告 |
0 |
0 |
· Size Measurement |
· 计算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
15 |
15 |
合计 |
|
615 |
740 |
7.项目小结:
1.第一次使用github和博客园,进行一次个人项目的设计,在学习使用github这里花费较多的时间,但也在github收获很多宝贵的资源
2.对其他语言还不熟悉,只能用c,在开发时感觉到不是那么的方便,而且有些扩展功能和高级功能没有完成,鉴于时间先上交作业,课后要自己去研究这些功能怎么写
3.初试程序时没有考虑到空文件的情况,后面发现需要判断空文件,利用全局变量可以在分函数里套用使用,就不需要太大的改动
4.自身的理论知识储备不足,在写代码时感觉是边学习边写,而且时间规划不明确,在理论知识的实践应用上也不熟手,需要加强自己的代码能力