编程作业_词频统计
这个作业属于哪个课程 | 软工-2018级计算机4班 |
---|---|
这个作业要求在哪里 | 202103226-1 编程作业 |
这个作业的目标 | 1、锻炼编程能力 2、项目设计规范学习 3、程序设计满足要求 |
作业正文 | README.md |
其他参考文献 | 《构建之法》、 《软件工程》、 参考词语频率统计 |
❤️、目录
一、码云 项目地址。
❤️、码云fork仓库链接
二、PSP预算表单
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 960 | |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 100 | |
• Design Spec | • 生成设计文档 | 60 | |
• Design Review | • 设计复审 | 30 | |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | |
• Design | • 具体设计 | 100 | |
• Coding | • 具体编码 | 240 | |
• Code Review | • 代码复审 | 120 | |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | |
• Size Measurement | • 计算工作量 | ||
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | |
合计 |
三、解题思路描述
看到题目,对题意有点模糊,所以在csdn上搜索了一些文档,渐渐理清思路。
- 浏览题目后,就决定用C语言去做这个项目,因为自己学习的高级语言只有C和Java,对于C语言的话更有把握一些。
- 在开始着手做这个项目时,我先通过网上资源得知这个项目的关键知识点是对文件的操作,如fgetc和fgets函数,于是就花了一些时间在文件操作的学习上。
- 在学习完相关文件操作后,就开始进行相关模块的开发,之后再汇总成一个大模块。
- 模块总可分为:文件单词数、文件字符数、语句行数以及出现频率超过10的单词,核心是处理得到想要的结果
四、代码规范的链接
❤️、codestyle.md
五、设计实现过程
1、字符数的计算实现
if( !strcmp(argv[1],"-c") ) { //字符数
char temp;
int num = 0;
temp = fgetc(fp);
while( temp != EOF ) {
//putchar(temp);
temp = fgetc(fp);
num++;
}
printf("该文本文件的字符数为:%d\n",num);
}
2、统计单词数量
else if( !strcmp(argv[1],"-w") ) { //单词数
int w = 0;
char a = fgetc(fp);
while( a != EOF) {
if( (a >='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9') ) {
while( (a >='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9') )
a =fgetc(fp);
w++;
a =fgetc(fp);
} else
a =fgetc(fp);
}
printf("该文本文件的单词数为:%d\n",w);
}
3、统计行数,句子数量
else if( !strcmp(argv[1],"-l") ) { //行数
char temp;
int num = 1;
temp = fgetc(fp);
while( temp != EOF ) {
//putchar(temp);
if(temp == '\n') { //字符需要用单引号扩住
num++;
}
temp = fgetc(fp);
}
printf("该文本文件的行数为:%d\n",num);
}
4、统计单词重复最高的10个,并依次输出
else if( !strcmp(argv[1],"-f") ) { //频率
char tmp[1000];
Str words[10000]; //单词数量
int num=0;//实际单词数量
int i,j,neww=1;//neww标志位,判断是否为新单词
fp = fopen(argv[2],"r");
//fscanf从文件中获取单个字符串
while ( fscanf(fp,"%s",tmp)!=EOF ) {
neww=1;
for (i=0; i<num; i++) {
//重复的单词
if ( strcmp(tmp, words[i].str)==0 ) {
neww=0;
words[i].cnt++;
}
}
if (neww) {
// 复制字符串
for (j=0; tmp[j]!='\0'; j++) {
words[num].str[j] = tmp[j];
}
//单词末尾添加结束符
words[num].str[j] = '\0';
// 新单词数量+1
words[num++].cnt = 1;
}
}
printf("一共%d个不同的单词,10个最高频率单词出现如下:\n",num);
for (i=num-1; i>=0; i--) {
if(words[i].cnt >= 10 ) {
//fprintf(fp1,"%-10s %-4d\n", words[i].str, words[i].cnt);
printf("%-10s %-4d\n", words[i].str, words[i].cnt);
}
}
}
六、计算模块接口部分的性能改进。
-
测试的时候可以通过输入"-w,-c,-l,-f"来实现自己想要的功能
-
测试时主要考虑了
1)框架逻辑的正确性。
2)各个模块是否能正确衔接得到最终结果。
七、测试设计过程。
1、将代码工程放在电脑的D盘
2、用cmd命令进入project-c\20188521\src
3、src文件夹内部内容
4、“test.txt”是用于统计的目标文件,“结果.txt”是用于接收程序返回结果的文件
5、测试程序
6、字符数统计测试
7、单词数统计测试
8、行数统计测试
9、单词重复超过10的统计测试
10、总览
八、计算模块部分异常处理说明。
- 开始的时候在处理单词,提取,指针分别存储时,位于最后的符号前的单词,会携带标点符号一起计算长度与字符,之后上网查看类似设计,借鉴修改了过来。
九、PSP表格。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 960 | 3000+ |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 100 | 400 |
• Design Spec | • 生成设计文档 | 60 | 90 |
• Design Review | • 设计复审 | 30 | 40 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 30 |
• Design | • 具体设计 | 100 | 200 |
• Coding | • 具体编码 | 240 | 600 |
• Code Review | • 代码复审 | 120 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 480 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | 90 |
• Size Measurement | • 计算工作量 | ||
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 810 | 1990 |
十、心路历程与收获。
写代码之前的详细设计要有,七分文档三分代码,没有充分的计划,逻辑结构没有建立就直接写代码,反而会事倍功半。
不会的就查,不懂得就实践,
测试很重要。既能帮你检测错误,非常规错误,也能让自己更好理清思路,逻辑设计与文档想和。
这一周都经常熬夜,都是因为发现一些bug出现像某个函数的错误导致后面部分的错误,花费大量时间。
如果代码庞大一点,后期就更麻烦了,好在也有专门的测试工具。