c语言实现简易通讯录

  • Post author:
  • Post category:其他



目录


一、框架建设


1.模板


2.思路


二、具体函数实现方法


1.主逻辑


2.初始化通讯录


3.查找联系人


1.按名字查找联系人


2.按号码查找联系人


4.添加联系人


5.显示全部联系人


6.删除联系人


7.联系人排序


原型:int strcmp(const char *s1, const char *s2);


8. 修改联系人


三、代码部分


1.头文件、宏定义、结构体和函数声明


2.具体函数实现


3.主函数入口


四、运行截图


1.录入联系人信息


2.删除联系人


3.查找联系人


4.修改联系人信息


5.显示所有联系人


6.清空所有联系人


4.添加联系人


一、框架建设

1.模板

首先打开我们的手机通讯录,可以看到一系列的操作,简单的必备的如增加联系人、修改联系人、查找联系人啥的,那我们就可以用c语言模拟实现一下这些小功能(练练手)

<此处是一张通讯录界面图片,请自行脑补>

2.思路

首先我们打开软件是不是该有个图形化主界面呀,

然后在里面会有增加联系人、删除联系人之类的功能供用户选择使用

逻辑很简单,我就不阐述了,直接敲代码~

二、具体函数实现方法

提一句,为什么要分块封装函数呢?

原因是我们在开发程序的时候,某一个功能或是某一段代码需要重复使用,为了提高编写的效率以及代码的复用性和便于阅读代码查错等。

1.主逻辑

打开软件就要显示菜单界面,并且有相应的选项,而且是重复返回主菜单操作的,直接do~while

do~while语句是先执行一次循环后在判断后续是否继续执行

我们在里面调用了主界面menu()函数

然后switch判断用户输入的选项再跳转到子功能

void menu()

{


printf(“********************************************************\n”);

printf(“****************         通讯录         ****************\n”);

printf(“********************************************************\n”);

printf(“********         1.添加          2.删除         ********\n”);

printf(“********         3.查找          4.修改         ********\n”);

printf(“********         5.显示          6.清空         ********\n”);

printf(“********         7.排序          0.退出         ********\n”);

printf(“********************************************************\n”);

}

int main()

{


int input = 0;

Contact my_con;

InitContact(&my_con);

do

{


menu();//菜单显示界面

printf(“请选择:\n”);

scanf(“%d”, &input);

switch (input)

{


case 1://添加

AddContact(&my_con);

break;

case 2://删除

DelContact(&my_con);

break;

case 3://查找

SearchContact(&my_con);

break;

case 4://修改

ModifyContact(&my_con);

break;

case 5://显示

ShowContact(&my_con);

break;

case 6://清空

InitContact(&my_con);

break;

case 7://排序

SortContact(&my_con);

break;

case 0://退出

break;

default:

printf(“请重新输入!\n”);

break;

}

} while (input);

return 0;

}

函数主逻辑很简单,我就不讲了,实在看不懂打开手机通讯录自己琢磨去

2.初始化通讯录

memset()函数原型是extern void* memset(void* buffer, int c, int count)

//  buffer:为指针或是数组,

//c:是赋给buffer的值,

//count:是buffer的长度.

memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.

}

//初始化通讯录

void InitContact(pContact pc)

{


pc->count = 0;

memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.

}

3.查找联系人

首先,我们也需要用户输入待查找联系人的名字,如果存在此人我们就将其信息打印出来

void SearchContact(pContact pc)

{


char name[20];

char num[20];

int input = 0;

int ret = 0;

do

{


printf(“1.按照名字查找 2.按照号码查找 0.******返回\n”);

printf(“请选择:”);

scanf(“%d”, &input);

switch (input)

{


case 1:

printf(“请输入要查找的名字:”);

scanf(“%s”, &name);

ret = FindName(pc, name);

if (ret != -1)

{


printf(“姓名:%s\n”, pc->data[ret].name);

printf(“性别:%s\n”, pc->data[ret].sex);

printf(“年龄:%s\n”, pc->data[ret].age);

printf(“电话:%s\n”, pc->data[ret].telnum);

printf(“住址:%s\n”, pc->data[ret].address);

}

else

{


printf(“没找到,请确认是否输入正确!”);

}

break;

case 2:

printf(“请输入你要查找的号码:”);

scanf(“%s”, &num);

ret = FindName(pc, num);

if (ret != -1)

{


printf(“姓名:%s\n”, pc->data[ret].name);

printf(“性别:%s\n”, pc->data[ret].sex);

printf(“年龄:%s\n”, pc->data[ret].age);

printf(“电话:%s\n”, pc->data[ret].telnum);

printf(“住址:%s\n”, pc->data[ret].address);

}

else

{


printf(“没找到,请确认是否输入正确!”);

}

break;

case 0:

break;

default:

printf(“输入错误!\n”);

}

} while (input);

}

