zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【C++】基于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;
}

三、实验结果和截图

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述