c++写的通讯录 (2.0)

本文档介绍了使用C++编程语言开发的一款通讯录软件,详细阐述了其实现原理和功能,包括联系人添加、查询、修改和删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
这次终于真切体会到c++封装的利与弊了
150行的程序被改到了300行,汗。。。
这次修改添加了分组功能
添加了对输入合法性的检查
去掉了修改功能,因为目前只做到,等同于删除后再新建
去掉了map,因为用了vector,下标在不断变化,不用map后,
省掉了不停维护下标这一步骤。当然搜索就直接暴力了
这次添加了Group类,adresslist类和Menu类,整个程序还是有一些模块化了
未完成的功能:
1.名字按字典序输出
2.修该联系人或小组单独某项的信息
3.小组功能中,显示小组的内容,并未设计完全
4.文件记录
*/
#include <cstdio>
#include <string>
#include <iostream>
#include <vector>

using namespace std;

void Error(){
    cout << "\n输入错误,请重新输入" << endl;
}

void Checkerror(string &s,int maxn){
    while(1){
        cin >> s;
        if(s.length() > 1 || s[0] < '0' || s[0] - '0' > maxn)
            Error();
        else
            return;
    }
}

class Group{
    private:
        string name;//小组的名字
        vector <string> v;//储存小组成员的名字
    public:
        void assign(string s){//创建时名字赋值
            v.clear();
            name = s;
        }
        void push(string s){//向该组中加入成员
            v.push_back(s);
        }
        void showname(){//输出该组的名字
            cout << name << endl;
        }
        string getname(){
            return name;
        }
        void print(){//输出该组所有成员的名字
            if(v.size() == 0){
                cout << "None" << endl;
                return;
            }
            for(int i = 0;i < v.size();i++)
                cout << i << ".  " << v[i] << endl;
        }
        void clear(){//删除该小组中所有成员
            v.clear();
        }
        void cut(string s){//从该组中删除某个成员
            for(int i = 0;i < v.size();i++)
                if(v[i] == s)
                    v.erase(v.begin()+i);
        }
};

class Contact_person{
    private:
        char First;//该联系人姓名的首字母
        string name,tel,remark,group;//remark为备注,grouop为所在组名
    public:
        Contact_person(){group = "None";}//group初始为无
        void assign(string n,string t,string r){//创建时赋值
            First = n[0];
            name  = n;
            tel = t;
            remark = r;
        }
        void divide_into_group(string s){//修改group的值
            group = s;
        }
        string getname(){//为外部得到name提供接口
            return name;
        }
        void showname(){//输出联系人的名字
            cout << name << endl;
        }
        void print(){//输出联系人所有信息
            cout << "Name  :" << name << endl;
            cout << "Tel   :" << tel << endl;
            cout << "Remark:" << remark << endl;
            cout << "Group :" << group << endl;
        }
};

