C语言实现静态通讯录

前言

大家好,今天我们用C语言来实现一个通讯录,具体如何实现呢,我们来看看实现思路

通讯录实现思路

通讯录功能

打开手机,我们可以看到通讯录有以下基础功能

  • 增加联系人
  • 删除联系人
  • 查找联系人
  • 修改联系人信息
  • 显示全部联系人
  • 对联系人进行排序

思路

  1. 首先我们要创建一个容器,用于存放个人的信息,再将每个人的信息集成到一个更大的容器中,这样存着每个人信息的容器就被我们称作通讯录
  2. 有了这样一个通讯录后,我们通过函数对通讯录进行操作,以实现通讯录功能,为了方便使用,我们可以创建一个菜单,使操作简单,并且使用循环结构,使操作可以重复进行

具体代码实现

将代码分为3个部分,两个.c文件和一个.h文件
一个.c文件用于存放主函数另一个用于实现函数
.h文件则包含了函数的声明和头文件的包含

  1. 菜单设计
    菜单
  2. 主函数设计
int main()
{
	int input = 0;
	AB s1;//创建通讯录
	initiallize(&s1);//将通讯录初始化,不可将初始化函数放在循环结构中,放在循环结构中无法留下信息,每次循环都会清空通讯录
	do
	{
		printf("请选择\n");
		menu();
		scanf("%d", &input);
		switch(input)
		{
			case ADD:
				addbook(&s1);//添加联系人
				break;
			case DELETE:
				deletebook(&s1);//删除联系人
				break;
			case CHECK:
				checkbook(&s1);//查找联系人
				break;
			case MODIFICA:
				modificabook(&s1);//修改联系人
				break;
			case SHOW:
				showbook(&s1);//显示联系人
				break;
			case SORT:
				sortbook(&s1);//对通讯录进行排序
				break;
			case 0:
				printf("退出通讯录");
				break;
			default:
				printf("选择错误,请重新选择");
				break;
		}
	} while (input);
}

这样的设计使得通讯录可以进行多次操作,并且每次操作都有打印菜单提示,提升用户的交互体验
并且使用枚举,使代码可读性增加

enum options
{
	ADD=1,
	DELETE,
	CHECK,
	MODIFICA,
	SHOW,
	SORT
};
  1. 预处理
#pragma once//防止重复引用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME 10//这里使用宏定义最大数组长度,方便后续修改
#define SEX  5
#define NUMBER 15
#define ADDRESS 20
#define MAX_count 100

在.h文件中包含这些预处理

  1. 个人信息
typedef struct preson
{
	char name[NAME];//名字
	char sex[SEX];//性别
	char number[NUMBER];//号码
	char address[ADDRESS];//地址
}PS;

定义一个结构体存储单个人的信息,同时用typedef重命名为PS,方便后续使用

  1. 将个人信息集成为通讯录
typedef struct addressbook
{
	PS book[MAX_count];
	int size;
}AB;

重命名为AB

  1. 通讯录初始化
void initiallize(AB* s1)//对通讯录进行初始化
{
	s1->size = 0;
	memset(s1->book, 0, sizeof(s1->book));
}
  1. 添加联系人
void addbook(AB* s1)//添加联系人
{
	if (s1->size == MAX_count)
	{
		printf("通讯录已满,无法添加!");
		return;
	}
	printf("请输入名字\n");
	scanf("%s", s1->book[s1->size].name);
	printf("请输入性别\n");
	scanf("%s", s1->book[s1->size].sex);
	printf("请输入电话号码\n");
	scanf("%s", s1->book[s1->size].number);
	printf("请输入地址\n");
	scanf("%s", s1->book[s1->size].address);
	s1->size++;
	printf("添加成功!\n");
}

效果
在这里插入图片描述

  1. 删除联系人
