第一次作业
要求0 作业要求:
【https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110】
要求一
git地址:【https://git.coding.net/hanyh343/wf.git】
要求二
psp阶段表格
任务 |
预计花费时间 (分钟) |
实际花费时间 (分钟) |
储备知识,查询资料 |
180 |
220 |
编写、测试功能一 文件读取 程序编写 统计单词数量及输出 |
30 5 20 5 |
60 10 45 5 |
编写、测试功能二 在功能一的基础上修改需求 测试功能二,并修改错误 |
55 30 25 |
100 60 40 |
编写、测试功能三 需求分析及修改 测试功能三 |
25 15 10 |
45 25 20 |
分析预计时间与实际时间差距:
- 没有考虑到自己的技术在实际操作中会遇到一些棘手的问题,比如一些bug的修改
- 主要还是对C++、C#、java的掌握的不熟练,特别是一些函数、包的运用,有些函数不
常用,所以运用起来不是很熟练
- 没有把作业要求理解透彻,学好语文很重要
要求三:
1.解题思路描述
首先看到这个作业的时候我的脑子是毫无头绪的,需要花费时间缕清思路。然后我在博客上看了一些关于coding.net及git的使用方法,之前未曾接触过,git的使用、仓库的建立等理解起来有些困难,同时也在图书馆借阅了一些C++等编程语言用书,大一的时候虽然接触过,但印象并不是很深。而且也不太清楚本地和远程仓库的关系,代码应该在哪里编写及修改,后来看了一些资料和问比较清楚的同学才有了一些头绪,而且作业涉及到文件,基础薄弱的我感觉会很难编写。虽然看了一些关于文件的基础知识,但是实际完成一个任务还是很困难的,本来以为三个功能是有关联的,实现一个其他几个也就很容易了,低估了它的难度,高估了我的智商。
参考博文地址:【http://www.cnblogs.com/life-for-test/p/6284041.html】
2.重点代码展示
文本的读入通常使用fopen、fread、fclose内置函数接口,但是读入的文本需要存储在字符串数组中。另外C++标准库实际上有定义类似流输入输出iostream库类似的文本流读入操作。fstream头文件中有定义文本流操作的类。我们只需要实例化一个fstream类对象,通过类对象完成复杂的文本处理工作,并且获取文本可以保存在string字符串类对象中。
#include<fstream> #include<string> string strFile, tmp; ifstream file("wf.txt"); //读取当前文件夹下wf.txt文件 while(getline(file, strFile))//直到文件结尾,依次逐行读入文本 { strFile.append(tmp); //每次读入一行附加到strFile结尾 tmp.clear(); //记得清除,否则上一次读入比这次文本长,不会完全覆盖而出错 }
2.排除符号位影响,将整个文件的符号位都去掉或者替换成空格。判断哪个字符是否是符号位,主要借助了标准库cctype中的ispunct()函数接口,如果某个字符是符号位(‘,’,’.’ ,’!’等等)就返回True。
#include<cctype> #include<string> for (int i = 0; i<strFile.length(); i++) { if (ispunct(strFile[i])) strFile[i] = ' '; //符号位替换成为空格 }
3.当一大串文本句子存储在了string对象中,处理单词就需要借助字符串流处理的功能。类似cin和cout,因为经过符号位去除操作后,所有单词是相互空格隔开的,只需要遇到空格读入一个单词即可。sstream头文件定义的stringstream类可以依次流操作读出或者读入一个单词,直到句子结束。
#include<sstream> stringstream ss(strFile); //先将文本句子载入流中,类似控制端键盘输入一段话 string strTmp; while (ss >> strTmp) //依次从流中读入每个单词 { //### 每个word处理程序处 }
4.单词的统计是我们程序的重点,此处使用的方法是关联容器由于基于哈希表的unordered_map查询和插入的时间复杂度是常数级,比基于红黑树的map对数级还要快,所以这里使用键值对记录的unordered_map数据结构。其中键对应单词string,值对应出现的频率int。
#include<string> #include<iterator> #include<unordered_map> using namespace std; unordered_map<string, int> strMap; //保存的结果 void countWord(stringstream &ss) { //依次读入单词 string strTmp; while (ss >> strTmp) { unordered_map<string, int>::iterator it = strMap.find(strTmp); if (it == strMap.end()) //strMap中如果不存在当前单词则插入一个新键值对,出现频率为1 { strMap.insert(unordered_map<string, int>::value_type(strTmp, 1)); } else //如果存在则出现频率+1 strMap[strTmp]++; } }
#include<iostream> #include<sstream> #include<fstream> #include<string> #include<iterator> #include<cctype> #include<unordered_map> using namespace std; unordered_map<string, int> strMap; //保存的结果 /***从字符串流中依次读入单词记录出现频率***/ void countWord(stringstream &ss) { //依次读入单词 string strTmp; while (ss >> strTmp) { unordered_map<string, int>::iterator it = strMap.find(strTmp); if (it == strMap.end()) { strMap.insert(unordered_map<string, int>::value_type(strTmp, 1)); } else strMap[strTmp]++; } } int main() { //读入文档 string strFile, tmp; fstream file("wf.txt"); while(getline(file, strFile)) //!file.eof() { strFile.append(tmp); tmp.clear(); } //去除符号 for (int i = 0; i<strFile.length(); i++) { if (ispunct(strFile[i])) strFile[i] = ' '; } //统计字符 stringstream ss(strFile); countWord(ss); //打印结果 unordered_map<string,int>::const_iterator it; for (it = strMap.begin(); it != strMap.end(); ++it) cout << it->first << "=" << it->second << endl; cout << endl; return 0; }
收获
整个作业下来就是自己的基础太差,重点代码还是靠网络搜索,掌握一门语言靠几个小时几天是远远不够的,查阅几个小时的资料只能懂这个知识点的浅层意思,自己练的代码量太少,缺乏锻炼,通过这次作业明白技术流也是要靠持之以恒的训练出来的,以后会更加努力的鸭,加油鸭!