博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
福大软工1816 · 第二次作业
阅读量:5100 次
发布时间:2019-06-13

本文共 3165 字,大约阅读时间需要 10 分钟。

一、Fork的同名仓库的Github项目地址

二、PSP表格

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

三、解题思路描述

1.文本读入功能:在项目文件夹下创建的文本,利用fopen函数来读取文件。
2.字符统计功能:用fgetc来遍历文本,统计字符数。
3.行数统计功能:当有出现\n和用fgetc来遍历完文本时,行数+1。
4.单词统计功能:用一个ch=fgetc(fp)来记录当前的字符,并且用word=word+ch组成一个个单词,当单词的长度大于4的时候接着做一个循环来判断前四个字符必须为字母。
5.频率排序功能:把map赋值给vec,用写好的两个结构体用对vec进行字典顺序的排序和频率的排序(我先进行了字典顺序的排序再进行频率的排序,后来发现字典顺序的排序有问题但来不及改了)。
6.文本写入功能:通过fopen,fwrite自动创建一个result文本,并将需要的功能写入result文本。

四、设计实现过程

*gets():用于读取test.txt文件

  • 在while((ch=fgetc(fp))!=EOF) 循环中统计单词数行数,并进行大写转小写,并把单词和出现次数统计到map中
  • sort():用于排序前十词频数

    1476137-20180912201908121-754756037.png

    五、代码测试

  • 读取的文本与程序放在同个文件夹
    1476137-20180912202039948-593445707.png
    1476137-20180912202101999-363300450.png
  • 代码执行后创建result文本

    1476137-20180912202147741-1228824542.png
    1476137-20180912202204532-962488553.png

    六、性能分析

    1476137-20180912202532365-510305635.png

    1476137-20180912202555942-506140347.png
    消耗最大的函数
    1476137-20180912202618154-1119202529.png

    七、代码

    1.读取文件
FILE *fp;    gets_s(filename);        errno_t err;    err = fopen_s(&fp, filename, "r");
2.统计字符数,判断能否构成单词,统计单词数,统计行数,大小写转换
while (!feof(fp))fgetc(fp) && num++;//统计字符数    rewind(fp);//重新开始读取文件    while ((ch = fgetc(fp)) != EOF)//当ch不是最后一个字符时开始进入循环    {        if ((ch >= 48 && ch <= 57) || (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122))            word = word + ch;//当字符是数字或者字母时,用word拼在一起        else        {            if (word.length() >= 4)            {                for (i = 0; i < 4; i++)                    if (!(((word[i] >= 65) && (word[i] <= 90)) || ((word[i] >= 97) && (word[i] <= 122))))                        break;//判断前四个为字母                 if (i >= 4)                {                    for (j = 0; j < word.length(); j++)                        if (word[j] >= 65 && word[j] <= 90)                            word[j] = word[j] + 32;//大写字母转换成小写字母                    wordcount++;//行数+1                    it = m.find(word);                    if (it == m.end())                        m.insert(pair
(word, 1));//当单词没出现在map中时,记录进去 else it->second++;//单词出现过时,value值+1 } } word.erase();//清空word if (ch == '\n') linecount++;//换行时,行数+1 } } linecount++;//结束时,行数+1
3.单词出现的频率排序
typedef pair
PAIR;struct cmp{ bool operator()(const PAIR& lhs, const PAIR& rhs) { return lhs.second < rhs.second; }};//用于排序频次struct comp{ bool operator()(const PAIR& lhs, const PAIR& rhs) { return lhs.first > rhs.first; }};//用于排序字典顺序 vector
vec(m.begin(), m.end());//把map赋值给vector sort(vec.begin(), vec.end(), comp());//字典顺序排序 sort(vec.begin(), vec.end(), cmp());//频次排序
3.写入文件
FILE *fp2;    errno_t err2;    err2 = fopen_s(&fp2, "result.txt", "w");    fwrite(res_c, res.length(), 1, fp2);

八、异常处理

有把输出的字符开的太小了导致输出文件时出现乱码,一开始把代码写在dev,然后复制到vs中,也出现了挺多的问题。还有各种各样的问题。

九、总结

在这次作业中,花在写代码的时间上有很多,通过网上搜索学到了很多之前没接触过的函数,初步了解了如何对这些函数的应用,也花了很多时间去尝试这些函数的用法。虽然花了很多时间但是很值得。

转载于:https://www.cnblogs.com/ykxx/p/9637979.html

你可能感兴趣的文章
判断对象类型 type()
查看>>
Php函数之end
查看>>
腾讯AB题
查看>>
C# 实现冒泡算法--不一定效率,但很容易理解
查看>>
如何开发AR增强现实应用与产品
查看>>
C++中遍历lua table
查看>>
Python 编程快速上手 第 7章 模式匹配与正则表达式
查看>>
深度解析vuex
查看>>
Android开发之基于监听的事件处理
查看>>
1600802010韩璐——大作业界面
查看>>
CodeVS 1226 倒水问题【DFS/BFS】
查看>>
ROR 第一章 从零到部署--安装环境
查看>>
Validate a sudo puzzle
查看>>
bzoj1044 [HAOI2008]木棍分割——前缀和优化DP
查看>>
使用 Override 和 New 关键字进行版本控制
查看>>
安装Ubuntu的那些事儿
查看>>
Safari导入书签
查看>>
HTML列表
查看>>
c#FTP应用---windows iis
查看>>
linux下调整java版本
查看>>