一.Github 网址:https://github.com/FZU1816K/personal-project/tree/ae221aac3ea33add2c3db0a6b12637937ab1e95a/Cplusplus/031602312
二.PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 200 | 300 |
Development | 开发 | 20 | 20 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 10 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 20 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 50 | 60 |
· Coding | · 具体编码 | 60 | 60 |
· Code Review | · 代码复审 | 10 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 20 | 30 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
| | 合计 |570 |640
三.解题思路:
对于统计文件的字符个数,单词个数,我的想法是使用getline函数每行读入,对每一行的字符进行单词统计和字符统计。封装接口方面,我打算把实现过程写在函数里实现接口的封装。
四.设计实验过程:
函数 | 功能 |
---|---|
int count_character(string s) | 计算字符数 |
int count_word(string s) | 计算单词数 |
void sort_wordcount() | 单词按词频排序
五.
六.代码说明.
#include"stdafx.h"
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<unordered_map>
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
string s;
int character, word, line;
unordered_map<string, int>mp;
vector<pair<int, string> >v;
bool cmp(pair<int, string> a, pair<int, string> b);//单词按词频排序的函数
int count_character(string s);//计算字符数
int count_word(string s);//计算单词数
void sort_wordcount();//单词按词频排序
int main(int argc, char *argv[])
{
ifstream file1;//读入文件
file1.open(argv[1]);
if (!file1.is_open()) {
cout << "文件打开失败";//异常处理
return 0;
}
character = 0;//初始化
word = 0;
line = 0;
mp.clear();
while (getline(file1, s))//按行读入
{
if (s.empty()) continue;;
line++;
character += count_character(s);
word += count_word(s);
}
cout << "characters: " << character << endl;
cout << "words: " << word << endl;
cout << "lines: " << line << endl;
sort_wordcount();
for (int i = 0; i < 10 && i < v.size(); i++)
{
cout << "<" << v[i].second << ">: " << v[i].first << endl;
}
return 0;
}
bool cmp(pair<int, string> a, pair<int, string> b)
{
if (a.first != b.first)return a.first > b.first;//优先考虑词频,词频相同考虑字典序
else return a.second < b.second;
}
int count_character(string s)
{
return(s.length());//字符个数就是单词长度1
}
bool iszimu(char c)//判断是否是字母
{
if (c >= 'a'&&c <= 'z') return true;
else if (c >= 'A'&&c <= 'Z') return true;
else return false;
}
int count_word(string s)
{
string word = "";
int len = s.length(), cnt = 0;
for (int i = 0; i < len; i++)
{
if (s[i]==' '||!isdigit(s[i])&&!iszimu(s[i])||i==len-1)//遇到分隔符
{
if (word.length() >= 4 && word[0] != ' ' && !isdigit(word[0]) && !isdigit(word[1]) && !isdigit(word[2]) && !isdigit(word[3]))//判断是否可以成为单词
{
mp[word]++;
cnt++;
}
word = "";
}
else if (isdigit(s[i])) word += s[i];//遇到数字直接加入单词
else
{
if (s[i] < 'a') s[i] += 32;//遇到大写转化成小写
word += s[i];
}
}
return cnt;
}
void sort_wordcount()
{
unordered_map<string, int>::iterator it;
v.clear();
for (it = mp.begin(); it != mp.end(); it++)
{
v.push_back(make_pair(it->second, it->first));
}
sort(v.begin(), v.end(), cmp);
}
七.心路历程:
这次写代码对我来说可真的是非常大的挑战,我花费的时间远比我预想中的多得多,我得学会使用Github,光会写实现代码远远不够,得学会封装接口,学会vs的使用和项目的创建。对于刚刚使用vs的我来说,真的是一个非常大的挑战。这次项目也让我感觉到自己认识的计算机世界实在太小了,我以前就是写写代码,对项目并没有什么概念,现在我知道了项目是比代码难度更大代码量更大的。而且,我还必须照顾代码格式。总的来说,这次项目对我真的是很大的挑战,出了会写代码,其他对于我来说基本是从0开始,相信过了一段时间,我会越来越熟悉项目的创建还有vs github的使用,希望有一天我会喜欢上软工。