欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

地址簿实现(静态版本、动态版本、文件版本)(含完整源代码) - I. 静态版本

最编程 2024-03-19 15:49:59
...

1.所需要的功能

对于通讯录来说,我们需要它实现以下几个功能。

1.人的信息:姓名+年龄+性别+电话+地址。
2.可以存放100个人的信息。
功能:
1>增加联系人。
2>删除联系人。
3>查找指定联系人信息。
4>修改指定联系人信息。
5>显示所有联系人信息。
6>按名字排序。

接下来分为三个模块,test.c->用来测试通讯录;contact.c->通讯录主体部分;contact.h->用于函数的声明。

2.大致菜单

#include"contact.h"


void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.删除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	do
	{
		menu();
		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;
}

这一块很简单,就不再多说。菜单是属于测试部分,所以我将它放入test.c文件里。

3.创建通讯录

对于一个人,肯定有多方面的因数,所以将其封装在一个结构体内。这里使用到typedef,如果不太熟悉可以看看这篇博客typedef的使用

在这里插入图片描述

接下来,再封装一个结构体里面存放100个人的信息和当前人的个数。

在这里插入图片描述

接着在主函数里使用该结构体创建通讯录。然后进行初始化。

在这里插入图片描述

初始化函数在contact.h里声明。

在这里插入图片描述

在contact.c里实现,需要使用到memset,如果不太明白可以看看这篇博客memset如何使用

在这里插入图片描述

4.增加联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里面实现。
在这里插入图片描述

5.显示联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。这里使用到\t,向后隔开8个字节,用于分隔。同时例如%-20s是右边隔开20个字节,也就是进行左对齐。

在这里插入图片描述

在这里插入图片描述

6.查找联系人

我们发现无论是查找,删除还是修改都需要先找到这个人。所以我们干脆将寻找封装成一个函数来使用。我们通过名字来查找(需要使用strcmp,如果不熟悉可以看看这篇博客strcmp的使用

在这里插入图片描述

完成后正式进行查找。

在这里插入图片描述

老规矩,现在contact.h里进行声明。ps:前面的find不用声明是因为find只在contact.c里使用。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

7.删除联系人

这里采用一种最简单的方法,就是从后往前依次覆盖。首先找到该名字的位置,然后依次将后面的往前挪。

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

8.修改联系人

在这里插入图片描述

老规矩在contact.h里进行声明。

在这里插入图片描述

在contact.c里实现。修改其实就是重新录入,找到位置,重新写一遍就好了。

在这里插入图片描述

9.按名字排序

下面排序需要使用到qsort函数。如果不太熟悉可以看看这篇博客qsort函数

在这里插入图片描述

老规矩在contact.h里声明。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

好了,以上就是通讯录静态版本的实现功能啦,下面是源代码。

10.源代码

test.c

#include"contact.h"
void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.删除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      6.排序 ******\n");
	printf("*******0.退出             ******\n");
	printf("********************************\n");

}
int main()
{
	int input = 0;
	//创建通讯录
	Contact con;//该结构体包含100个人的信息和已填充人的个数
	//初始化通讯录
	InitContact(&con);//结构体传参
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			Dlete(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			Order(&con);
			break;
		case 0:
			printf("退出通讯录。\n");
			break;
		default:
			printf("输入无效,请重新输入。\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

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


//人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[100];//存放人的信息
	int sz;//当前已经放的信息个数
}Contact;//同理,这里也进行了重命名


//声明初始化函数
void InitContact(Contact* pc);

//声明增加联系人函数
void AddContact(Contact*pc);

//声明显示联系人函数
void ShowContact(const Contact*pc);

//声明查找函数
void Search(const Contact*pc);//查找依然不会改变,所以加上const

//声明删除函数
void Dlete(Contact*pc);

//声明修改函数
void Modify(Contact*pc);

//声明排序函数
void Order(Contact*pc);

contact.c

#include"contact.h"



//初始化函数的实现
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}


//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);//一个好的习惯判断是否为空指针(当然不加也没影响)
	if (pc->sz == 100)
	{
		printf("通讯录已满,无法添加。\n");
		return;
	}
	//开始添加信息
	printf("请输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;//别忘了添加完一个人后向后走一步

}


//显示联系人
void ShowContact(const Contact* pc)//因为显示不会改变元素,所以最好加上const
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");//提示
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
													pc->data[i].age,
													pc->data[i].sex,
													pc->data[i].addr,
													pc->data[i].tele);
	}
}


//找到特定联系人的位置
int FindByName(const Contact* pc, char name[])//两个参数,一个是通讯录里存的名字,一个是你要查找的名字
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到返回下标
		}
	}
	return -1;//没找到,返回-1
}


//查找
void Search(const Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要查找的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("查无此人。\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}



//删除
void Dlete(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要删除的名字:");
	scanf("%s", name);
	int dle = FindByName(pc, name);//找到位置
	if (dle == -1)
	{
		printf("查无此人。\n");
		return;
	}
	for (int i = dle; i < pc->sz-1; i++)//从后往前覆盖,同时-1避免越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//删除完成后别忘了个数-1
	printf("删除成功\n");
}



//修改
void Modify(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要修改的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("查无此人\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);

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

//排序
int cmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Order(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp);
	printf("排序成功\n");
}