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是同一个单词
思路:利用正则表达式,写好该单词的正则式,循环一遍遇到匹配的计数加一 有效行数的要求:任何包含非空白字符的行,都需要统计。
思路:按行读取文件,对每一行进行循环,当遇到既不是空格也不是换行符,水平制表符等时计数加一思路:先扫描一遍将大写改成小写,按查询单词数的方法找到匹配的单词 ,放入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