[C语言]通讯录

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

                  本文章展示和讲解通过c语言编写通讯录及其各个功能 

目录

                1.编程的大致思路

                2.菜单的构建

                3.联系人的存放结构体的定义与声明

                4.功能的实现

                        4.1.联系人的增加

                        4.2.联系人的删除

                                4.2.1.通过联系人姓名找到其信息存放位置的实现

                                 4.2.2删除函数的实现

                4.3联系人的查找并显示

                4.4联系人信息的修改

                4.5目前联系人信息的展示

                4.6根据姓名将联系人排序

                4.7清空目前联系人的信息

                5.主函数的设计

                6.头文件结构体与各部分函数的声明

                7.完整代码


                1.编程的大致思路

                对于通讯录我们想到的第一个功能也是首要他的作用当然就是存放联系人的各种信息包括姓名电话住址等等。此外还有对联系人的增减排序和信息修改等其他功能

                对于选择功能来操作需要一个选择界面来进行种种后续的操作。

                所以首先我们要设计一个菜单上面注明我们想实现的功能和选择的方式。

                设计好了菜单我们就该实现各种功能了。因为功能偏多所以我们要分开一个一个函数分别实现。

                最重要的对于联系人信息的存放我们知道联系人的信息有多种他们的类型也是不同的。这时平时我们所考虑的数组是难以实现就该搬结构体上场了。有了信息的存放和功能的实现再加上菜单的功能选择我们的通讯录大致上也出来了。

                下面我们一一将其实现。

                2.菜单的构建

               大致用符号搭建一个如果有其他的想法能够更好的运用符号可以结合自己的想法。但最重要的是当作功能的选择与操作引导

void menu()//菜单
{
	printf("************************************\n");
	printf("******  1. add    2. del      ******\n");
	printf("******  3. search 4. modify   ******\n");
	printf("******  5. show   6. sort     ******\n");
	printf("******  7. empty  0. exit     ******\n");
	printf("************************************\n");
}

                3.联系人的存放结构体的定义与声明

typedef struct people//通讯录个人信息表格
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char number[12];
}people; //重命名结构体

typedef struct contact//存放个人信息和目前存放人数->通讯录
{
	people data[100];//存放个人信息总量
	int sz;//目前存放人数
}contact;

                4.功能的实现

                 首先我们要对结构体类型的数组进行初始化

void initcontact(contact* pc)//初始化,全部初始化为0
{
	pc->sz = 0;//给结构体的成员赋值
	memset(pc->data, 0, sizeof(pc->data));//被赋值对象赋的值给多少字节赋值
}

                        4.1.联系人的增加

void addcontact(contact* pc)//增添信息
{
	if (pc->sz == 100)//查看存放人数是否上限
	{
		printf("通讯录已满无法添加\n");
		return;//return直接结束此函数下面代码不会运行
	}
	//增添信息
	printf("请输入姓名");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话");
	scanf("%s", pc->data[pc->sz].number);

	pc->sz++;//每存放完一位就移动到下标后一位
}

                        4.2.联系人的删除

                删除功能是对指定的联系人进行删除所以我们要先找到存放所要删除的联系人信息存放的位置才能将其删除

                这里的删除是通过将下一位联系人的信息赋值给被删除联系人的位置将其覆盖达到删除的效果。

                既然要通过联系人的姓名找到信息存放的位置那我们还要实现一个删除函数的前置函数能够通过名字找到联系人的信息存放位置

                                4.2.1.通过联系人姓名找到其信息存放位置的实现

int findname(contact* pc, char name[])//根据姓名查找通讯录中已存人物
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//通过传参的姓名与已存放的姓名进行遍历与对比
		{
			return i;//返回查到联系人所存储的下标
		}
	}
	return -1;//未查询到该姓名的联系人返回-1
}

                                 4.2.2删除函数的实现

