首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通讯录(C语言版)(静态通讯录)

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

作者头像
脑子不好的小菜鸟
发布2024-03-25 15:20:49
发布2024-03-25 15:20:49
7230
举报
文章被收录于专栏:算法学习日常算法学习日常

引言:

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...啦

代码语言:javascript
复制
//菜单
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函数的实现

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

代码语言:javascript
复制
#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函数的实现

初始化部分:
代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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博客

代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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部分:
代码语言:javascript
复制
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函数的实现

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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;
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 引言:
    • 1.菜单
    • 2.功能总结
      • 1.添加联系人
      • 2.删除联系人
      • 3.查看联系人
      • 4.查找联系人
      • 5.排序联系人
      • 6.修改联系人
      • 0.退出
  • 文件准备:
    • 1.contact.h
    • 2.contact.c
    • 3.test.c
  • 开始制作
    • 1.菜单
    • 2.contact.h函数的实现
    • 3.contact.c函数的实现
      • 初始化部分:
      • Add部分:
      • Sort部分:
      • Show部分:
      • FindPeo部分:
      • Del部分:
      • Search部分:
      • Modify部分:
    • 4.test.c函数的实现
  • 总结:
    • contact.h:
    • contact.c:
    • test.c:
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档