void deletebook(AB* s1)//删除联系人
{
	if (s1->size == 0)
	{
		printf("通讯录为空");
		return;
	}
	char name[NAME];
	printf("请输入要删除人的名字");
	scanf("%s", name);
	int check = check_someone(s1, name);
	if (check == -1)
	{
		printf("要删除的人不存在");
		return;
	}
	int i = check;
	for (i; i < s1->size - 1; i++)
	{
		s1->book[i] = s1->book[i + 1];
	}
	s1->size--;
	printf("删除成功");
}

这里封装了一个通过名字查找,返回下标的函数

int check_someone(AB* s1,char*name)//找某人,按姓名找
{
	int i = 0;
	for (i = 0; i < s1->size; i++)
	{
		if (strcmp(s1->book[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

效果
删除前
删除前
在这里插入图片描述
删除后

  1. 查找联系人
void checkbook(AB* s1)//查找联系人
{
	char name[NAME];
	printf("请输入要查找的联系人");
	scanf("%s", name);
	int check= check_someone(s1, name);
	if (check == -1)
	{
		printf("此人不存在");
		return;
	}
	printf("名字       性别        电话号码         地址\n");
	printf("%-10s %-10s %-17s %-15s\n",
		s1->book[check].name,
		s1->book[check].sex,
		s1->book[check].number,
		s1->book[check].address);
}

效果
在这里插入图片描述

  1. 修改联系人
void modificabook(AB* s1)//修改联系人
{
	char name[NAME];
	printf("请输入要修改的联系人");
	scanf("%s", name);
	int check = check_someone(s1, name);
	if (check == -1)
	{
		printf("此人不存在");
		return;
	}
	printf("请输入名字\n");
	scanf("%s", s1->book[check].name);
	printf("请输入性别\n");
	scanf("%s", s1->book[check].sex);
	printf("请输入电话号码\n");
	scanf("%s", s1->book[check].number);
	printf("请输入地址\n");
	scanf("%s", s1->book[check].address);
	printf("修改成功!");
}

效果
在这里插入图片描述

  1. 显示联系人
void showbook(AB* s1)//显示联系人
{
	int i = 0;
	printf("%-10s %-5s %-12s %-30s\n", "姓名", "性别", "电话", "地址");
	for (i = 0; i <s1->size; i++)
	{
		printf("%-10s %-5s %-12s %-30s\n",
			s1->book[i].name,
			s1->book[i].sex,
			s1->book[i].number,
			s1->book[i].address);
	}
}

效果
在这里插入图片描述

  1. 对联系人排序
    (按姓名排序)
int cmp(void* e1, void* e2)
{
	return strcmp(((PS*)e1)->name, ((PS*)e2)->name);//按字典序排序
}
void sortbook(AB* s1)//对通讯录进行排序
{
	qsort(s1->book, s1->size, sizeof(PS), cmp);
	printf("排序成功!\n");
}

效果
在这里插入图片描述

完整代码

#pragma once//防止重复引用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME 10//这里使用宏定义最大数组长度,方便后续修改
#define SEX  5
#define NUMBER 15
#define ADDRESS 20
#define MAX_count 100

typedef struct preson
{
	char name[NAME];
	char sex[SEX];
	char number[NUMBER];
	char address[ADDRESS];
}PS;

typedef struct addressbook
{
	PS book[MAX_count];
	int size;
}AB;

void initiallize(AB* s1);//声明初始化

void addbook(AB* s1);//添加联系人

void deletebook(AB* s1);//删除联系人

void checkbook(AB* s1);//查找联系人

void modificabook(AB* s1);//修改联系人

void showbook(AB* s1);//显示联系人

void sortbook(AB* s1);//对通讯录进行排序

#include "addressbook.h"
void initiallize(AB* s1)//对通讯录进行初始化
{
	s1->size = 0;
	memset(s1->book, 0, sizeof(s1->book));
}
int check_someone(AB* s1,char*name)//找某人,按姓名找
{
	int i = 0;
	for (i = 0; i < s1->size; i++)
	{
		if (strcmp(s1->book[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void addbook(AB* s1)//添加联系人
{
	if (s1->size == MAX_count)
	{
		printf("通讯录已满,无法添加!");
		return;
	}
	printf("请输入名字\n");
	scanf("%s", s1->book[s1->size].name);
	printf("请输入性别\n");
	scanf("%s", s1->book[s1->size].sex);
	printf("请输入电话号码\n");
	scanf("%s", s1->book[s1->size].number);
	printf("请输入地址\n");
	scanf("%s", s1->book[s1->size].address);
	s1->size++;
	printf("添加成功!\n");
}
void deletebook(AB* s1)//删除联系人
{
	if (s1->size == 0)
	{
		printf("通讯录为空");
		return;
	}
	char name[NAME];
	printf("请输入要删除人的名字");
	scanf("%s", name);
	int check = check_someone(s1, name);
	if (check == -1)
	{
		printf("要删除的人不存在");
		return;
	}
	int i = check;
	for (i; i < s1->size - 1; i++)
	{
		s1->book[i] = s1->book[i + 1];
	}
	s1->size--;
	printf("删除成功");
}
void checkbook(AB* s1)//查找联系人
{
	char name[NAME];
	printf("请输入要查找的联系人");
	scanf("%s", name);
	int check= check_someone(s1, name);
	if (check == -1)
	{
		printf("此人不存在");
		return;
	}
	printf("名字       性别        电话号码         地址\n");
	printf("%-10s %-10s %-17s %-15s\n",
		s1->book[check].name,
		s1->book[check].sex,
		s1->book[check].number,
		s1->book[check].address);
}
void modificabook(AB* s1)//修改联系人
{
	char name[NAME];
	printf("请输入要修改的联系人");
	scanf("%s", name);
	int check = check_someone(s1, name);
	if (check == -1)
	{
		printf("此人不存在");
		return;
	}
	printf("请输入名字\n");
	scanf("%s", s1->book[check].name);
	printf("请输入性别\n");
	scanf("%s", s1->book[check].sex);
	printf("请输入电话号码\n");
	scanf("%s", s1->book[check].number);
	printf("请输入地址\n");
	scanf("%s", s1->book[check].address);
	printf("修改成功!");
}
void showbook(AB* s1)//显示联系人
{
	int i = 0;
	printf("%-10s %-5s %-12s %-30s\n", "姓名", "性别", "电话", "地址");
	for (i = 0; i <s1->size; i++)
	{
		printf("%-10s %-5s %-12s %-30s\n",
			s1->book[i].name,
			s1->book[i].sex,
			s1->book[i].number,
			s1->book[i].address);
	}
}
int cmp(void* e1, void* e2)
{
	return strcmp(((PS*)e1)->name, ((PS*)e2)->name);//按字典序排序
}
void sortbook(AB* s1)//对通讯录进行排序
{
	qsort(s1->book, s1->size, sizeof(PS), cmp);
	printf("排序成功!\n");
}

#include"addressbook.h"
void menu()
{
	printf("*********************************\n");
	printf("**    1.add          2.delete  **\n");
	printf("**    3.check        4.modifica**\n");
	printf("**    5.show         6.sort    **\n");
	printf("**    0.exit                   **\n");
}
enum options
{
	ADD=1,
	DELETE,
	CHECK,
	MODIFICA,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	AB s1;
	initiallize(&s1);
	printf("初始化完成");
	do
	{
		printf("请选择\n");
		menu();
		scanf("%d", &input);
		switch(input)
		{
			case ADD:
				addbook(&s1);//添加联系人
				break;
			case DELETE:
				deletebook(&s1);//删除联系人
				break;
			case CHECK:
				checkbook(&s1);//查找联系人
				break;
			case MODIFICA:
				modificabook(&s1);//修改联系人
				break;
			case SHOW:
				showbook(&s1);//显示联系人
				break;
			case SORT:
				sortbook(&s1);//对通讯录进行排序
				break;
			case 0:
				printf("退出通讯录");
				break;
			default:
				printf("选择错误,请重新选择");
				break;
		}
	} while (input);
}

以上为静态通讯录的实现,创作不易,请各位多多点赞,关注
,若有错误之处,还请各位斧正!

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值