初代通讯录(详细讲解+代码)

1 阅读8分钟

 文章目录

  • 通讯录的介绍
  • c语言实现通讯录的步骤
  • 1、制作菜单
  • 2、.创建通讯录
  • 3、增加联系人
  • 4、打印通讯录
  • 5、删除联系人
  • 6、查找联系人
  • 7、修改联系人信息
  • 8、排列联系人信息

全部代码:

1、contact.h

2、contact.c

3、test.c


前言

学习了三子棋,扫雷后,我们今天来学习简单通讯录的创建。和这两个不同的是,简单通讯录相对来说简单一些。

ok,接下来让我们一起来对简单通讯录进行学习吧


​编辑

一、通讯录介绍

       通讯录作为通讯录地址的书本,当今的通讯录可以涵盖多项内容。如:姓名、电话号码、单位电话、移动电话、传真号、电子邮件、QQ、MSN、个人主页、公司、街道、邮编、生日、大头帖、车牌、银行帐号、俱乐部名称、爱好等等。

       而我们今天要制作的是简易通讯录,主要记录人的关键信息

主要功能有:

可以保存100个人的信息

1.添加联系人信息;                                2.删除联系人信息;

3.查找联系人信息;                                4.修改联系人信息;

5.显示联系人信息;                                6.排序联系人信息;

0.退出程序

二、c语言实现通讯录的步骤

0.将文件分成game.h,test.h,game.h进行分开编写的,能够更好的管理各个模块

​编辑

1.制作菜单

     和三子棋,扫雷一样,我们需要制作一个菜单来面向通讯录的各个功能。

​编辑

       使用枚举的特点来指向菜单的各个功能

enum
{
	Exit,//0
	Add,//1
	Del,//2
	Search,//3
	Modify,//4
	Show,//5
	Sort//6
};

​

       用do while循环实现菜单使用,switch语句进行菜单选择,然后进行调试观察菜单能不能正常打印

​编辑

​编辑

   菜单功能正常,让我们进行下一个环节

2.创建通讯录

    创建通讯录

​编辑

      定义通讯录和人的信息

​编辑

      初始化通讯录

​编辑

3、增加联系人

       先创建一个Add_Contact函数,将通讯录取地址传过去

​编辑

​编辑

        然后在contact.c文件中实现这个函数

​编辑

4、打印通讯录

       在我们添加联系人后,我们可以创建 一个函数Show_Contact将这个通讯录打印出来,观察信息有没有准确存放进通讯录里面。

      我们可以在各个信息的头部加上这些信息所属的类型,方便我们观看

      打印时注意可以使用%-s来进行左对齐,使其更加美观

​编辑

看一下效果图

​编辑

5、删除联系人

       我们创建一个Del_Contact(&con)函数,将con地址传过去,再判断通讯录是否为空

用一个for循环遍历通讯录找到你要删的那个人的坐标

​编辑

然后利用这个坐标,将这个坐标后的数据都往前移一下,执行sz-1-del次,这样就成功把要删除的那个人的信息删除了

​编辑

看一下成果

​编辑

​编辑

6、查找联系人

       先创建一个存放name的数组,用一个for循环遍历通讯录找到你要查找的那个人的坐标,然后通过那个坐标对联系人信息打印出来,这样就成功实现这一模块功能了

​编辑

​编辑

7、修改联系人信息

       先创建一个存放name的数组,用一个for循环遍历通讯录找到你要修改的那个人的坐标,然后通过那个坐标对联系人信息进行修改

​编辑

​编辑

​编辑

8、排列联系人信息

sqort是一个库函数,是基于快速排序算法实现的函数。

sqort函数可以排序任意类型的数据。

qsort函数可以实现对任意类型数据的排序,这里对结构排序,冒泡排序是排不了的,所以qsort函数正好可以解决这一问题,qsort需要 <stdlib.h> 这个头文件。

下面是对qsort函数的使用说明:

函数声明:

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

然后我们应用这个函数很快便能将这个通讯录信息排序这一功能创建出来,如下图所示:

​编辑

​编辑

​编辑

​编辑

全部代码:

1、contact.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<math.h>
#pragma once

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100

//定义人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//定义通讯录的信息
typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息
	int sz;//记录目前通讯录中存放的人的信息个数
}Contact;

//初始化通讯录
void Init_Contact(Contact* pc);
//增加联系人
void Add_Contact(Contact* pc);
//删除联系人
void Del_Contact(Contact* pc);
////查找联系人
void Search_Contact(Contact* pc);
////修改联系人信息
void Modify_Contact(Contact* pc);
////通讯录信息查看
void Show_Contact(Contact* pc);
////通讯录信息排列
void Sort_Contact(Contact* pc);

2、contact.c

#include"contact.h"


//初始化通讯录
void Init_Contact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));

}
//增加联系人
void Add_Contact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录满了,无法添加");
		return;
    }
	//添加一个联系人的信息
	//printf("请输入你要添加的联系人的信息:");
	//scanf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n", pc->data[pc->sz].name, pc->data[pc->sz].sex, &(pc->data[pc->sz].age), pc->data[pc->sz].tele, pc->data[pc->sz].addr);
	printf("请输入姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age)); 
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;

}
//删除联系人
void Del_Contact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除");
		return;

	}
	//不为空,删除
	printf("请输入要删除人的名字:");
	scanf("%s", name);
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			del = i;
			break;
		}
	}
	for (i = del; i < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];

	}
	pc->sz--;
	printf("已成功删除该联系人");

}
//查找联系人
void Search_Contact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空");
		return;
	}
	printf("请输入要查找的人的名字:");
	scanf("%s", name);
	int i = 0;
	int pos = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			pos = i;			
		}
	}
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].sex,
			pc->data[pos].age,
			pc->data[pos].tele,
			pc->data[pos].addr);
	



}
//修改联系人信息
void Modify_Contact(Contact* pc) 
{
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法修改");
		return;
	}
	printf("请输入要修改的人的名字:");
	scanf("%s", name);
	int i = 0;
	int pos = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			pos = i;
		}
	}
	printf("请输入姓名:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pos].addr);

}
//通讯录信息查看/打印通讯录
void Show_Contact(Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].addr);
	}

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

//通讯录信息排列
void Sort_Contact(Contact* pc)
{
	
		assert(pc);
		if (pc->sz == 0)
		{
			printf("通讯录为空,无法排序\n");
			return;
		}
		qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_name);
		printf("排序完成\n");
	
	


}

3、test.c

#include"contact.h"
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");
	
}
enum
{
	Exit,
	Add,
	Del,
	Search,
	Modify,
	Show,
	Sort
};

//directory
int main()
{//创建通讯录
	Contact con;
	Init_Contact(&con);
	int input = 0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);

		switch (input)
		{
		case Exit:printf("已退出通讯录\n");
			break; 
		case Add:Add_Contact(&con);
				break;
		case Del:Del_Contact(&con);
			break;
		case Search:Search_Contact(&con);
			break;
		case Modify:Modify_Contact(&con);
			break;
		case Show:Show_Contact(&con);
			break;
		case Sort:Sort_Contact(&con);
			break;
		default:printf("选择错误,请重新选择\n");
			break;
		}	
	} while (input);

	return 0;
}


总结

首先非常感谢大家的观看,这只是一个初步的通讯录

存在很多缺陷:

1.这个通讯录不能保存,一旦退出就消失了

2.这个通讯录固定了大小,开辟了100个联系人的空间,但实际上没有那么多,这样就浪费了很多的空间

有什么不足的地方可以提出来,我会虚心接受的,大家一起加油吧