c语言实现简单通讯录

发布于:2022-12-26 ⋅ 阅读:(401) ⋅ 点赞:(0)

c语言实现一个简单通讯录

需求:
1.需要存放的人员信息:姓名,年龄,性别,电话,住址
2.可以存放100个人的信息
3.可以增加联系人
4.可以删除指定联系人
5.可以查找联系人
6.可以修改联系人
7.对联系人信息进行排序
8.显示联系人信息

源文件与头文件
text.c 测试功能
contact.c 通讯录相关的实现
contact.h 通讯录相关的声明

1.主框架实现
使用简易菜单来完成各个部分功能的实现

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

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择-->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;

		}
	} while (input);
	return 0;
}

2.在头文件中封装一个结构体存放人的信息,一个结构体存放通讯录信息

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30


typedef struct PeoInfo//人的信息
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//存放100个人的信息
	int count;//记录当前通讯录有多少个信息
}Contact;

之后在源文件中创建一个通讯录

Contact con;

3.函数实现初始化通讯录

InitContact(&con);
void InitContact(Contact* pc)//初始化通讯录
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

4.函数实现增加联系人信息

case 1:
			AddContact(&con);
			break;
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	else
	{
		printf("请输入名字->\n");
		scanf("%s", pc->data[pc->count].name);
		printf("请输入年龄->\n");
		scanf("%d", &(pc->data[pc->count].age));
		printf("请输入性别->\n");
		scanf("%s", pc->data[pc->count].sex);
		printf("请输入电话->\n");
		scanf("%s", pc->data[pc->count].tele);
		printf("请输入地址->\n");
		scanf("%s", pc->data[pc->count].addr);

		pc->count++;
		printf("增加成功\n");
	}
}

5.函数实现显示通讯录信息

case 5:
			ShowContact(&con);
			break;
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n",
		 "姓名", "年龄", "性别", "电话", "地址");
	//-号进行左对齐
	for (i=0;i<pc->count;i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

6.函数实现删除指定联系人信息

case 2:
			DelContact(&con);
			break;
/ 设置函数来寻找特定信息
static int FindByName(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//删除指定联系人信息
void DelContact(Contact* pc) 
{
	char name[MAX_NAME] = { 0 };
	assert(pc);
	int i = 0;
	if (pc->count == 0)
	{
		printf("通讯录为空,没有信息可以删除\n");
	}
	printf("请输入要删除的人的姓名\n");
	scanf("%s", name);
		//删除
		//1.查找
		int pos = FindByName(pc, name);//返回下标
	if (pos == -1)
	{
		printf("要删除的不存在\n");
			return;
	}
	//2,删除
	for (i = pos; i < pc->count-1; i++)
	{
		pc->data[i] = pc->data[i + 1];//采用后面的数据来屏蔽前面的数据来完成对数据的删除
	}
	pc->count--;//最后一个不打印出来
	printf("删除成功\n");
}

7.函数实现查找指定联系人信息

case 3:
			SearchContact(&con);
			break;
// 设置函数来寻找特定信息
static int FindByName(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//查找指定联系人信息
void SearchContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	assert(pc);
	printf("请输入要查找的人的姓名\n");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);//返回下标
	if (pos == -1)
	{
		printf("要查找的信息不存在\n");
		return;
	}
	//2.打印
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", 
		"姓名", "年龄", "性别", "电话", "地址");
		//-号进行左对齐
		
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",
				pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
	
	}
}

8.函数实现改变联系人的信息

case 4:
			ModifyContact(&con);
			break;
static int FindByName(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	assert(pc);
	printf("请输入要修改的人的姓名\n");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的信息不存在\n");
		return;
	}
	printf("要修改的人的信息已经找到,开始修改");
	//2.修改(重新录入)
	printf("请输入名字->\n");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄->\n");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别->\n");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话->\n");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址->\n");
	scanf("%s", pc->data[pos].addr);

	printf("修改成功\n");
}

9.函数实现按名称排序

case 6:
			SortContact(&con);
			break;
//排序(按照名字来排序)
int cmp_peo_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}


void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);
	printf("排序成功\n");
}

完整代码如下
contact.h

#pragma once
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include<stdlib.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30


typedef struct PeoInfo//人的信息
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//存放100个人的信息
	int count;//记录当前通讯录有多少个信息
}Contact;

//初始化通讯录
void InitContact(Contact* pc);

//增加联系人通讯录
void AddContact(Contact* pc);

//显示联系人信息
void ShowContact(const Contact* pc);//不加以修改,使用const修饰

//删除指定联系人信息
void DelContact(Contact* pc);

//查找指定联系人信息
void SearchContact(Contact* pc);

//修改联系人信息
void ModifyContact(Contact* pc);

//排序
void SortContact(Contact* pc);

text.c

#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("****** 0.exit          *********\n");
	printf("********************************\n");
	
}

int main()
{
	int input = 0;
	Contact con;//创建一个通讯录
	InitContact(&con);//初始化通讯录函数:为实现模块化所以将每一块功能实现都分装开来

	do
	{
		menu();
		printf("请选择-->");
		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 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;

		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

//增加通讯录信息
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	else
	{
		printf("请输入名字->\n");
		scanf("%s", pc->data[pc->count].name);
		printf("请输入年龄->\n");
		scanf("%d", &(pc->data[pc->count].age));
		printf("请输入性别->\n");
		scanf("%s", pc->data[pc->count].sex);
		printf("请输入电话->\n");
		scanf("%s", pc->data[pc->count].tele);
		printf("请输入地址->\n");
		scanf("%s", pc->data[pc->count].addr);

		pc->count++;
		printf("增加成功\n");
	}
}


//显示通讯录信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	//-号进行左对齐
	for (i=0;i<pc->count;i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

// 设置函数来寻找特定信息
static int FindByName(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}


//删除指定联系人信息
void DelContact(Contact* pc) 
{
	char name[MAX_NAME] = { 0 };
	assert(pc);
	int i = 0;
	if (pc->count == 0)
	{
		printf("通讯录为空,没有信息可以删除\n");
	}
	printf("请输入要删除的人的姓名\n");
	scanf("%s", name);
		//删除
		//1.查找
		int pos = FindByName(pc, name);//返回下标
	if (pos == -1)
	{
		printf("要删除的不存在\n");
			return;
	}
	//2,删除
	for (i = pos; i < pc->count-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->count--;
	printf("删除成功\n");
}


//查找指定联系人信息
void SearchContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	assert(pc);
	printf("请输入要查找的人的姓名\n");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);//返回下标
	if (pos == -1)
	{
		printf("要查找的信息不存在\n");
		return;
	}
	//2.打印
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
		//-号进行左对齐
		
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",
				pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
	
	}
}


void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	assert(pc);
	printf("请输入要修改的人的姓名\n");
	scanf("%s", name);
	//1.查找
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的信息不存在\n");
		return;
	}
	printf("要修改的人的信息已经找到,开始修改");
	//2.修改(重新录入)
	printf("请输入名字->\n");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄->\n");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别->\n");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话->\n");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址->\n");
	scanf("%s", pc->data[pos].addr);

	printf("修改成功\n");
}

//排序(按照名字来排序)
int cmp_peo_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}


void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);
	printf("排序成功\n");
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到