1.按名字查找联系人

遍历整个通讯录,判断通讯录里是否存在相同字符串,找到就返回位置坐标,没找到返回-1

int FindName(pContact pc ,char* name)

{


int i = 0;

for (i = 0; i < pc->count; i++)

{


if (strcmp(pc->data[i].name, name) == 0)//查找名字,有返回下标,无返回-1

{


return i;

}

}

return-1;

}

2.按号码查找联系人

遍历整个通讯录,判断通讯录里是否存在相同字符串,找到就返回位置坐标,没找到返回-1

int FindNum(pContact pc, char* num)

{


int i = 0;

for (i = 0; i < pc->count; i++)

{


if (strcmp(pc->data[i].telnum, num))//查找号码,有返回下标,无返回-1

{


return i;

}

}

return -1;

}

4.添加联系人

先判断通讯录是否已满,满了给出提示

没满让用户输入姓名、电话号码等

先用结构体指针访问结构体数组再定位到count处,录入数据后count自增1,指向下一坐标处

(也不知道我这么理解对不对,哈哈)

void AddContact(pContact pc)

{


if (pc->count == MAX)//判断通讯录是否已满

{


printf(“通讯录已满!\n”);

return;

}

else

{


printf(“姓名:”);

scanf(” %s”,pc->data[pc->count].name);

printf(“性别:”);

scanf(” %s”,pc->data[pc->count].sex);

printf(“年龄:”);

scanf(” %d”,&(pc->data[pc->count].age));

printf(“电话:”);

scanf(” %s”,pc->data[pc->count].telnum);

printf(“住址:”);

scanf(” %s”,pc->data[pc->count].address);

pc->count++;

}

}

5.显示全部联系人

如果通讯录为空提示为空,就没必要打印;反之遍历打印出结构体数组中不为0的元素(结构体)

void ShowContact(pContact pc)

{


int i = 0;

if (pc->count == 0)

{


printf(“通讯录为空!\n”);

}

for (i = 0; i < pc->count; i++)

{


printf(“姓名:%s\n”, pc->data[i].name);

printf(“性别:%s\n”, pc->data[i].sex);

printf(“年龄:%d\n”, pc->data[i].age);

printf(“电话:%s\n”, pc->data[i].telnum);

printf(“家庭住址:%s\n”, pc->data[i].address);

}

printf(“\n”);

}

6.删除联系人

思路一样先看通讯录里是否有数据,没有的话删什么呢(0 :)

然后嵌套使用上边的,查找联系人函数

如果没找到,提示用户没找到

找到提示用户是否要删除该联系人

然后执行如下操作,用后面一个元素覆盖前一个元素,循环执行操作直到最后一个元素往前覆盖完成后,将联系人个数减一。




实现代码 :

void DelContact(pContact pc)

{


char name[20] = { 0 };

int ret = 0;

int n = 0;

int i = 0;

if (pc->count == 0)

printf(“通讯录为空\n”);

else

{


printf(“输入要删除人的姓名:”);

scanf(“%s”, name);

ret = FindName(pc, name);

if (ret != -1)

{


printf(“是否要删除该联系人?\n”);

printf(“确定选择1,取消请选择0\n”);

scanf(“%d”, &n);

if (n == 1)

{


for (i = ret; i < pc->count – 1; i++)

{


pc->data[i] = pc->data[i + 1];//朝前覆盖,完成删除。

}

pc->count–;

printf(“删除成功\n”);

}

else

{


printf(“删除失败\n”);

}

}

else

{


printf(“你要删除的联系人不存在\n”);

}

}

}

7.联系人排序

使用字符串比较函数实现排序功能(升序判断条件大于0;降序反过来小于0)

原型:int strcmp(const char *s1, const char *s2);

参数:s1、s2为两个进行比较的字符串

返回值:若s1、s2字符串相等,则返回零;若s1大于s2,则返回大于零的数;否则,则返回小于零的数。

说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。

void SortContact(pContact pc)

{


int i = 0;

for (i = 0; i < (pc->count) – 1; i++)

{


if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)

{


peoinfor tmp;

tmp = pc->data[i];

pc->data[i] = pc->data[i + 1];

pc->data[i + 1] = tmp;

}

}

}

8. 修改联系人

要修改联系人只要先在通讯录中找到该联系人

然后重新录入一遍就🆗啦

void ModifyContact(pContact pc)

