首页 > 其他 > 详细

软件工程实践第二次作业

时间:2018-09-12 22:32:56      阅读:325      评论:0      收藏:0      [点我收藏+]

WordCount

Github项目地址

PSP表格

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

解题思路描述:

      阅读题目的过程中可以发现需要实现功能的主要有以下:
  • 读取文件
  •    int main(int argc,const char* argv[])可从外部向程序传递参数。
      可以实现在命令窗口中(cmd)输入:wordcount.exe intput.txt
      读取文件是可根据需要按行读取或者是按字符读取等等;
      #includefstream>
      ofstream  //文件写操作,从内存写入存储设备
      ifstream  //文件读操作,存储设备读到内存中
      fstream   //读写操作,对打开的文件可进行读写操作
      再根据需要结合getchar()和getline()等等使用;
  • 统计文件的字符数
     字符要求:
    
     只需要统计Ascii码,汉字不需考虑
    
     空格,水平制表符,换行符,均算字符
    思路:将文本扫描一遍,当遇到字符时计数加一。
  • 统计文件的单词总数
       单词要求:
      单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
      英文字母: A-Z,a-z
      字母数字符号:A-Z, a-z,0-9
      分割符:空格,非字母数字符号
      例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
    思路:利用正则表达式,写好该单词的正则式,循环一遍遇到匹配的计数加一
  • 统计文件的有效行数
      有效行数的要求:任何包含非空白字符的行,都需要统计。
    思路:按行读取文件,对每一行进行循环,当遇到既不是空格也不是换行符,水平制表符等时计数加一
  • 统计文件中各单词的出现次数
    要求:最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。

思路:先扫描一遍将大写改成小写,按查询单词数的方法找到匹配的单词 ,放入map,vector,pair等容器相结合;再排序后输出

  • 输出的格式

    按照字典序输出到文件result.txt
    characters: number

    words: number

    lines: number

    ...
    思路:用ofstream将结果写入result.txt
    例如:

    ofstream out("result.txt",ios::in|ios::out);
    out.seekp(0, ios::end);
    out<<"xxxx:"<<xxxx<<endl;

设计实现过程:

在阅读完题目之后,开始查找资料,看需要完成的功能该如何更好的实现。读取文件有不同的方式,
选取一种方式;查找资料,学习使用正则式匹配单词,正则式该怎么书写,怎么写循环进行匹配等;在统计
单词频率高的单词用vector,map容器;将结果写入result.txt文件,
c++编写代码,一个main调用  <字符统计函数> <有效行数统计函数>
<单词统计函数> <统计文件中单词出现次数>将代码剥离开,按要实现的不同功能将代码分成各个模块;

改进的思路:

文件读写用ifstream和ofstream函数比较快;
一开始在匹配单词想用双指针自己写匹配,自己书写该代码,工作量比较大,也比较繁琐,后来发现可以用正则式来匹配,用现成的,来实现单词的匹配更快一些,也比较简便;利用sort()可以很方便的将10个出现频率最高的单词输出;

代码说明:

统计文件的单词数
 #include"wordcount1.h"
 #include<string>
 #include<regex>
 #include<map>
 #include<fstream>
  int words_number(string txt)//统计文件的单词总数
 {
     int count=0;
    map<string, int>m;
    string content;
    ifstream file(txt);
    regex wordtemplate("^[a-zA-Z]{4}[a-zA-Z0-9]*");//要求单词的正则式
while (file >> content)
{

    const std::sregex_token_iterator  end;
    for (sregex_token_iterator wordIter(content.begin(), content.end(), wordtemplate); wordIter != end; wordIter++)
    {
        m[*wordIter]++;//统计每个单词的个数;
    }
    
}
map<string, int>::const_iterator pp;

for (pp = m.begin(); pp != m.end(); pp++)
{
    count=count+pp->second;
}

file.clear();
file.seekg(0);
return count;


 }

统计出现频率最高的10个单词

 #include"frequent_words_count.h"
 #include <string>
 #include<map>
 #include<vector>
 #include<regex>
 #include<fstream>




 bool wordsort(pair<string, int>k1, pair<string, int> k2)
 {
   return k1.second > k2.second;
 }
 void frequent_words(string txt)//求出频繁出现的十个单词
 {
    unsigned int i;
    map<string, int>m;
    string content, add;
    ifstream file(txt);
    regex wordtemplate("^[a-zA-Z]{4}[a-zA-Z0-9]*");//要求单词的正则式
    while (file >> content)
    {
        for (i = 0; i < content.length(); i++)//将大写换成小写
        {
            if (‘A‘ <= content[i] && content[i] <= ‘Z‘)
            {
                content[i] = content[i] + 32;
            }
        const std::sregex_token_iterator  end;
        for (sregex_token_iterator wordIter(content.begin(), content.end(), wordtemplate); wordIter != end; wordIter++)
        {
            m[*wordIter]++;//统计每个单词的个数;
        }
    }
    file.clear();
    file.seekg(0);
    vector <pair<string, int>> v;
    for (map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)
    {
        v.push_back(pair<string, int>(iter->first, iter->second));
    }
    sort(v.begin(), v.end(), wordsort);
    int length = 10;
    if (v.size() < 10)
    {
        length = v.size();
    }
    vector<pair<string, int>>::iterator mm;
    ofstream out("result.txt", ios::in | ios::out);
    for (mm = v.begin(); mm != v.begin() + length; mm++)
    {
        out.seekp(0, ios::end);
        out << "<" << mm->first << ">" << mm->second << endl;
    }
    out.clear();

 }

小结

从这次实践中,学习到在写一个项目时,从开始时间规划,需求分析,代码设计,代码书写,测试数据,总结,知道了一个项目的完成是分成那些步骤,而不是像以前写代码,从一开始阅读题目后,没有设计就直接开始编写代码,以前的作业题目相对比较简单,可以这样草草的编写,若如是开发一个大项目,没有以上的步骤,只会加大自己的工作 量,也可能做不出结果;
代码要学会很模块,可以方便以后需要相同功能时可以直接使用。

软件工程实践第二次作业

原文:https://www.cnblogs.com/bingaa/p/9637677.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!