C++入门项目:通讯录管理系统

一、步骤拆分

1.系统需求

利用C++来实现一个通讯录管理系统,系统中需要实现的功能如下:

添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
显示联系人:显示通讯录中所有联系人信息
删除联系人:按照姓名进行删除指定联系人
查找联系人:按照姓名查看指定联系人信息
修改联系人:按照姓名重新修改指定联系人
清空联系人:清空通讯录中所有信息
退出通讯录:退出当前使用的通讯录


2.显示菜单

功能描述: 用户选择功能的界面

菜单界面效果如下图:
在这里插入图片描述


代码实现:

//显示菜单
void showMenu(){
    cout << "***********************" << endl;
    cout << "***** 1.添加联系人 *****" << endl;
    cout << "***** 2.显示联系人 *****" << endl;
    cout << "***** 3.删除联系人 *****" << endl;
    cout << "***** 4.查找联系人 *****" << endl;
    cout << "***** 5.修改联系人 *****" << endl;
    cout << "***** 6.清空联系人 *****" << endl;
    cout << "***** 0.退出通讯录 *****" << endl;
    cout << "***********************" << endl;
}

3.添加联系人

在这里插入图片描述

//1.添加联系人
void addPerson(AddressBook &abs){
    cout << "添加联系人" << endl;
    if(abs.size == MAX){
        cout << "通讯录已满,无法添加" << endl;
        return;
    }
    cout << "abs.size = " << abs.size << endl;
    //姓名
    string name;
    cout << "请输入姓名" << endl;
    cin >> name;
    abs.personArray[abs.size].name = name;
    //性别
    string sex;
    cout << "请输入性别" << endl;
    while(true){
        cin >> sex;
        if(sex == "男" || sex == "女"){
            abs.personArray[abs.size].sex = sex;
            break;
        }
        cout << "输入有误,请重新输入性别,男 或 女" << endl;
    }
    //年龄
    int age;
    cout << "请输入年龄" << endl;
    cin >> age;
    abs.personArray[abs.size].age = age;
    //电话
    int phoneNumber;
    cout << "请输入电话" << endl;
    cin >> phoneNumber;
    abs.personArray[abs.size].phoneNumber= phoneNumber;
    //家庭住址
    string address;
    cout << "请输入家庭住址" << endl;
    cin >> address;
    abs.personArray[abs.size].address = address;
    //更新通讯录人数
    abs.size++;
    cout << "添加成功。" << endl;
    return;
}

4.显示联系人

//2.显示所有联系人
void showPerson(AddressBook &abs){
    if(abs.size == 0)  cout << "记录为空";
    else{
        for(int i = 0; i < abs.size; ++i){
            cout << "姓名:" << abs.personArray[i].name << "    ";
            cout << "性别:" << abs.personArray[i].sex << "    ";
            cout << "年龄:" << abs.personArray[i].age << "    ";
            cout << "电话:" << abs.personArray[i].phoneNumber << "    ";
            cout << "住址:" << abs.personArray[i].address << endl;
        }
    }
}

5.删除联系人

在这里插入图片描述

//3.删除联系人
void deletePerson(AddressBook &abs){
    string name;
    cout << "请输入要删除的联系人姓名" <<endl;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移
            abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除
        }
        abs.size--; //更新人员数
        cout << "删除成功。" << endl;
    }else{ //ret == -1
        cout << "查无此人。" << endl;
    }
}

6.查找联系人

