适合大学生课设的通讯录

**

适合大学生课设的通讯录

一.通讯录实现步骤

1. 详解做法思路

首先,通讯录需要一个人的基本信息,像姓名,电话,住址,年龄等等,,所以对于一个对象我们需要创建结构体来存储这些信息

typedef struct information
{
	char name[NAME_MAX];
    int age;
	char phone[PHONE_MAX];
	char address[ADDESS_MAX];
}information;

由于有很多人的信息,所以我们需要定义一个数组,类型就是我们上面定义的这个结构体类型,但是我们因为要记录有多少个人(对于方便增删查改来说),所以要定义一个变量来记录我们现在数组里有多少人
information pb[100]; int sz = 0;
但是想一想是不是我们一修改信息,sz也会发生改变,所以我们为了方便,把它两合并在一起,在封装一个结构体:Contact

	typedef struct Contact
{
	information data[MAX];
	int sz;
}Contact;

这样我们就更加方便了,然后就基本确定类型了,接下来就是操作了

2.通讯录的初始化

对于通讯录要初始化,我们可一个存放信息的数组初始化,可以采用一个函数:memset函数:void *memset( void *dest, int c, size_t count );
这个函数参数:dest这个指针是代表要进行操作的起始地址,第二个参数c代表的是要初始化为啥,像初始化为0,'X’等等都可以,第三个参数count代表要改变多少个字节,这个size_t类型,实际上是unsigned int类型,所以我们初始化可以使用这个函数,对于sz也一定要初始化为0,因为代表元素个数,对于初始化我闷=们需要定义一个函数,然后参数是我们定义的Contact一个指针变量

void InitContact(Contact* pc);
void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
	
}

3.通讯录增加操作

对于通讯录增加操作就需要先判断是否有空间存储,即判断sz是否于定义的数组最大值MAX是否相同

if (pc->sz == MAX)
	{
		printf("通讯录满了");
		return;
	}

然后不满的话,就进行增加的操作,具体如下:

void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录满了");
		return;
	}
	printf("请输入姓名\n");
	scanf("%s", &(pc->data[pc->sz].name));
	printf("请输入年龄\n");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话\n");
	scanf("%s", &(pc->data[pc->sz].phone));
	printf("请输入住址\n");
	scanf("%s", &(pc->data[pc->sz].address));
	pc->sz++;
}

4.通讯录删除操作

删除操作的话,我们这里是通过输入要删除人的名字来找到此人进行删除,先看代码:

void del(Contact* pc)
{
	printf("请输入要删除的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, arr)==0)
		{
			int j = 0;
			for (j = i; j < pc->sz - 1; j++)
			{
				pc->data[j] = pc->data[j + 1];
			}
			pc->sz--;
			break;
		}
		
	}
}

解释上述代码:gets这个函数是输入一个字符串的函数,需要用到的头文件为: #include<string.h> ;它与scanf的区别就是scanf遇见空格后后面的就不进行读入了,而gets会读入后面的。然后有用到了一个strcmp函数,这个函数的功能就是比较字符串,它比较的是字符串的ascll码值,这个函数以及其他内存的函数我会在写一篇文章来具体详解,最后讲一下删除的原理:采用的是覆盖的原理。就是当找到目标时,这个下标的后面进行往前覆盖即可,这样要删除的就被覆盖了,而且也没有破环顺序
注意:pc->sz一定要减1,因为删除了一个人了

5.通讯录查找操作

这个查找在删除操作中用到了,所以不讲解了,直接看代码:

void research(Contact* pc)
{
	printf("请输入要查找的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name,arr)==0)
		{
			printf("%s\n", pc->data[i].name);
			printf("%d\n", pc->data[i].age);
			printf("%s\n", pc->data[i].phone);
			printf("%s\n", pc->data[i].address);
			break;
		}
	}
}

我这个代码有一个繁琐的问题就是,像删除,修改都会先查找,所以大家可以自己定义一个查找函数,这样就不用在删除,修改操作再次写有关查找的代码了

