【C++】基于C++的封装和运算符重载的思想,实现基于通讯录类的数据查询工作
2023-09-11 14:20:18 时间
一、实验项目内容
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
* */
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;
}
三、实验结果和截图
相关文章
- 托管C++线程锁实现 c++11线程池
- Unreal新建C++类或C++项目失败
- C/C++中typedef详解与使用示例
- C++中变量使用前必须初始化数值,否则会报错
- c++ (QT)笔记
- 关于C++中vector和set使用sort方法进行排序
- c++TCP socket实时文件传输
- 开源免费的C/C++网络库(c/c++ sockets library)补充
- ios oc 代码 转换为 c++ 描述代码编译过程
- [C/C++]关于C++11中的std::move和std::forward
- 《C++编程风格(修订版)》——3.4 封装
- 《C和C++代码精粹》——1.15 new和delete
- 《C和C++代码精粹》——2.14 封装和不完全类型
- 《C和C++代码精粹》——2.15 小结
- 基于C+++Mysql实现(WinForm)图书管理系统【100010034】
- 实现Android Studio JNI开发C/C++使用__android_log_print输出Log
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- 《c++语言导学》——1.8 指针、数组和引用
- 【C++】类和对象&封装
- 猿创征文|我的C/C++技术成长之路
- 175、【动态规划】leetcode ——718. 最长重复子数组 (C++版本)
- VS Code-CC++环境的搭建
- C++结构变量数据对齐问题
- C/C++ 获取当前时间(最全方法)
- C++中函数调用时的三种参数传递方式详解
- pch”预编译头文件来自编译器的其他版本,或者预编译头为 C++ 而在 C 中使用它(或相反) and vs找不到路径