考后总结:
- 凡是open文件必检查是否打开,必close文件
- 关于sort函数中的布尔型函数cmp:sort是严格弱序排列,即cmp在=时应该返回false,不然会断言错
- 统计时用map,捯饬一个存pair结构的数据的vector再sort(map不可以sort),挺麻烦的。如果自己写个排序函数,也嫌麻烦,不妨一开始就用数组搞桶排序。
- 一个独立的功能尽量用函数实现,并且尽可能减少代码冗余
考试原卷文档:
面向对象与C++程序设计
第1次考试试卷
2020年4月23日
题目说明:
请各位考生从老师处获取数据文件info.txt,然后将该数据文件手动保存在D盘根目录下。该文件中以文本形式存储若干个英文单词,单词与单词之间用空格分开。单词中可能包括大小写字母和其余符号(所有的字符一定是合法的ASCII字符,不存在中文字符)。
请按要求依次完成如下操作:
1、 编写一个函数readInfo。读取info.txt文件中的所有单词,并将它们存放在string类型的words向量中。
2、 编写一个函数delInfo,将words向量中长度大于8或小于3的单词删除。
3、 编写一个重载函数delInfo,用于从words向量中删除包含指定字符的元素。
4、 编写一个函数showInfo显示第2步中得到的words向量的前10个单词,如果不足10个单词则全部显示,显示时每个单词占10列,右对齐。如果调用showInfo时不传递第2个参数则每输出5个单词换一行,否则由传入的第2个参数控制换行的数量。
5、 编写一个函数filterInfo,从words中筛选出包含大小写字母以外字符的单词并构成向量,最后返回该向量。
6、 编写一个函数sortInfo,对第4步得到的向量进行排序,排序规则如下: 首先按照单词长度从小到大排序;
长度相等时,按照ASCII值从小到大排序。 长度相等按照ASCII值从小到大排序时,如果是英文字母符号不区分字母大小写。
例如"hut."和"Roy."长度都是4,需要按照字典序排序,虽然’R’的ASCII小于’h’,但不区分大小写时’R’应该排在’h’的后面,因此"hut."排在"Roy."的前面。
7、 编写一个函数writeInfo,将排序后的结果写入到D盘的文本文件result.txt中,单词与单词之间用空格分开,每10个单词换一行。
8、 编写一个函数getTopmostChar,找出第5步得到向量中出现次数最多的字符,如果存在多个最多,请返回ASCII码值最小的字符。
main函数如下:
int main()
{
vector<string> words;
vector<string> specialWords;
if (readInfo("d:\\info.txt", words) == -1)
{
cout << "打开d:\\info.txt文件失败" << endl;
}
else
{
cout << "读取到" << words.size() << "个单词" << endl;
}
cout << "删除了长度大于8和小于3的单词" << delInfo(words) << "个" << endl;
cout << "删除了包含字符','的单词" << delInfo(words,',') << "个" << endl;
cout << "删除后的前10个单词是:\n";
showInfo(words, 6);
specialWords = filterInfo(words);
cout << "\n筛选出"<< specialWords.size()<<"个单词,前10个单词是:"<<endl;
showInfo(specialWords);
sortInfo(specialWords);
cout << "\n排序后的前10个单词是:\n";
showInfo(specialWords);
writeInfo("d:\\result.txt", specialWords);
char ch = getTopmostChar(specialWords);
cout << "\nspecialWords中出现次数最多的字符是" << ch << endl;
return 0;
}
标准答案:
代码:
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>
#include<iomanip>
#include <algorithm>
#include<ctype.h>
#include<map>
using namespace std;
//编写一个函数readInfo。读取info.txt文件中的所有单词,并将它们存放在string类型的words向量中。
int readInfo(string address, vector<