{


char name[20] = { 0 };

int ret = 0;

int input = 0;

printf(“请输入你要修改联系人的姓名:”);

scanf(“%s”, name);

ret = FindName(pc, name);

if (ret != -1)

{


do

{


printf(“*************************\n”);

printf(“*** 1.姓名     2.性别 ***\n”);

printf(“*** 3.年龄     4.电话 ***\n”);

printf(“*** 5.家庭住址 0.返回 ***\n”);

printf(“*************************\n”);

printf(“请输入你要修改的选项”);

scanf(“%d”, &input);

switch (input)

{


case 1:

printf(“名字:”);

scanf(“%s”, pc->data[ret].name);

break;

case 2:

printf(“性别:”);

scanf(“%s”, pc->data[ret].sex);

break;

case 3:

printf(“年龄:”);

scanf(“%d”, &(pc->data[ret].age));

break;

case 4:

printf(“电话:”);

scanf(“%s”, pc->data[ret].telnum);

break;

case 5:

printf(“住址:”);

scanf(“%s”, pc->data[ret].address);

break;

case 0:

break;

default:

printf(“输入有误请重新输入\n”);

break;

}

} while (input);

}

else

printf(“联系人不存在\n”);

}

三、代码部分

1.头文件、宏定义、结构体和函数声明

#pragma once
#ifndef __CONTACT_H__
#define __CONTACT_H__

#define  _CRT_SECURE_NO_WARNINGS


//声明c库函数的头文件

# include <stdio.h>
# include <stdlib.h>


//定义相关量的宏

#define MAX_NAME 20

#define MAX 1000

#define MAX_SEX 5

#define MAX_ADDRESS 40

#define MAX_TELNUM 20



//函数声明

enum condition//枚举
{
	//枚举数据表
	EXIT,//退出
	ADD,//添加
	DEL,//删除
	SERACH,//查找
	MODIFY,//修改
	SHOW,//显示
	EMPTY,//清空
	SORT//排序
};

typedef struct PeoInfor//声明一个结构体
{
	char name[MAX_NAME];//姓名
	char sex[MAX_SEX];//性别
	int age;//年龄
	char telnum[MAX_TELNUM];//手机号码
	char address[MAX_ADDRESS];//住址
}peoinfor;//用这个结构体类型创建了一个全局结构体变量peoinfor

typedef struct Contact//
{
	peoinfor data[MAX];
	int count;
}Contact,*pContact;

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

//查找
int FindName(pContact pc, char* name);
int FindNum(pContact pc, int num);

//添加联系人
void AddContact(pContact pc);

//删除联系人
void DelContact(pContact pc);

//查找联系人
void SearchContact(pContact pc);

//按名字排序
void SortContact(pContact pc);

//修改联系人
void ModifyContact(pContact pc);

#endif

2.具体函数实现

#include"contact.h"

void InitContact(pContact pc)
{
	//初始化通讯录
	pc->count = 0;
	//memset()函数原型是extern void* memset(void* buffer, int c, int count)      
		//  buffer:为指针或是数组,
		//c:是赋给buffer的值,
		//count:是buffer的长度.
	memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.
}

//名字查找
int FindName(pContact pc ,char* name)
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//查找名字,有返回下标,无返回-1
		{
			return i;
		}
	}
	return-1;
}

//号码查找
int FindNum(pContact pc, char* num)
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (strcmp(pc->data[i].telnum, num))//查找号码,有返回下标,无返回-1
		{
			return i;
		}
	}
	return -1;
}

//添加联系人
void AddContact(pContact pc)
{
	if (pc->count == MAX)//判断通讯录是否已满
	{
		printf("通讯录已满!\n");
		return;
	}
	else
	{
		printf("姓名:");
		scanf(" %s",pc->data[pc->count].name);
		printf("性别:");
		scanf(" %s",pc->data[pc->count].sex);
		printf("年龄:");
		scanf(" %d",&(pc->data[pc->count].age));
		printf("电话:");
		scanf(" %s",pc->data[pc->count].telnum);
		printf("住址:");
		scanf(" %s",pc->data[pc->count].address);
		pc->count++;
	}
}

//显示全部联系人
void ShowContact(pContact pc)
{
	int i = 0;
	if (pc->count == 0)
	{
		printf("通讯录为空!\n");
	}
	for (i = 0; i < pc->count; i++)
	{
		printf("姓名:%s\n", pc->data[i].name);
		printf("性别:%s\n", pc->data[i].sex);
		printf("年龄:%d\n", pc->data[i].age);
		printf("电话:%s\n", pc->data[i].telnum);
		printf("家庭住址:%s\n", pc->data[i].address);
	}
	printf("\n");
}

//删除联系人
void DelContact(pContact pc)
{
	char name[20] = { 0 };
	int ret = 0;
	int n = 0;
	int i = 0;
	if (pc->count == 0)
		printf("通讯录为空\n");
	else
	{
		printf("输入要删除人的姓名:");
		scanf("%s", name);
		ret = FindName(pc, name);
		if (ret != -1)
		{
			printf("是否要删除该联系人?\n");
			printf("确定选择1,取消请选择0\n");
			scanf("%d", &n);
			if (n == 1)
			{
				for (i = ret; i < pc->count - 1; i++)
				{
					pc->data[i] = pc->data[i + 1];//朝前覆盖,完成删除。
				}
				pc->count--;
				printf("删除成功\n");
			}
			else
			{
				printf("删除失败\n");
			}
		}
		else
		{
			printf("你要删除的联系人不存在\n");
		}
	}
}

