【C++】基于C++的封装和运算符重载的思想,实现基于通讯录类的数据查询工作
2017-08-17 22:22
561 查看
一、实验项目内容
1、实现通讯录条目类(姓名、性别和电话号码),并为每个属性设置 set和get方法,并实现输入/输出运算符重载功能; 2、从通讯录的文本文件“record.txt”中读取数据放到通讯录条目类实例化的对象中,并合理组织存储结果方便查找。其文件样例如下,文件第一行为通讯录中人员的个数n,从第二行到第n+1行是n个通讯录; 每个通讯录占1行,每行依次为人员姓名、性别和电话号码,每个属性间以空格隔开。 3 张三 男 123456 李四 女 654321 张三 男 654321 3、从文本文件“query.txt”,查询指定列的数据,样例如下,只有1行,第1个数据是指查询的数据在“record.txt”对应的列数,第二个数据是查询的关键词。 1 张三 4、将查询到的结果输出到“result.txt”文件中,根据前面的“record.txt”和“query.txt”的样例,“result.txt”输出样例如下,注意将查到所有 的结果都输出。 张三 男 123456 张三 男 654321
二、实验过程或算法
程序流程图:Member.h:
#ifndef MEMBER_H #define MEMBER_H #include <iostream> #include <string> using namespace std; class Member { //成员remeber相关信息类 private: string name; string gender; string tel; public: Member(); //默认构造函数 Member(string name,string gender,string tel); //构造函数 string getGender(); //Getting and setting string getName(); string getTel(); void setGender(string gender); void setName(string name) ; void setTel(string tel); }; #endif
Member.cpp
#include "Member.h" Member::Member() { //默认构造函数 this->name = "NULL"; this->gender = "NULL"; this->tel = "NULL"; } Member::Member(string name, string gender, string tel) { //构造函数 this->name = name; this->gender = gender; this->tel = tel; } /* * Getting and setting * * e598 / string Member::getGender() { return gender; } string Member::getName() { return name; } string Member::getTel() { return tel; } void Member::setGender(string gender) { this->gender = gender; } void Member::setName(string name) { this->name = name; } void Member::setTel(string tel) { this->tel = tel; }
QueryManger.h:
#ifndef QUERYMANGER_H #define QUERYMANGER_H #include <iostream> #include <string> #include <list> #include <fstream> #include <sstream> #include "Member.h" using namespace std; class QueryManger{ //封装查询类:QueryManger public: QueryManger(list<Member> members,string queryL,string queryInfo); //构造函数 list<Member> getMembers(); //getting void queryNmae(); //查询Name void queryGender(); //查询Gender void queryTel(); //查询Telephone friend ostream& operator<<(ostream& output, const QueryManger& queryManger) ; friend istream& operator>>(istream& input, QueryManger& queryManger) ; private: list<Member> members; //查询对象集合 list<Member>::iterator it; list<Member> queryMembers; //查询结果集合 string queryL; //查询所在列 string queryInfo; //查询的信息 }; #endif
QueryManger.cpp:
#include "QueryManger.h" QueryManger::QueryManger(list<Member> members, string queryL, //构造函数 string queryInfo) { this->members = members; this->queryL = queryL; this->queryInfo = queryInfo; this->queryMembers=getMembers(); } list<Member> QueryManger::getMembers() { //getting查询结果 if (queryL == "1") { queryNmae(); //第一列==Nmae } if (queryL == "2") { //第二列==Gender queryGender(); } if (queryL == "3") { queryTel(); //第三列==Telephone } return queryMembers; } void QueryManger::queryNmae() { //查询Name for (it = members.begin(); it != members.end(); it++) { Member temp = *it; if (temp.getName().compare(queryInfo) == 0) { queryMembers.push_back(temp); } } } void QueryManger::queryGender() { //查询Gender for (it = members.begin(); it != members.end(); it++) { Member temp = *it; if (temp.getGender().compare(queryInfo) == 0) { queryMembers.push_back(temp); } } } void QueryManger::queryTel() { //查询Telephone for (it = members.begin(); it != members.end(); it++) { Member temp = *it; if (temp.getTel().compare(queryInfo) == 0) { queryMembers.push_back(temp); } } } ostream& operator<<(ostream& output, const QueryManger& queryManger){ list<Member> it=queryManger.queryMembers; cout<<"询信息:"<<queryManger.queryL<<" "<<queryManger.queryInfo<<"\n查询结果:"<<endl; ofstream fout("result.txt"); //查询结果写入文件 while(it.size()!=0){ fout<<it.front().getName()<<" "<<it.front().getGender()<<" "<<it.front().getTel()<<endl; output<<it.front().getName()<<" "<<it.front().getGender()<<" "<<it.front().getTel()<<endl; it.pop_front(); } fout.close(); return output; } istream& operator>>(istream& input, QueryManger& queryManger) { Member in; string temp; cout << "Please input name:"; input >> temp; in.setName(temp); cout << "Please input gender:"; input>> temp; in.setGender(temp); cout << "Please input tel:"; input>> temp; in.setTel(temp); queryManger.members.push_back(in); list<Member> it = queryManger.members; ofstream fout("record.txt"); //查询结果写入文件 fout <<it.size()<< endl; while (it.size() != 0) { fout << it.front().getName() << " " << it.front().getGender() << " " << it.front().getTel() << endl; it.pop_front(); } fout.close(); return input; }
测试类:
#include <iostream> #include <list> #include <fstream> #include <sstream> #include "Member.h" #include "QueryManger.h" using namespace std; int main() { cout << "!!!Hello,Welcome!!!" <<"\n记录信息为:"<< endl; // prints !!!Hello World!!! list<Member> members; //被查询对象 list<Member> queryMembers; //查询结果对象 list<Member>::iterator it; string name,gender,tel,queryL,queryInfo; //定义:姓名,性别,电话号码,列,查询信息 int count=0; ifstream inRecord("record.txt"); //被查询的文件 ifstream inQuery("query.txt"); //查询信息 for(string s;getline(inRecord,s);){ if(count==0){ count++; } else { cout << s << endl; //输出对象 istringstream isRecord(s); isRecord >> name >> gender >> tel; Member member(name,gender,tel); members.push_back(member); //遍历,得到被查寻对象 } } for (string s; getline(inQuery, s);) { istringstream isQuery(s); isQuery>> queryL >> queryInfo; //得到查询信息 } QueryManger queryManger(members,queryL,queryInfo); //构造QueryManger // queryMembers=queryManger.getMembers(); //获取查询结果 // cout<<"询信息:"<<queryL<<" "<<queryInfo<<"\n查询结果:"<<endl; cout<<queryManger; //重构输出方式,输出查询结果 // ofstream fout("result.txt"); //查询结果写入文件 // for(it=queryMembers.begin();it!=queryMembers.end();it++){ // // Member temp=*it; // fout<<temp.getName()<<" "<<temp.getGender()<<" "<<temp.getTel()<<endl; // cout<<temp.getName()<<" "<<temp.getGender()<<" "<<temp.getTel()<<endl; // } // // fout.close(); cin>>queryManger; //重构输入方式,写入新的信息 return 0; }
三、实验结果和截图
相关文章推荐
- 数据挖掘-基于机器学习的SNS隐私策略推荐向导分类器的C++及WEKA实现与评估
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- 一种基于简单递归思想的易操控xml解析封装(C++)
- 基于HTML5 Bootstrap搭建的后台模板,分页,模糊查询已经全部JS实现,无需编码,嵌入数据即可开发,内置8款皮肤,欧美风格,非常好用!
- 基于HBase的海量数据实时查询系统设计与实现
- SVM实现多分类的程序基础工作(三)——基于纠错编码的SVM多类分类算法和基于二叉树的多类SVM算法的基本思想
- ObjectARX中调用ADO封装类实现数据库查询读取写入数据的一个类实例
- 基于NX的研发产品设计管理平台实现(十五)-数据查询2
- 数据列表实现方式(基于Vue.js封装)
- 以MyBatis+SpringMVC3.0实现的,借鉴了Hibernate设计思想,采用封装、抽象、继承的设计思想,做到了数据与相应的操作的高内聚低耦合的实现
- 数据挖掘-基于机器学习的SNS隐私策略推荐向导分类器的C++及WEKA实现与评估
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- 基于hadoop MR+berkeley DB实现的十亿级数据的秒级部署和实时查询的解决方案
- 基于JNI技术,实现数据库查询,在C++中MD5匹配后回调至Java层的方案
- 基于Python脚本和聚合数据实现手机号码归属地信息查询
- ObjectARX中调用ADO封装类实现数据库查询读取写入数据的一个类实例
- 基于C++实现kinect+opencv 获取深度及彩色数据
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