福大软工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++;
}
心路历程与收获
第一次写软工的实践作业,对我来说还是比较困难的,在写代码过程中有很多不熟练的地方,也查找了很多类似题目的代码,有很多时候我能理解一些算法的大体思路,但自己写代码是总是遇到各种的问题。写这份作业还是很困难的。不过也学到了一些新的东西。也有一些项目还未完成,还是有很多要学习的地方。