//查找联系人
void SearchContact(pContact pc)
{
	char name[20];
	char num[20];
	int input = 0;
	int ret = 0;

	do
	{
		printf("1.按照名字查找 2.按照号码查找 0.******返回\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入要查找的名字:");
			scanf("%s", &name);
			ret = FindName(pc, name);
			if (ret != -1)
			{
				printf("姓名:%s\n", pc->data[ret].name);
				printf("性别:%s\n", pc->data[ret].sex);
				printf("年龄:%s\n", pc->data[ret].age);
				printf("电话:%s\n", pc->data[ret].telnum);
				printf("住址:%s\n", pc->data[ret].address);
			}
			else
			{
				printf("没找到,请确认是否输入正确!");
			}
			break;
		case 2:
			printf("请输入你要查找的号码:");
			scanf("%s", &num);
			ret = FindName(pc, num);
			if (ret != -1)
			{
				printf("姓名:%s\n", pc->data[ret].name);
				printf("性别:%s\n", pc->data[ret].sex);
				printf("年龄:%s\n", pc->data[ret].age);
				printf("电话:%s\n", pc->data[ret].telnum);
				printf("住址:%s\n", pc->data[ret].address);
			}
			else
			{
				printf("没找到,请确认是否输入正确!");
			}
			break;
		case 0:

			break;
		default:
			printf("输入错误!\n");
		}

	} while (input);
}
//联系人排序
void SortContact(pContact pc)
{
	int i = 0;
	for (i = 0; i < (pc->count) - 1; i++)
	{
		if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)
		{
			peoinfor tmp;
			tmp = pc->data[i];
			pc->data[i] = pc->data[i + 1];
			pc->data[i + 1] = tmp;
		}
	}
}
//修改联系人
void ModifyContact(pContact pc)
{
	char name[20] = { 0 };
	int ret = 0;
	int input = 0;
	printf("请输入你要修改联系人的姓名:");
	scanf("%s", name);
	ret = FindName(pc, name);
	if (ret != -1)
	{
		do
		{
			printf("*************************\n");
			printf("*** 1.姓名     2.性别 ***\n");
			printf("*** 3.年龄     4.电话 ***\n");
			printf("*** 5.家庭住址 0.返回 ***\n");
			printf("*************************\n");
			printf("请输入你要修改的选项");
			scanf("%d", &input);
			switch (input)
			{
			case 1:
				printf("名字:");
				scanf("%s", pc->data[ret].name);
				break;
			case 2:
				printf("性别:");
				scanf("%s", pc->data[ret].sex);
				break;
			case 3:
				printf("年龄:");
				scanf("%d", &(pc->data[ret].age));
				break;
			case 4:
				printf("电话:");
				scanf("%s", pc->data[ret].telnum);
				break;
			case 5:
				printf("住址:");
				scanf("%s", pc->data[ret].address);
				break;
			case 0:
				break;
			default:
				printf("输入有误请重新输入\n");
				break;
			}
		} while (input);
	}
	else
		printf("联系人不存在\n");
}

3.主函数入口

#include"contact.h"

void menu()
{
	printf("********************************************************\n");
	printf("****************         通讯录         ****************\n");
	printf("********************************************************\n");
	printf("********         1.添加          2.删除         ********\n");
	printf("********         3.查找          4.修改         ********\n");
	printf("********         5.显示          6.清空         ********\n");
	printf("********         7.排序          0.退出         ********\n");
	printf("********************************************************\n");

}

int main()
{
	int input = 0;
	Contact my_con;
	InitContact(&my_con);
	do
	{
		menu();//菜单显示界面
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1://添加
			AddContact(&my_con);
			break;
		case 2://删除
			DelContact(&my_con);
			break;
		case 3://查找
			SearchContact(&my_con);
			break;
		case 4://修改
			ModifyContact(&my_con);
			break;
		case 5://显示
			ShowContact(&my_con);
			break;
		case 6://清空
			InitContact(&my_con);
			break;
		case 7://排序
			SortContact(&my_con);
			break;
		case 0://退出
			break;
		default:
			printf("请重新输入!\n");
			break;
		}
	} while (input);

	return 0;
}

四、运行截图

1.录入联系人信息




2.删除联系人




3.查找联系人




4.修改联系人信息




5.显示所有联系人




6.清空所有联系人




7.排序




本来是不想写博客的,朋友跟我说:码完代码不写博客等于没码~



版权声明:本文为a15398726263原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。