//4.查找指定的联系人的信息
void findPerson(AddressBook abs){
    cout << "请输入您要查找的联系人" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        cout << "姓名:" << abs.personArray[ret].name << "    ";
        cout << "性别:" << abs.personArray[ret].sex << "    ";
        cout << "年龄:" << abs.personArray[ret].age << "    ";
        cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";
        cout << "住址:" << abs.personArray[ret].address << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

7.修改联系人

//5.修改联系人
void modifyPerson(AddressBook &abs){
    cout << "请输入要修改的联系人姓名" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        //姓名
        cout << "将姓名改为:" << endl;
        string name = "";
        cin >> name;
        abs.personArray[ret].name = name;
        //性别
        cout << "将性别改为:" << endl;
        string sex = "";
        while(true){
            cin >> sex;
            if(sex == "男" || sex == "女"){
                abs.personArray[ret].sex = sex;
                break;  //输入正确,退出循环
            }
            cout << "输入有误,请重新输入" << endl;
        }
        //年龄
        cout << "将年龄改为:" << endl;
        int age = 0;
        cin >> age;
        abs.personArray[ret].age = age;
        //联系电话
        cout << "将电话改为:" << endl;
        string phoneNumber = "";
        cin >> phoneNumber;
        abs.personArray[ret].phoneNumber = phoneNumber;
        //家庭住址
        cout << "将家庭住址改为:" << endl;
        string address = "";
        cin >> address;
        abs.personArray[ret].address = address;
        cout << "修改成功!" << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

8.清空通讯录

//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){
    cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;
    string str;
    cin >> str;
    if(str == "1"){
        abs.size = 0;
        cout << "联系人目录已清空。" << endl;
    }else{
        cout << "已放弃清空操作。" << endl;
    }
}

9.退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择7时候,执行退出,选择其他先不做操作,也不会退出程序

case 7:
      cout << "欢迎下次使用,再见。" << endl;
      return 0;



二、完整代码(200行)

1.Edward版本

#include <iostream>
#include <string>
using namespace std;
#define MAX 5  //通讯录人数上限

//联系人结构体
struct ContactPerson{
    string name;
    string sex;
    int age;
    string phoneNumber;
    string address;
};

//通讯录结构体:数组 + 容量
struct AddressBook{
    struct ContactPerson personArray[MAX];
    int size;
};

//显示菜单
void showMenu(){
    cout << "***********************" << endl;
    cout << "***** 1.添加联系人 *****" << endl;
    cout << "***** 2.显示联系人 *****" << endl;
    cout << "***** 3.删除联系人 *****" << endl;
    cout << "***** 4.查找联系人 *****" << endl;
    cout << "***** 5.修改联系人 *****" << endl;
    cout << "***** 6.清空联系人 *****" << endl;
    cout << "***** 7.退出通讯录 *****" << endl;
    cout << "***********************" << endl;
}

//1.添加联系人
void addPerson(AddressBook &abs){
    cout << "添加联系人,通讯录当前联系人个数:" << abs.size << endl;
    if(abs.size == MAX){
        cout << "通讯录已满,无法添加" << endl;
        return;
    }
    //姓名
    string name;
    cout << "请输入姓名" << endl;
    cin >> name;
    abs.personArray[abs.size].name = name;
    //性别
    string sex;
    cout << "请输入性别" << endl;
    while(true){
        cin >> sex;
        if(sex == "男" || sex == "女"){
            abs.personArray[abs.size].sex = sex;
            break;
        }
        cout << "输入有误,请重新输入性别,男 或 女" << endl;
    }
    //年龄
    int age;
    cout << "请输入年龄" << endl;
    cin >> age;
    abs.personArray[abs.size].age = age;
    //电话
    string phoneNumber;
    cout << "请输入电话" << endl;
    cin >> phoneNumber;
    abs.personArray[abs.size].phoneNumber= phoneNumber;
    //家庭住址
    string address;
    cout << "请输入家庭住址" << endl;
    cin >> address;
    abs.personArray[abs.size].address = address;
    //更新通讯录人数
    abs.size++;
    cout << "添加成功。" << endl;
    return;
}

//2.显示所有联系人
void showPerson(AddressBook &abs){
    if(abs.size == 0)  cout << "当前记录为空,没有联系人。" << endl;
    else{
        for(int i = 0; i < abs.size; ++i){
            cout << "姓名:" << abs.personArray[i].name << "    ";
            cout << "性别:" << abs.personArray[i].sex << "    ";
            cout << "年龄:" << abs.personArray[i].age << "    ";
            cout << "电话:" << abs.personArray[i].phoneNumber << "    ";
            cout << "住址:" << abs.personArray[i].address << endl;
        }
    }
}

//3.检测联系人是否存在:若存在,返回联系人在通讯录中的位置;若不存在,返回-1
int isExist(AddressBook abs,string name){
    for(int i = 0; i < abs.size; ++i){  //数组下标从0开始
        if(abs.personArray[i].name == name)  return i;
    }
    return -1;
}

//3.删除联系人
void deletePerson(AddressBook &abs){
    string name;
    cout << "请输入要删除的联系人姓名" <<endl;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移
            abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除
        }
        abs.size--; //更新人员数
        cout << "删除成功。" << endl;
    }else{ //ret == -1
        cout << "查无此人。" << endl;
    }
}