6.通讯录修改操作

修改同理删除操作:具体代码如下:


void change(Contact* pc)
{
	printf("请输入要修改人的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);

	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, arr)==0)
		{
			printf("请输入姓名\n");
			scanf("%s", &(pc->data[i].name));
			printf("请输入年龄\n");
			scanf("%d", &(pc->data[i].age));
			printf("请输入电话\n");
			scanf("%s", &(pc->data[i].phone));
			printf("请输入住址\n");
			scanf("%s", &(pc->data[i].address));

			break;
		}
	}
}

二.通讯录完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAX 20
#define MAX 1000
#define ADDESS_MAX 30
#define PHONE_MAX 30

typedef struct information
{
	char name[NAME_MAX];
	int age;
	char phone[PHONE_MAX];
	char address[ADDESS_MAX];
}information;
typedef struct Contact
{
	information data[MAX];
	int sz;
}Contact;

void InitContact(Contact* pc);
void AddContact(Contact* pc);
void Pintf(Contact* pc);
void research(Contact* pc);
void del(Contact* pc);
void change(Contact* pc);
void print(Contact* pc);



void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;

}

void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录满了");
		return;
	}
	printf("请输入姓名\n");
	scanf("%s", &(pc->data[pc->sz].name));
	printf("请输入年龄\n");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话\n");
	scanf("%s", &(pc->data[pc->sz].phone));
	printf("请输入住址\n");
	scanf("%s", &(pc->data[pc->sz].address));
	pc->sz++;
}

void Pintf(Contact* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%s\n", pc->data[i].name);
		printf("%d\n", pc->data[i].age);
		printf("%s\n", pc->data[i].phone);
		printf("%s\n", pc->data[i].address);
	}
}

void research(Contact* pc)
{
	printf("请输入要查找的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, arr) == 0)
		{
			printf("%s\n", pc->data[i].name);
			printf("%d\n", pc->data[i].age);
			printf("%s\n", pc->data[i].phone);
			printf("%s\n", pc->data[i].address);
			break;
		}
	}
}
void del(Contact* pc)
{
	printf("请输入要删除的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, arr) == 0)
		{
			int j = 0;
			for (j = i; j < pc->sz - 1; j++)
			{
				pc->data[j] = pc->data[j + 1];
			}
			pc->sz--;
			break;
		}

	}
}

void change(Contact* pc)
{
	printf("请输入要修改人的名字\n");
	getchar();
	char arr[100] = { 0 };
	gets(arr);

	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, arr) == 0)
		{
			printf("请输入姓名\n");
			scanf("%s", &(pc->data[i].name));
			printf("请输入年龄\n");
			scanf("%d", &(pc->data[i].age));
			printf("请输入电话\n");
			scanf("%s", &(pc->data[i].phone));
			printf("请输入住址\n");
			scanf("%s", &(pc->data[i].address));

			break;
		}
	}
}

void print(Contact* pc)
{

	int i = 0;
	printf("%12s %5s %6s %8s\n", "姓名", "年龄", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%12s %5d %6s %8s\n", pc->data[i].name, pc->data[i].age, pc->data[i].phone, pc->data[i].address);
	}
}


void meau()
{
	printf("**************** 通讯录  ********************\n");
	printf("************** 1.add      ********************\n");
	printf("************** 2.delete   ********************\n");
	printf("************** 3.research ********************\n");
	printf("************** 4.change   ********************\n");
	printf("************** 5.print   ********************\n");
	printf("************** 0.exit     ********************\n");
}
int main()
{
	Contact p;
	InitContact(&p);
	int a = 0;
	do
	{
		meau();
		scanf("%d", &a);
		switch (a)
		{
		case 1:AddContact(&p); break;
		case 2:del(&p); break;
		case 3:research(&p); break;
		case 4: change(&p);
		case 5: print(&p); break;
		default:break;
		}

	} while (a);
}

#define _CRT_SECURE_NO_WARNINGS 1 这个如果你用的VS就加上,如果用的Dev就不需要了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值