class Adresslist{
    private:
        vector <Group> vgroup;
        vector <Contact_person> vperson;
    public:
        void print_groupname(){//输出所有分组的名字
            if(vgroup.size() == 0){
                cout << "分组为空!" << endl;
                return;
            }
            cout << "\n所有分组:" << endl;
            for(int i = 0;i < vgroup.size();i++){
                printf("%d. ",i);
                vgroup[i].showname();
            }
        }
        void print_personname(){//输出所有联系人的名字
            if(vperson.size() == 0){
                cout << "通讯录为空!" << endl;
                return;
            }
            cout << "\n所有联系人如下:" << endl;
            for(int i = 0;i < vperson.size();i++){
                printf("%d. ",i);
                vperson[i].showname();
            }
        }
        void divide_into_group(Contact_person &c){//分组
            if(!vgroup.size()){
                cout << "\n当前并未创建小组,请创建后再分配" << endl;
                return;
            }
            string s;
            while(1){
                print_groupname();
                cout << "\n请输入分到哪个小组(编号):";
                cin >> s;
                if(s.length() > 1 || s[0] < '0' || s[0] - '0' >= vgroup.size())
                    Error();
                else
                    break;
            }
            int p = s[0] - '0';
            s = vgroup[p].getname();
            c.divide_into_group(s);
            vgroup[p].push(c.getname());
            cout << "\n分组成功!" << endl;
        }
        void buildperson(){//新建联系人
            string name,tel,remark;
            Contact_person p;
            cout << "\n请输入联系人姓名:";
            cin >> name;
            cout << "\n请输入电话:";
            cin >> tel;
            cout << "\n请输入备注:";
            cin >> remark;
            p.assign(name,tel,remark);
            while(1){
                cout << "\n是否要对其分组(YES / NO)? ";
                string s;
                cin >> s;
                if(s == "YES"){
                    divide_into_group(p);
                    break;
                }
                if(s == "NO"){
                    break;
                }
                Error();
            }
            vperson.push_back(p);
            cout << "\n联系人创建成功!" << endl;
        }
        void buildgroup(){//新建小组
            string name;
            cout << "\n请输入小组名称:";
            cin >> name;
            Group group;
            group.assign(name);
            vgroup.push_back(group);
            cout << "\n小组创建成功!" << endl;
        }
        void managegroup(){//group菜单函数
            string s;
            Checkerror(s,3);
            switch(s[0]){
                case '0':
                    cout << "返回上一级!" << endl;
                    return;
                case '1':
                    buildgroup();
                    break;
                case '2':
                    if(vgroup.size() == 0){
                        cout << "分组为空!" << endl;
                        return;
                    }
                    for(int i = 0;i < vgroup.size();i++){
                        cout << "分组: ";
                        vgroup[i].showname();
                        vgroup[i].print();
                        cout << endl;
                    }
                    break;
                case '3':
                    vgroup.clear();
                    break;
            }
        }
        void managesearch(int t){//search菜单函数
            string s;
            Checkerror(s,1);
            if(s[0] == '0'){
                cout << "返回上一级!" << endl;
                return;
            }
            if(s[0] == '1'){
                vperson.erase(vperson.begin()+t);
                cout << "\n删除成功!" << endl;
            }
        }
        void clear(){//清空通讯录
            vperson.clear();
            for(int i = 0;i < vgroup.size();i++)
                vgroup[i].clear();
            cout << "\n清空成功!" << endl;
        }
        int search(){//查找联系人
            cout << "\n请输入您要查找的联系人:";
            string s;
            cin >> s;
            for(int i = 0;i < vperson.size();i++)
                if(vperson[i].getname() == s){
                    cout << "\n查找成功!" << endl;
                    vperson[i].print();
                    return i;
                }
            cout << "抱歉,您要查找的联系人不存在!" << endl;
            return -1;
        }
};

class Menu{
    public:
        void primary(){//主菜单的显示
            cout << endl << endl;
            cout << "1 . 新建联系人" << endl;
            cout << "2 . 显示所有联系人" << endl;
            cout << "3 . 管理分组" << endl;
            cout << "4 . 清空通讯录" << endl;
            cout << "5 . 查找联系人" << endl;
            cout << "0 . 退出" << endl ;
            cout << "\n请输入指令:";
        }
        void group(){//分组中的显示
            cout << endl << endl;
            cout << "1 . 新建分组" << endl;
            cout << "2 . 显示所有小组" << endl;
            cout << "3 . 删除所有分组" << endl;
            cout << "0 . 退出" << endl;
            cout << "\n请输入指令:";
        }
        void search(){//查找中的显示
            cout << endl << endl;
            cout << "1. 删除该联系人" << endl;
            cout << "0. 退出" << endl;
            cout << "\n请输入指令:";
        }
};

void System(){
    Menu menu;
    Adresslist adresslist;

    while(1){
        string s;
        while(1){
            menu.primary();
            cin >> s;
            if(s.length() > 1 || s[0] < '0' || s[0] > '5')
                Error();
            else
                break;
        }
        switch(s[0]){
            case '0':
                cout << "谢谢使用!" << endl;
                return;
            case '1':
                adresslist.buildperson();
                break;
            case '2':
                adresslist.print_personname();
                break;
            case '3':
                menu.group();
                adresslist.managegroup();
                break;
            case '4':
                adresslist.clear();
                break;
            case '5':
                int t = adresslist.search();
                if(t != -1){
                    menu.search();
                    adresslist.managesearch(t);
                }
                break;
        }
    }
}

int main(){
    cout << "欢迎使用通讯录管理系统!" << endl;
    System();
    return 0;
}


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值