void delcontact(contact* pc)//删除将后一位直接覆盖到所要删除的信息中
{
	char name[20] = { 0 };//通过姓名找到所要删除的信息
	if (pc->sz == 0)
	{
		printf("通讯录为空无法删除\n");
		return;
	}

	printf("请输入所要删除的人的姓名");
	scanf("%s", name);//字符串不用取地址
	int ret = findname(pc, name);//通过姓名查询联系人的信息

	if (ret == -1)
	{
		printf("该人物不存在\n");
		return;
	}
	for (int i = ret; i < pc->sz - 1; i++)//将所被删除联系人后一位的联系人信息
	{                                    //向前覆盖
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//已存放的人数记得删除后减少一位
	printf("删除成功\n");

}

                4.3联系人的查找并显示

                这里也结合了上面根据姓名查找联系人的函数

void searchcontact(contact* pc)//查找联系人
{
	char name[20] = { 0 };
	printf("输入所要查找联系人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("所找联系人不存在\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[ret].name,
		pc->data[ret].age,
		pc->data[ret].sex,
		pc->data[ret].addr,
		pc->data[ret].number);
}

                4.4联系人信息的修改

void modifycontact(contact* pc)
{
	char name[20];
	printf("请输入要修改的联系人的姓名");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("请输入修改后的姓名");
	scanf("%s", pc->data[ret].name);
	printf("请输入修改后的年龄");
	scanf("%d", &pc->data[ret].age);
	printf("请输入修改后的性别");
	scanf("%s", pc->data[ret].sex);
	printf("请输入地址");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入修改后的电话");
	scanf("%s", pc->data[ret].number);
	printf("修改完成\n");
}

                4.5目前联系人信息的展示

void showcontact(contact* pc)//显示已有联系人
{
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].number);
	}
}

                4.6根据姓名将联系人排序

void sortcontact(contact* pc)//con
{
	for (int i = 0; i < pc->sz - 1; i++)//冒泡排序
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp((pc->data[j].name), (pc->data[j + 1].name)) > 0)
			{
				people tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}

	printf("排序完毕\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].number);
	}
}

                4.7清空目前联系人的信息

void emptycontact(contact* pc)//清空
{
	pc->sz = 0;//存放人数变为0
	memset(pc->data, 0, sizeof(pc->data));//memset再将其全部赋值成0
	printf("清空完毕\n");
}

                5.主函数的设计

                上面我们完成了对各个功能的设计现在就像拼积木一样将他们组装起来。

int main()
{
	int input = 0;
	contact con;
	initcontact(&con);//初始化

	do
	{
		menu();//菜单
		printf("请选择输出相应数字选择操作\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			addcontact(&con);//增加
			break;
		case 2:
			delcontact(&con);//删除
			break;
		case 3:
			searchcontact(&con);//查找
			break;
		case 4:
			modifycontact(&con);//修改
			break;
		case 5:
			showcontact(&con);//展示
			break;
		case 6:
			sortcontact(&con);//排序
			break;
		case 7:
			emptycontact(&con);//清空
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择无效请重新输出\n");
			break;
		}
	} while (input);
	return 0;
}

                6.头文件结构体与各部分函数的声明

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void menu();//菜单

typedef struct people//通讯录个人信息表格
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char number[12];
}people;

typedef struct contact//存放个人信息和目前存放人数->通讯录
{
	people data[100];//存放个人信息
	int sz;//目前存放人数
}contact;

void initcontact(contact *pc);//初始化通讯录

void addcontact(contact* pc);//功能1增添信息

void delcontact(contact* pc);//功能2删除信息

void searchcontact(contact* pc);//功能3查找联系人

void modifycontact(contact* pc);//功能4修改已存联系人信息

void showcontact(contact* pc);//功能5显示已有联系人

void sortcontact(contact* pc);//功能6根据姓名排序

void emptycontact(contact* pc);//功能7清空

                7.完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void menu();//菜单

typedef struct people//通讯录个人信息表格
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char number[12];
}people;

