【萌新学习C语言】如何模块化创建静态的通讯录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
【萌新学习C语言】如何模块化创建静态的通讯录(编译器:vs2022)
有以下功能:
通讯录
人的信息:名字+年龄+性别+电话+地址
1.存放100个人的信息
2.增加联系人
3.删除指定联系人
4.查找联系人
5.修改联系人
6.排序
7.显示联系人


提示:以下是本篇文章正文内容,下面案例可供参考

一、模块化设计

创建test.c源文件来存放main函数
创建contact.c源文件来存放关于实现通讯录的函数
创建contact.h头文件来对函数进行声明

二、通讯录实现步骤

1.创建处通讯录界面菜单函数menu

  1. 在test.c文件中
  2. 创建出menu函数并通过输入0-7来实现功能

menu函数代码如下(示例):

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");

}

main函数代码如下:

int main()
{
	int input = 0;
	do
	{
		menu();
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			printf("Add\n");
			break;
		case 2:
			printf("Del\n");
			break;
		case 3:
			printf("Search\n");
			break;
		case 4:
			printf("Modify\n");
			break;
		case 5:
			printf("Show\n");
			break;
		case 6:
			printf("Sort");
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入非法,请重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

main函数里的printf函数只是方便用于调试,看代码是否异常,后面会删除。

调试结果如下:
在这里插入图片描述

2.创建联系人信息及通讯录

  1. 在contact.h文件中 人的信息:名字+年龄+性别+电话+地址
  2. 用结构体来创建一个联系人的类型。
  3. 再用一个结构体来创建通讯录,通讯录里包括联系人和联系人的总数。
#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];
	int count;
}Contact;

3…初始化通讯录

  • 在contact.c文件
  • 将通讯录初始化为0

代码如下(示例):

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

初始化后:
在这里插入图片描述

4. 对通讯录进行添加操作

  • 写在contact.c文件中
  • Add

代码如下:

//添加联系人
void Add(Contact* pc)
{
	assert(pc);
	//判断通讯录是否已经满了
	if (pc->count == Max)
	{
		printf("通讯录已满,添加失败\n");
		return;
	}
	//添加联系人
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);

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

}

调试如下:
在这里插入图片描述

5.对通讯录进行显示操作

  • 写在contact.c文件中
  • Show
//显示联系人
void Show(const Contact* pc)
{
	assert(pc);

	int i = 0;
	printf("%-20s%-10s%-10s%-12s%-30s\n",   "姓名", 
											"年龄", 
											"性别", 
											"电话", 
											"地址");
	for (i = 0; i < pc->count; i++)
	{
		printf("%-20s%-10d%-10s%-12s%-30s\n",   pc->data[i].name,
												pc->data[i].age,
												pc->data[i].sex,
												pc->data[i].tele,
												pc->data[i].addr);
	}
}

调试如下:
在这里插入图片描述

6.对通讯录进行删除操作

  • 写在contact.c文件中
  • Del
//查找联系人
int FindByName(const Contact* pc)
{
	assert(pc);

	char name[Max_name] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", &name);
	int i = 0;
	for (i = 0; i <= pc->count-1; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除联系人
void Del(Contact* pc)
{	
	assert(pc);

	int i = 0;
	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	
	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//删除联系人
	for (i = pos; i <= pc->count-1 ; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->count--;
	printf("删除成功\n");
}

调试如下:
在这里插入图片描述

7.对通讯录进行查找操作

  • 写在contact.c文件中
  • Search
void Search(Contact* pc)
{
	assert(pc);

	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//打印联系人
	printf("%-20s%-10s%-10s%-12s%-30s\n",    "姓名",
											 "年龄",
											 "性别",
											 "电话",
											 "地址");
	printf("%-20s%-10d%-10s%-12s%-30s\n",   pc->data[pos].name,
											pc->data[pos].age,
											pc->data[pos].sex,
											pc->data[pos].tele,
											pc->data[pos].addr);
}

调试如下:
在这里插入图片描述

7.对通讯录进行修改操作

  • 写在contact.c文件中
  • Modify
//修改联系人
void Modify(Contact* pc)
{
	assert(pc);

	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//修改联系人
	printf("请输入姓名:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pos].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);

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

调试如下:
在这里插入图片描述

8.对通讯录进行排序操作

  • 写在contact.c文件中
  • Sort
  • 这里只实现按照姓名排序
//比较姓名大小
int CmpName(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按照姓名排序联系人
void Sort(Contact* pc)
{
	assert(pc);
	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	//按照姓名排序
	qsort(pc->data, pc->count, sizeof(PeoInfo), CmpName);
	printf("排序完成\n");
}

调试如下:
在这里插入图片描述

3.通讯录全代码如下

  • test.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();
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Del(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			Show(&con);
			break;
		case 6:
			Sort(&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 Add(Contact* pc)
{
	assert(pc);
	//判断通讯录是否已经满了
	if (pc->count == Max)
	{
		printf("通讯录已满,添加失败\n");
		return;
	}

	//添加联系人
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);

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

}



//显示联系人
void Show(const Contact* pc)
{
	assert(pc);

	int i = 0;
	printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->count; i++)
	{
		printf("%-20s%-10d%-10s%-12s%-30s\n",  pc->data[i].name,
										pc->data[i].age,
										pc->data[i].sex,
										pc->data[i].tele,
										pc->data[i].addr);
	}
}



//查找联系人
int FindByName(const Contact* pc)
{
	assert(pc);

	char name[Max_name] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", &name);
	int i = 0;
	for (i = 0; i <= pc->count-1; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}


//删除联系人
void Del(Contact* pc)
{	
	assert(pc);

	int i = 0;
	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	
	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//删除联系人
	for (i = pos; i <= pc->count-1 ; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}

	pc->count--;
	printf("删除成功\n");
}



//查找联系人
void Search(Contact* pc)
{
	assert(pc);
	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//打印联系人
	printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s%-10d%-10s%-12s%-30s\n",   pc->data[pos].name,
											pc->data[pos].age,
											pc->data[pos].sex,
											pc->data[pos].tele,
											pc->data[pos].addr);
}



//修改联系人
void Modify(Contact* pc)
{
	assert(pc);

	//查找联系人
	int pos = FindByName(pc);
	if (pos == -1)
	{
		printf("该联系人不存在\n");
		return;
	}
	//修改联系人
	printf("请输入姓名:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pos].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);

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



//比较姓名大小
int CmpName(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按照姓名排序联系人
void Sort(Contact* pc)
{
	assert(pc);
	//判断通讯录是否为空
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	//按照姓名排序
	qsort(pc->data, pc->count, sizeof(PeoInfo), CmpName);
	printf("排序完成\n");
}

  • contact.h文件下
#define _CRT_SECURE_NO_WARNINGS 1
#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];
	int count;
}Contact;



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


//添加联系人
void Add(Contact* pc);


//显示联系人
void Show(const Contact* pc);


//删除联系人
void Del(Contact* pc);

//查找联系人
void Search(Contact* pc);

//修改联系人
void Modify(Contact*pc);

//按照姓名排序联系人
void Sort(Contact* pc);




  • 25
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值