WordCount
PSP表格:
解题思路描述:
由于程序要求从命令行读入文件,所以需要c++输入输出流的知识,题目要求得到文件的字符数,我是逐个字符累计,对于求文件行数,文件单词数,所以我采取按行读取文件的字符串,每一行再分别统计单词数的方法。重点就在于文件流的操作和对字符串的操作。我通过网络和书本了解到了相关资料。
设计实现过程
从命令行读入文件,用ifstream类读取文件信息,用ofstream类写入文件。对于得到的字符串,用到了vector类,能方便的储存字符串数组及其相关信息,题目的关键是分割字符串,提取其中的单词,我用到split()方法,但c++标准库中没有这个方法,需要自己实现。将单词的信息,存放在结构体数组中,再进行排序,即可得到结果。每个功能模块都独立为一个函数,每实现一个模块,就用单元测试对其测试。
改进的思路
一开始用同结构体数组保存单词的数据,发现静态的数组面对大文本时,程序会崩溃,所以改用vector,动态保存单词数据。
vector的排序直接用了自带的快速排序,效率比冒泡排序高。
代码说明
//对字符串用指定的分隔符分割
vector<string> split(const string &s, const string &t) {//s为待处理的字符串,t中存放分隔符
vector<string> result;//存放产生的字符串数组
typedef string::size_type string_size;
string_size i = 0;
while (i != s.size()) {
//找到字符串中首个不等于分隔符的字母;
int flag = 0;
while (i != s.size() && flag == 0) {
flag = 1;
for (string_size x = 0; x <t.size(); ++x)
if (s[i] == t[x]) {
++i;
flag = 0;
break;
}
}
//找到又一个分隔符,将两个分隔符之间的字符串取出;
flag = 0;
string_size j = i;
while (j != s.size() && flag == 0) {
for (string_size x = 0; x < t.size(); ++x)
if (s[j] == t[x]) {
flag = 1;
break;
}
if (flag == 0)
++j;
}
if (i != j) {
result.push_back(s.substr(i, j - i));
i = j;
}
}
return result;
}
收获
通过第一次的实践,我发现我的c++基础太薄弱了,一些文件流的知识很生疏,知识的拓展也不够,一些很好的头文件不会使用,好多次代码做到后面,发现前面的功能模块实现有问题,思路比较乱,做一个项目感觉与以往的作业有很大不同之处,不仅要考虑到算法的实现,能得到正确答案,一些模块的独立性或代码排版布局规划也需要重视。但是,通过这次实践,我也学到了很多,比如单元测试和性能测试的方法。通过查找资料也了解到了c++一些方便的数据结构。总之,这是一次很有意义的实践作业。