• 静态版通讯录



    前言

    本篇文章主要用C++来实现一下静态通讯录

    一、主要功能

    通讯录的主要功能主要分为:增、删、查、改。这四大板块;在多于其它版本,无外乎时对的扩展;
    在这里插入图片描述
    但是今天,我们只简单的实现一下上述几个功能;
    一个小小的建议:不建议一上来就写菜单,因为这样不方便后续的测试;
    建议写一个函数,测一个函数,避免后面满屏waring和错误!!!

    二、联系人设计

    既然要存储信息,我们就应该设计一个结构体来存储,一个人是个复杂的对象,不能单一的用int 、char、short等变量;
    于是我们可以得:

    typedef struct student//联系人结构体
    {
    	string name;
    	string sex;
    	int age;
    	string num;
    	string addres;
    }ST;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当然,我们也不可能来存储一个人的信息,所以我们需要一个结构体数组来维护这个通讯录,同时,为了方便记录通讯录中记录了多少个有效数据,我们还需要一个结构体,来维护通讯录:

    #define MAX 100//设置通讯录大小
    struct mark
    {
    	ST students[MAX];
    	int size;//记录有效数据
    };//记录通讯录数组
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但是我们不要把通讯录大小写死了,我们用一个宏来代替数组的元素个数;
    同时,我们也需要一个初始化函数,去初始化这个结构体:

    void init_mark(mark*p)//初始化
    {
    	p->size = 0;
    	for (int i = 0; i < MAX; i++)
    	{
    		p->students[i].name = "";
    		p->students[i].num = "";
    		p->students[i].addres = "";
    		p->students[i].sex = "";
    		p->students[i].age =0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三、具体函数实现

    1、增加联系人

    增加联系人?是不是要有空间,我们才能增加。
    如果没有空间了,我们也就没有增加下去的必要了,直接退出该函数,并给使用者一个反馈:如果空间足够,则继续增加下去:

    void add_student(mark*p)//增加联系人
    {
    	if (p->size == MAX)
    	{
    		cout << "空间已满\n";
    	}
    	else
    	{
    		cout << "请输入姓名:";
    		cin >> (p->students[p->size].name);
    		cout << "请输入性别:";
    		cin >> (p->students[p->size].sex);
    		cout << "请输入年龄:";
    		cin >> (p->students[p->size].age);
    		cout << "请输入电话:";
    		cin >> (p->students[p->size].num);
    		cout << "请输入住址:";
    		cin >> (p->students[p->size].addres);
    		p->size++;//增加一个size记录一下;
    		cout << "<<增加成功>>" << endl;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    2、显示联系人

    为了显示的美观,我们可以做一个标头,然后再标头下面,依次输出相应的信息:
    当然如果一个有效数据都没有,那我们就没必要打印下去了,直接返回;

    void Printf(mark* p)//打印联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<当前通讯录为空>>" << endl;
    		return;
    	}
    	cout << "姓名\t" << "\t性别\t" << "\t年龄\t" << "\t电话\t" << "\t\t住址\t" << endl;//设置标头
    	for (int i = 0; i < p->size; i++)
    	{
    		cout << (p->students[i].name)<<"\t";
    		cout << "\t" << p->students[i].sex << "\t";
    		cout << "\t" << p->students[i].age << "\t";
    		cout << "\t" << p->students[i].num << "\t"<<"\t";
    		cout << "\t" << p->students[i].addres <<"\t"<<endl;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    3、 删除联系人

    怎么删除?
    得有数据才能给我们删除啊!
    如果没有数据,给操作者一个提示,然后返回;
    如果有的话,我们再在有效数据中查找我们输入的姓名,看看再有效数据中是否存在;如果不存在,那么也就没有删除的必要了,如果有的话,我们再继续删除操作,当然,我们也要把删除位置以后的数据往前挪!

    int is_exist(mark*p,string ch)//判断ch字符串是否存在,存在的话返回下标,不存在返回-1;
    {
    	for (int i = 0; i < p->size; i++)
    	{
    		if (p->students[i].name == ch)
    			return i;
    	}
    	return -1;
    }
    void pop_student(mark* p)//删除联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,删除失败>>" << endl;
    		return;
    	}
    	string name;
    	cout << "删除的人的姓名:";
    	cin >> name;
    	int ret = is_exist(p, name);
    	if (is_exist(p, name) == -1)
    	{
    		cout << "<<查无此人>>" << endl;
    		return;
    	}
    	else
    	{
    		for (int i = ret; i < p->size - 1; i++)
    		{
    			p->students[i] = p->students[i + 1];
    		}
    		cout << "<<删除成功>>" << endl;
    		p->size--;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4、查找联系人

    同删除联系人一样,需要存在有效数据才能查找;数据都没有,那还查找个pp;
    如果找得到,直接返回其下标,如果找不到直接返回-1;

    int Find_student(const mark* p)//查找联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,查找失败>>" << endl;
    		return -1;
    	}
    	cout << "查找的人的姓名:";
    		string name;
    		cin >> name;
    		for (int i = 0; i < p->size; i++)
    		{
    			if (p->students[i].name == name)
    			{
    				cout << "<<找到了>>" << endl;
    				cout << "姓名\t" << "\t性别\t" << "\t年龄\t" << "\t电话\t" << "\t\t住址\t" << endl;
    				cout << (p->students[i].name) << "\t";
    				cout << "\t" << p->students[i].sex << "\t";
    				cout << "\t" << p->students[i].age << "\t";
    				cout << "\t" << p->students[i].num << "\t" << "\t";
    				cout << "\t" << p->students[i].addres << "\t" << endl;
    				return i;
    			}
    		}
    		cout << "<<查无此人>>" << endl;	
    		return -1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    5、修改联系人

    当然我们得有数据才能就行修改操作;即使有了有效数据,我们也要再有效数据中进行修改;如果再有效数据中不存在,则直接告诉用户修改失败;

    void rewrite_student(mark*p)//修改联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,修改失败>>" << endl;
    		return;
    	}
    	cout << "修改的人的姓名:";
    	string name;
    	cin >> name;
    	int ret = is_exist(p, name);
    	if (is_exist(p, name) == -1)
    	{
    		cout << "<<查无此人>>" << endl;
    		return;
    	}
    	else
    	{
    		cout << "请输入姓名:";
    		cin >> (p->students[ret].name);
    		cout << "请输入性别:";
    		cin >> (p->students[ret].sex);
    		cout << "请输入年龄:";
    		cin >> (p->students[ret].age);
    		cout << "请输入电话:";
    		cin >> (p->students[ret].num);
    		cout << "请输入住址:";
    		cin >> (p->students[ret].addres);
    		cout << "<<修改成功>>" << endl;
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    修改之前:
    在这里插入图片描述
    修改后:
    在这里插入图片描述

    6、 清空联系人

    其实我们只需逻辑上进行删除就行了,不需要进行实际的将空间里面的数据进行清楚;

    void Destroyed(mark* p)//销毁联系人
    {
    	p->size = 0;
    	Printf(p);
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们只需要将记录有效数据的size清0就行了,让编译器访问不到就行了;

    至此,简单通讯录的基本功能就已经实现的差不多了!!!

    四、菜单

    这时候我们就可以来写菜单了:

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    五、 main函数程序活起来

    void test3()
    {
    	mark tmp;
    	init_mark(&tmp);
    	int input = 0;
    	do
    	{
    		showMenu();
    		cout << "请输入选择:";
    		cin >> input;
    		switch (input)
    		{
    		case 1:
    		{
    		add_student(&tmp);
    		 } break;
    		case 2: 
    		{
    			Printf(&tmp);	
    		}; break;
    		case 3: 
    		{
    			pop_student(&tmp);
    			}break;
    		case 4: 
    		{
    		Find_student(&tmp);
    		 } break;
    		case 5:
    		{
    			rewrite_student(&tmp);	
    		} break;
    		case 6:
    		{
    		Destroyed(&tmp);
    		} break;
    		case 0:
    			cout << "<<退出通讯录>>" << endl;
    			break;
    		default: 
    		{
    			cout << "选择错误" << endl;
    		}
    		}
    		cout << "请按任意键继续. . .";
    		_getch();//把上一次操作卡死,方便停留观察,防止清屏的时候一闪而过
    		system("cls");
    	} while (input);
    }
    int main()
    {
    	system("title 静态通讯录");//改变控制台名称
         test3();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    六、最终代码

    #define  _CRT_SECURE_NO_WARNINGS 0
    #include
    #include
    #include
    #pragma warning(disable:6031)//忽略警告
    #pragma warning(disable:26495)//忽略代码26495的警告
    using namespace std;
    #define MAX 100//设置通讯录大小
    typedef struct student//通讯录结构体
    {
    	string name;
    	string sex;
    	int age;
    	string num;
    	string addres;
    }ST;
    struct mark
    {
    	ST students[MAX];
    	int size;//记录有效数据
    };//记录结构体数组
    int is_exist(mark*p,string ch)//判断ch字符串是否存在
    {
    	for (int i = 0; i < p->size; i++)
    	{
    		if (p->students[i].name == ch)
    			return i;
    	}
    	return -1;
    }
    void init_mark(mark*p)//初始化
    {
    	p->size = 0;
    	for (int i = 0; i < MAX; i++)
    	{
    		p->students[i].name = "";
    		p->students[i].num = "";
    		p->students[i].addres = "";
    		p->students[i].sex = "";
    		p->students[i].age =0;
    	}
    }
    void add_student(mark*p)//增加联系人
    {
    	if (p->size == MAX)
    	{
    		cout << "空间已满\n";
    	}
    	else
    	{
    		cout << "请输入姓名:";
    		cin >> (p->students[p->size].name);
    		cout << "请输入性别:";
    		cin >> (p->students[p->size].sex);
    		cout << "请输入年龄:";
    		cin >> (p->students[p->size].age);
    		cout << "请输入电话:";
    		cin >> (p->students[p->size].num);
    		cout << "请输入住址:";
    		cin >> (p->students[p->size].addres);
    		p->size++;
    		cout << "<<增加成功>>" << endl;
    	}
    	
    }
    int Find_student(const mark* p)//查找联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,查找失败>>" << endl;
    		return -1;
    	}
    	cout << "查找的人的姓名:";
    		string name;
    		cin >> name;
    		for (int i = 0; i < p->size; i++)
    		{
    			if (p->students[i].name == name)
    			{
    				cout << "<<找到了>>" << endl;
    				cout << "姓名\t" << "\t性别\t" << "\t年龄\t" << "\t电话\t" << "\t\t住址\t" << endl;
    				cout << (p->students[i].name) << "\t";
    				cout << "\t" << p->students[i].sex << "\t";
    				cout << "\t" << p->students[i].age << "\t";
    				cout << "\t" << p->students[i].num << "\t" << "\t";
    				cout << "\t" << p->students[i].addres << "\t" << endl;
    				return i;
    			}
    		}
    		cout << "<<查无此人>>" << endl;	
    		return -1;
    }
    void Printf(mark* p)//打印联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<当前通讯录为空>>" << endl;
    		return;
    	}
    	cout << "姓名\t" << "\t性别\t" << "\t年龄\t" << "\t电话\t" << "\t\t住址\t" << endl;
    	for (int i = 0; i < p->size; i++)
    	{
    		cout << (p->students[i].name)<<"\t";
    		cout << "\t" << p->students[i].sex << "\t";
    		cout << "\t" << p->students[i].age << "\t";
    		cout << "\t" << p->students[i].num << "\t"<<"\t";
    		cout << "\t" << p->students[i].addres <<"\t"<<endl;
    	}
    	
    }
    void rewrite_student(mark*p)//修改联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,修改失败>>" << endl;
    		return;
    	}
    	cout << "修改的人的姓名:";
    	string name;
    	cin >> name;
    	int ret = is_exist(p, name);
    	if (is_exist(p, name) == -1)
    	{
    		cout << "<<查无此人>>" << endl;
    		return;
    	}
    	else
    	{
    		cout << "请输入姓名:";
    		cin >> (p->students[ret].name);
    		cout << "请输入性别:";
    		cin >> (p->students[ret].sex);
    		cout << "请输入年龄:";
    		cin >> (p->students[ret].age);
    		cout << "请输入电话:";
    		cin >> (p->students[ret].num);
    		cout << "请输入住址:";
    		cin >> (p->students[ret].addres);
    		cout << "<<修改成功>>" << endl;
    	}
    
    }
    void pop_student(mark* p)//删除联系人
    {
    	if (p->size == 0)
    	{
    		cout << "<<通讯录为空,删除失败>>" << endl;
    		return;
    	}
    	string name;
    	cout << "删除的人的姓名:";
    	cin >> name;
    	int ret = is_exist(p, name);
    	if (is_exist(p, name) == -1)
    	{
    		cout << "<<查无此人>>" << endl;
    		return;
    	}
    	else
    	{
    		for (int i = ret; i < p->size - 1; i++)
    		{
    			p->students[i] = p->students[i + 1];
    		}
    		cout << "<<删除成功>>" << endl;
    		p->size--;
    	}
    }
    void Destroyed(mark* p)//销毁联系人
    {
    	p->size = 0;
    	Printf(p);
    	
    }
    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;
    }
    void test3()
    {
    	mark tmp;
    	init_mark(&tmp);
    	int input = 0;
    	do
    	{
    		showMenu();
    		cout << "请输入选择:";
    		cin >> input;
    		switch (input)
    		{
    		case 1:
    		{
    		add_student(&tmp);
    		 } break;
    		case 2: 
    		{
    			Printf(&tmp);	
    		}; break;
    		case 3: 
    		{
    			pop_student(&tmp);
    			}break;
    		case 4: 
    		{
    		Find_student(&tmp);
    		 } break;
    		case 5:
    		{
    			rewrite_student(&tmp);	
    		} break;
    		case 6:
    		{
    		Destroyed(&tmp);
    		} break;
    		case 0:
    			cout << "<<退出通讯录>>" << endl;
    			break;
    		default: 
    		{
    			cout << "选择错误" << endl;
    		}
    		}
    		cout << "请按任意键继续. . .";
    		_getch();//把上一次操作卡死,方便停留观察,防止清屏的时候一闪而过
    		system("cls");
    	} while (input);
    }
    int main()
    {
    	system("title 静态通讯录");//改变控制台名称
         test3();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
  • 相关阅读:
    Ansible自动化部署安装openGauss3.1企业版单机
    瀑布流 - Vue3基于Grid布局简单实现一个瀑布流组件
    安装 DolphinDB Python API
    腾讯云轻量应用服务器内网连接互通有什么限制?
    这些Git事故灾难, 你经历过几个?
    .NET 8 候选版本 2 (RC2) 现已可用
    如何在 K8S 集群范围使用 imagePullSecret?
    和运维工程师聊完,发现小丑竟是我自己
    嵌入式实时操作系统的设计与开发 (启动过程学习)
    RabbitMQ 基础操作
  • 原文地址:https://blog.csdn.net/qq_62106937/article/details/126392641