编程作业_词频统计

这个作业属于哪个课程 软工-2018级计算机4班
这个作业要求在哪里 202103226-1 编程作业
这个作业的目标 1、锻炼编程能力 2、项目设计规范学习 3、程序设计满足要求
作业正文 README.md
其他参考文献 《构建之法》、 《软件工程》、 参考词语频率统计

❤️、目录

一、码云 项目地址

二、PSP预算表单

三、解题思路描述

四、代码规范的链接

五、设计实现过程

六、计算模块接口部分的性能改进

七、测试设计过程

八、计算模块部分异常处理说明

九、PSP表格

十、心路历程与收获


一、码云 项目地址。

❤️、码云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出现像某个函数的错误导致后面部分的错误,花费大量时间。
如果代码庞大一点,后期就更麻烦了,好在也有专门的测试工具。
posted @ 2021-04-02 19:44  青尘忆梦  阅读(112)  评论(0编辑  收藏  举报