通讯录(C语言版)(静态通讯录)

✨欢迎来到脑子不好的小菜鸟的文章✨

      🎈创作不易,麻烦点点赞哦🎈

          所属专栏:项目

          我的主页:脑子不好的小菜鸟

          文章特点:关键点和步骤讲解放在

          代码相应位置

 引言:

1.菜单

通讯录也如同游戏,需要菜单来供使用者选择,因此要用do...while...(第一次看我文章的小伙伴可以看看我这两篇文章啦:1.扫雷游戏(有讲解)-CSDN博客        2.猜数字游戏(C语言实现)-CSDN博客

2.功能总结

通讯录有很多功能,因此我们在做出它之前总结一下他的功能

1.添加联系人

2.删除联系人

3.查看联系人

4.查找联系人

5.排序联系人

(根据自己的需要,可以是电话号码从小到大,也可以是名字从小到大)

6.修改联系人

0.退出

(退出是退出循环,所以设为0合适)

文件准备:

与游戏一样,通常需要三个文件:

1.contact.h

包含函数的声明和某些重要量的定义,这些量定义在头文件中方便源文件的使用,也方便代码的统一修改,使之灵活(用define来说明,如:扫雷中的行和列(row和col))

2.contact.c

包含重要的函数实现部分

3.test.c

包含菜单和某些变量的定义(如:扫雷中的棋盘)

开始制作

1.菜单

还是熟悉的do...while...啦

//菜单
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;//重要变量
	char name[NAME_MAX] = { 0 };
    //变量创建
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

2.contact.h函数的实现

头文件中为函数类型的声明

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

3.contact.c函数的实现

初始化部分:

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

这里运用了memset函数,具体函数如图所示:

由图可知,需要包含头文件<string.h> ,

void* dest:要被初始化的地址(通常为数组名);

int c:用于初始化的数(该题初始化为0);

size_t count:被初始化的元素个数

注意:!!!!!!!

memset函数是以字节来赋值的,所以count部分都是用sizeof(...)来表示,()内为要被初始化的数组名

Add部分:

void Add(Contact* con)
{
	assert(con);
    //避免空指针,断言,记得包含头文件:<assert.h>

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	/*年龄不是数组,要取地址*/
	con->count++;
    /*记得++*/
}

Sort部分:

运用了qsort函数,具体可参考该文章:qsort函数的使用和模拟实现排序-CSDN博客

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
                /*比较的是字符串,要运用strcmp函数,记得头文件:<string.h>*/
                /*强制转换为结构体类型*/

   // return ((PeoInfo*)e1)->tele - ((PeoInfo*)e2)->tele);
    /*按照号码排序*/
}

void Sort(Contact* con)
{
	assert(con);

	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/

}

Show部分:

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

剩下的部分都要运用到查找部分,我将查找部分写为了FindPeo函数

FindPeo部分:

int FindPeo(Contact* con,char name[])
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)//如果名字相同,则返回下标
			return i;			
	}
	return -1;//未找到,返回-1
}

Del部分:

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

Search部分:

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

Modify部分:

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

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

好的,现在只需在test.c部分运用一些语句修饰就可以啦!

4.test.c函数的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

总结:

contact.h:

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

contact.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

void Add(Contact* con)
{
	assert(con);

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	//年龄不是数组,要取地址
	con->count++;
}

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

int FindPeo(Contact* con,char name[])/*!!!!!!!是数组啊,不是字符啊!!!!!!*/
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
			return i;			
	}
	return -1;
}

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
}

void Sort(Contact* con)
{
	assert(con);

	//pai_xu_by_name(con);
	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/
}

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

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

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

test.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

恭喜你啦,今天又进步了一点点~

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值