zoukankan      html  css  js  c++  java
  • 福大软工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++;
    	}
    

    心路历程与收获

    第一次写软工的实践作业,对我来说还是比较困难的,在写代码过程中有很多不熟练的地方,也查找了很多类似题目的代码,有很多时候我能理解一些算法的大体思路,但自己写代码是总是遇到各种的问题。写这份作业还是很困难的。不过也学到了一些新的东西。也有一些项目还未完成,还是有很多要学习的地方。
  • 相关阅读:
    设计算法,求AB两个整数集合的交集
    C++函数传递指针面试题
    C++构造函数、析构函数与抛出异常
    c++ 虚函数表解析
    c++ 对象的内存布局
    09 构造函数能调用虚函数吗?
    C++构造函数初始化顺序
    计数排序,基数排序和桶排序
    80 求论坛在线人数
    79 两个整数集合A和B,求其交集
  • 原文地址:https://www.cnblogs.com/q1093797687/p/9637965.html
Copyright © 2011-2022 走看看