typedef struct contact//存放个人信息和目前存放人数->通讯录
{
	people data[100];//存放个人信息
	int sz;//目前存放人数
}contact;

void initcontact(contact *pc);//初始化通讯录

void addcontact(contact* pc);//功能1增添信息

void delcontact(contact* pc);//功能2删除信息

void searchcontact(contact* pc);//功能3查找联系人

void modifycontact(contact* pc);//功能4修改已存联系人信息

void showcontact(contact* pc);//功能5显示已有联系人

void sortcontact(contact* pc);//功能6根据姓名排序

void emptycontact(contact* pc);//功能7清空
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()//菜单
{
	printf("************************************\n");
	printf("******  1. add    2. del      ******\n");
	printf("******  3. search 4. modify   ******\n");
	printf("******  5. show   6. sort     ******\n");
	printf("******  7. empty  0. exit     ******\n");
	printf("************************************\n");
}

void initcontact(contact* pc)//初始化,全部初始化为0
{
	pc->sz = 0;//给结构体的成员赋值
	memset(pc->data, 0, sizeof(pc->data));//被赋值对象赋的值给多少字节赋值
}

void addcontact(contact* pc)//增添信息
{
	if (pc->sz == 100)
	{
		printf("通讯录已满无法添加\n");
		return;//return直接结束此函数下面代码不会运行
	}
	//增添信息
	printf("请输入姓名");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话");
	scanf("%s", pc->data[pc->sz].number);

	pc->sz++;
}

int findname(contact* pc, char name[])//根据姓名查找通讯录中已存人物
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//返回查到人物所存储的下标
		}
	}
	return -1;
}

void delcontact(contact* pc)//删除将后一位直接覆盖到所要删除的信息中
{
	char name[20] = { 0 };//通过姓名找到所要删除的信息
	if (pc->sz == 0)
	{
		printf("通讯录为空无法删除\n");
		return;
	}
	printf("请输入所要删除的人的姓名");
	scanf("%s", name);//字符串不用取地址
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("该人物不存在\n");
		return;
	}
	for (int i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");

}

void searchcontact(contact* pc)//查找联系人
{
	char name[20] = { 0 };
	printf("输入所要查找联系人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("所找联系人不存在\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[ret].name,
		pc->data[ret].age,
		pc->data[ret].sex,
		pc->data[ret].addr,
		pc->data[ret].number);
}

void modifycontact(contact* pc)
{
	char name[20];
	printf("请输入要修改的联系人的姓名");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("请输入修改后的姓名");
	scanf("%s", pc->data[ret].name);
	printf("请输入修改后的年龄");
	scanf("%d", &pc->data[ret].age);
	printf("请输入修改后的性别");
	scanf("%s", pc->data[ret].sex);
	printf("请输入地址");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入修改后的电话");
	scanf("%s", pc->data[ret].number);
	printf("修改完成\n");
}

void showcontact(contact* pc)//显示已有联系人
{
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].number);
	}
}


void sortcontact(contact* pc)//con
{
	for (int i = 0; i < pc->sz - 1; i++)
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp((pc->data[j].name), (pc->data[j + 1].name)) > 0)
			{
				people tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序完毕\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].number);
	}
}

void emptycontact(contact* pc)//清空
{
	pc->sz = 0;//给结构体的成员赋值
	memset(pc->data, 0, sizeof(pc->data));//被赋值对象赋的值给多少字节赋值
	printf("清空完毕\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

int main()
{
	int input = 0;
	contact con;
	initcontact(&con);//初始化

	do
	{
		menu();
		printf("请选择输出相应数字选择操作\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			addcontact(&con);
			break;
		case 2:
			delcontact(&con);
			break;
		case 3:
			searchcontact(&con);
			break;
		case 4:
			modifycontact(&con);
			break;
		case 5:
			showcontact(&con);
			break;
		case 6:
			sortcontact(&con);
			break;
		case 7:
			emptycontact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择无效请重新输出\n");
			break;
		}
	} while (input);
	return 0;
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6