福大软工1816 · 第二次作业

福大软工1816 · 第二次作业 - 个人项目

Github项目地址:https://github.com/Lineeee217/personal-project

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 30 90
Development 开发 90 100
· Analysis · 需求分析 (包括学习新技术) 90 90
· Design Spec · 生成设计文档 30 40
· Design Review · 设计复审 20 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 40
· Design · 具体设计 50 60
· Coding · 具体编码 200 300
· Code Review · 代码复审 30 40
· Test · 测试(自我测试,修改代码,提交修改) 20 25
Reporting 报告 30 40
· Test Report · 测试报告 20 30
· Size Measurement · 计算工作量 10 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 50
合计 680 850

解题思路描述

1.如何读取txt文件。
	这个问题我上网查找了一下,方法有许多种,读取的方式也有不同,有按行读取和按字符读取。根据题目的情况我选择了按字符读取。
2.如何统计行数,字符数。
    读取文件有按行读取的方式,就用一个循环来按行读取一次,统计每次的字符长度来计算字符数。
3.如何识别出符合要求的单词。
	刚开始只想到通过多层判断的方法。
4.如何选出频率最高的10个单词。
    一想到排序的问题我就决定用优先队列实现,感觉写起来最简单。

设计实现过程

我将不同功能分为3个函数

  • countlines 统计行数

  • countcharacters 统计字符数

  • countwords 统计符合的单词

关键代码

typedef struct {	//创建一个结构体
	char word[50];  //存放该单词
	int no;         //记录该单词出现的次数
	int count;      //记录该单词的字符数
}lie;

判断过程

if (ch >= 65 && ch <= 90)

			{
				ch = ch + 32;//将大写转为小写
			}

			if (ch >= 87 && ch <= 122 && flag <= 3)

			{
				flag++;
				testword[flag] = ch;//满足要求将当前字符存入一个中间字符数组
			}

			if ((ch < 87 || ch>122) && flag <= 3)

			{
				flag = 0;//不符合即清空
			}

			if (flag >= 4 && ch != ' ')

			{
				flag++;
				testword[flag] = ch;//认定为一个合法单词后将其全部存入
			}

求单词频率

for (i = 1; i <= kind; i++)//遍历
				{
					for (j = 1; j <= flag; j++)
					{
						if (testword[j] != realword[i].word[j])
						{
							i++;
							j = 1;
							break;
						}
						if (j == flag)
						{
							realword[i].no++;//同一单词,频数加一
							i = kind;
							sign = 1;
							break;
						}
					}
				}
				if (sign == 0)
				{
					kind++;
					for (int k = 1; k <= flag; k++)
					{
						realword[kind].word[k] = testword[k];//给新单词分配空间

					}					realword[kind].count = flag;
					realword[kind].no++;
		
				}
				flag = 0;
				sign = 0;
			}
		

实现对单词频数进行排序

for (int i = 0; i <kind; i++)
	{
		q.push(realword[i]);//将所有单词存入队列
	}

输出频数最高的10个

while (!tmp.empty() && i<10)
	{
		cout<< "<" << q.top().word << ">: " << q.top().count << endl;
		q.pop();
		i++;
	}

心路历程与收获

第一次写软工的实践作业,对我来说还是比较困难的,在写代码过程中有很多不熟练的地方,也查找了很多类似题目的代码,有很多时候我能理解一些算法的大体思路,但自己写代码是总是遇到各种的问题。写这份作业还是很困难的。不过也学到了一些新的东西。也有一些项目还未完成,还是有很多要学习的地方。
原文地址:https://www.cnblogs.com/q1093797687/p/9637965.html