//4.查找指定的联系人的信息
void findPerson(AddressBook abs){
    cout << "请输入您要查找的联系人" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        cout << "姓名:" << abs.personArray[ret].name << "    ";
        cout << "性别:" << abs.personArray[ret].sex << "    ";
        cout << "年龄:" << abs.personArray[ret].age << "    ";
        cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";
        cout << "住址:" << abs.personArray[ret].address << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

//5.修改联系人
void modifyPerson(AddressBook &abs){
    cout << "请输入要修改的联系人姓名" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        //姓名
        cout << "将姓名改为:" << endl;
        string name = "";
        cin >> name;
        abs.personArray[ret].name = name;
        //性别
        cout << "将性别改为:" << endl;
        string sex = "";
        while(true){
            cin >> sex;
            if(sex == "男" || sex == "女"){
                abs.personArray[ret].sex = sex;
                break;  //输入正确,退出循环
            }
            cout << "输入有误,请重新输入" << endl;
        }
        //年龄
        cout << "将年龄改为:" << endl;
        int age = 0;
        cin >> age;
        abs.personArray[ret].age = age;
        //联系电话
        cout << "将电话改为:" << endl;
        string phoneNumber = "";
        cin >> phoneNumber;
        abs.personArray[ret].phoneNumber = phoneNumber;
        //家庭住址
        cout << "将家庭住址改为:" << endl;
        string address = "";
        cin >> address;
        abs.personArray[ret].address = address;
        cout << "修改成功!" << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){
    cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;
    string str;
    cin >> str;
    if(str == "1"){
        abs.size = 0;
        cout << "联系人目录已清空。" << endl;
    }else{
        cout << "已放弃清空操作。" << endl;
    }
}

int main() {
    AddressBook abs; //创建一个通讯录对象
    abs.size = 0;

    while(true){
        cout << endl;
        showMenu(); //菜单调用

        cout << "请输入您选择的功能编号" << endl;
        int select = 0; //用户选择
        cin >> select;

        if (cin.fail()) { // 检查是否输入错误
            cin.clear(); // 清除cin的错误状态
            cin.ignore(); // 清除缓冲区直到下一个换行符
            // 输出错误信息并继续循环
            cout << "输入无效,请输入一个数字。" << endl;
            continue;
        }

        switch(select) {  //switch-case结构
            case 1:
                addPerson(abs);
                break;
            case 2:
                showPerson(abs);
                break;
            case 3:
                deletePerson(abs);
                break;
            case 4:
                findPerson(abs);
                break;
            case 5:
                modifyPerson(abs);
                break;
            case 6:
                clearPerson(abs);
                break;
            case 7:
                cout << "欢迎下次使用,再见。" << endl;
                return 0;
            default:
                cout << "功能数字不存在" << endl;
        }
    }
}

2.Jemma版本

#include<iostream>
using namespace std;
#include<string>
#define max 1000            //通讯录人数不超过1000

//通讯录中人的结构体
struct Phone {
	string name;
	string sex;
	int age;
	string number;
	string add;
};

// 通讯录结构体!!!!重要!!!!
struct Numberbooks {
	struct Phone nbook[max];  //通讯录数组
	int num=0;      //数组长度
};

//显示一下功能选项
void Show_Faction() {
	cout << "1添加联系人" << endl;
	cout << "2显示联系人" << endl;
	cout << "3删除联系人" << endl;
	cout << "4查找联系人" << endl;
	cout << "5修改联系人" << endl;
	cout << "6清空联系人" << endl;
	cout << "7退出通讯录系统" << endl << endl;
}

//添加联系人
void Add_Phone(struct Numberbooks *s) {
	//先判断能不能存;
	if (s->num > 1000)cout << "通讯录已满" << endl;
	else {
		int ag;
		string na, se, nu, ad;
		cout << "请输入姓名:";
		cin >> na;
		s->nbook[s->num].name = na;   //nb00k[]是数组元素,s->num是通讯录个数
		cout << "请输入性别:";
		cin >> se;
		s->nbook[s->num].sex = se;
		cout << "请输入年龄:";
		cin >> ag;
		s->nbook[s->num].age = ag;
		cout << "请输入电话号码:";
		cin >> nu;
		s->nbook[s->num].number = nu;
		cout << "请输入地址:";
		cin >> ad;
		s->nbook[s->num].add = ad;
		cout << "联系人已保存。" << endl;
		//通讯录个数加一
		s->num++;
		cout <<"通讯录个数为:"<< s->num << endl ;
		cout << "***********************"<<endl;           //为方便分辨显示的内容,加一行这个
	}
	//system("cls");    //清屏
}

//显示联系人
void Show_Phone(struct Numberbooks *s) {
	//cout << "通讯录个数为:" << s->num << endl;
	if ((s->num) == 0)cout << "列表为空!";
	else {
		cout << "联系人列表如下:" << endl;
		for (int i = 0;i <= s->num;i++) {
			cout << s->nbook[i].name << "\t" << s->nbook[i].age << "\t" << s->nbook[i].sex << "\t" << s->nbook[i].number << "\t" << s->nbook[i].add << endl;
		}
	}	
	cout << "***********************"<<endl;
}

//按姓名删除联系人:找到联系人之后,后面的元素依次往前移位,
//覆盖前元素,最后将数组长度减一
void Delete_Phone(struct Numberbooks *s) {
	if ((s->num) == 0)cout << "列表为空!";
	else {
		int i;
		string N;
		cout << "请输入要删除的姓名:";
		cin >> N;
		for (i = 0;i < s->num;i++) {
			if (s->nbook[i].name == N) {
				for (int j = i;j < s->num;j++) {		//找到之后,往前覆盖			
						s->nbook[j] = s->nbook[j+1];						
				}
				s->num--;
				//cout << "通讯录个数为:" << s->num << endl;
				cout << "删除成功!" << endl<<endl;
			}
		}
		if (i > s->num)
			cout << "该联系人不存在!" << endl ;
	}
	cout << "***********************"<< endl;
}
//查找联系人:内容与删除联系人中的查找方法一样

void Select_Phone(struct Numberbooks *s) {
	int i;
	string N;
	cout << "请输入要查找的姓名:";
	cin >> N;
	for (i = 0;i < s->num;i++) {
		if (s->nbook[i].name == N) {          //找到了就显示信息
			cout << "联系人信息如下" << endl;
			cout << s->nbook[i].name << "\t" << s->nbook[i].age << "\t" << s->nbook[i].sex << "\t" << s->nbook[i].number << "\t" << s->nbook[i].add << endl;

		}
	}
	if (i > s->num)
		cout << "该联系人不存在!" << endl;
	cout << "***********************"<<endl;
}

//修改联系人
//(以修改联系人姓名为例,其他的方法一样):先查找,找到之后对应修改即可
void Alter_Phone(struct Numberbooks *s) {
	int i;
	string N;
	cout << "请输入原姓名:";
	cin >> N;
	for (i = 0;i < s->num;i++) {
		if (s->nbook[i].name == N) {         //找到啦
			string change;
			cout << "请输入新姓名:";
			cin >> change;
			s->nbook[i].name = change;
			cout << "修改成功!"<<endl;
		}
	}
	if (i > s->num)
		cout << "该联系人不存在!" << endl ;
	cout << "***********************" << endl;

}
//清空联系人
void Empty_Phone(struct Numberbooks *s) {
	//用户确定是否清空
	cout << "确定要清空联系人吗?“是”请按1,不是请按0"<<endl;
	int sure;
	cin >> sure;
	if (sure == 1) {
       s->num = 0;
	   cout << "通讯录已清空!"<<endl ;

	}
	cout << "***********************" << endl;
}

int main() {
	
	Numberbooks s;      //注意类型
	while (1) {
		Show_Faction();
		int n;
		cout << "请输入您选择的功能编号:";
		cin >> n;
		switch (n) {
		case 1:Add_Phone(&s);        //1对应添加联系人,注意地址传递才能修改
			break;
		case 2:Show_Phone(&s);        //2对应显示联系人
			break;
		case 3:Delete_Phone(&s);        //3对应删除联系人
			break;
		case 4:Select_Phone(&s);        //4对应查找联系人
			break;
		case 5:Alter_Phone(&s);        //5对应修改联系人
			break;
		case 6:Empty_Phone(&s);        //6对应清空联系人
			break;
		case 7:cout << "欢迎下次使用" << endl;     //7对应添加联系人
			return 0;
			break;
		default:
			break;
		}
	}    	
	return 0;
}



三、改进方向

使用文件流fstream,将通讯录数据进行保存



四、手把手视频教程

1.通讯录管理系统

2.黑马程序员 C++语法教程

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我不了解c语言个人通讯录管理系统,但是我可以给你一些建议:首先,你可以研究一下其他人已经写过的类似系统,以便更好地理解你要实现的功能;其次,你可以拆分你的项目,把它分解成一系列可以逐步实现的小任务;最后,你可以多多查阅资料,以便更好地解决程序实现过程中遇到的问题。 ### 回答2: C语言个人通讯录管理系统可以分为以下几个步骤进行编写: 1. 定义数据结构:首先,需要定义一个用于存储通讯录信息的数据结构,可以包括姓名、电话号码、电子邮件等字段。 2. 添加联系人:设计一个函数用于添加联系人信息,可以通过用户输入方式获取联系人的姓名、电话号码和电子邮件,并将其保存在数据结构中。 3. 删除联系人:设计一个函数用于删除指定联系人的信息,可以通过用户输入的联系人姓名或电话号码,查找并删除对应的联系人。 4. 修改联系人:设计一个函数用于修改已有联系人的信息,可以通过用户输入的联系人姓名或电话号码,查找并修改对应联系人的姓名、电话号码和电子邮件。 5. 查询联系人:设计一个函数用于查询联系人的信息,可以通过用户输入的联系人姓名或电话号码,查找并显示对应联系人的所有信息。 6. 显示通讯录:设计一个函数用于显示通讯录中所有联系人的信息,可以按照一定的格式将所有联系人的姓名、电话号码和电子邮件打印出来。 7. 保存通讯录:设计一个函数用于将通讯录中所有联系人的信息保存到文件中,以便下次程序运行时可以读取已有信息。 以上是一个简单的通讯录管理系统的基本实现思路,可以根据需要进行扩展和优化。在编写过程中,还需要考虑异常处理、用户界面设计等方面的因素,以提高系统的稳定性和用户友好性。 ### 回答3: C语言个人通讯录管理系统可以按照以下步骤来编写: 1. 首先,创建一个结构体来表示通讯录的联系人信息,包括姓名、电话号码、地址等字段。 2. 在主函数中,定义一个数组来存储联系人的信息。可以根据需要设置一个最大联系人数的常量。 3. 实现菜单功能,提供以下选项:添加联系人、删除联系人、查询联系人、显示所有联系人、退出程序等。 4. 添加联系人功能:通过用户输入姓名、电话号码、地址等信息,将联系人信息保存到联系人数组中。可以使用循环来确保添加多个联系人。 5. 删除联系人功能:用户输入要删除的联系人的姓名,程序在联系人数组中查找匹配的联系人,并删除它。 6. 查询联系人功能:用户输入要查询的联系人姓名,程序在联系人数组中查找匹配的联系人,并显示其电话号码、地址等信息。 7. 显示所有联系人功能:遍历联系人数组,逐个显示所有联系人的信息。 8. 退出程序功能:用户选择退出程序后,程序结束运行。 9. 在程序开头,可以使用文件操作功能,读取一个保存联系人信息的文件,将联系人数组初始化为文件中的内容,程序结束时,将联系人数组的内容写回文件。 通过以上步骤,我们可以实现一个简单的C语言个人通讯录管理系统。需要注意的是,在实际开发中还可以进行更多功能的添加和优化,如编辑联系人信息、根据姓名首字母排序联系人等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值