C语言实现通讯录(静态数组)

通讯录


实现功能:

1.添加通讯录成员     2.删除通讯录成员    3.查找通讯录成员

4.修改通讯录成员信息     5.显示通讯录成员信息    6.清空所有联系人

7.以名字排序所有联系人     


基本思想:

1.建立一个结构体数组存储通讯录中每个人的信息。

2.使用静态数组来对通讯录进行操作


这里们使用多文件编程,将各种声明和头文件放在test.h文件中,将函数的定义,主函数的框架放在test.c文件中

源码如下:

test.h

#ifndef __TEST_H__
#define __TEST_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<assert.h>

typedef struct LINKMAN//每个人的信息
{
	char name[20];
	char sex[10];
	int age;
	int tel[12];
	char add[50];
}LINKMAN;

typedef struct stu //把通讯录和人员统计放在结构体内
{
	LINKMAN num[1000];
	int count;
}stu;

void menu();//菜单
void init_stu(stu *p);//初始化数组
void Add_stu(stu *p);// 添加联系人信息
void Dele_stu(stu *p);//删除指定联系人信息
void Find_stu(stu *p);//查找指定联系人信息
void Mod_stu(stu *p);//修改指定联系人信息
void Print_stu(stu *p);//显示所有联系人信息
void Empty_stu(stu *p);//清空所有联系人 
void sort_stu(stu *p);//以名字排序所有联系人
#endif


test.c

#include"test.h"
stu sta; //声明结构体

void menu()//菜单
{
	printf("***********************************\n");
	printf("********1.添加联系人信息***********\n");
	printf("********2.删除指定联系人信息*******\n");
	printf("********3.查找指定联系人信息*******\n");
	printf("********4.修改指定联系人信息*******\n");
	printf("********5.显示所有联系人信息*******\n");
	printf("********6.清空所有联系人***********\n");
	printf("********7.以名字排序所有联系人*****\n");
	printf("********0.退出程序*****************\n");
	printf("***********************************\n");
}
int Find(stu *p, char *name)//查找人员编号
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		if (strcmp(p->num[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void init_stu(stu *p)//初始化信息
{
	assert(p);
	int count = sizeof(p->num);
	memset(p->num, 0, count);
}

void Add_stu(stu *p)//添加联系人
{
	assert(p);
	printf("请输入你要添加的联系人姓名:\n");
	scanf("%s", p->num[p->count].name);
	printf("请输入你要添加的联系人性别:\n");
	scanf("%s", p->num[p->count].sex);
	printf("请输入你要添加的联系人年龄:\n");
	scanf("%d", &(p->num[p->count].age));
	printf("请输入你要添加的联系人电话:\n");
	scanf("%s", p->num[p->count].tel);
	printf("请输入你要添加的联系人地址:\n");
	scanf("%s", p->num[p->count].add);
	if ((p->count) > 1000)
	{
		printf("通讯录已满!\n");
	}
	else
	{
		printf("添加成功\n");
		p->count++;
	}
}

void Dele_stu(stu *p)//删除联系人
{
	assert(p);
	int i = 0;
	char name[20] = { 0 };
	printf("请输入要删除的姓名!\n");
	scanf("%s", name);
	int num = Find(p, name);
	if (num == -1)
	{
		printf("没有找到!\n");
		return;
	}
	for (i = num; i < p->count - 1; i++)
	{
		p->num[i] = p->num[i + 1];//采用直接循环覆盖的方式删除
	}
	p->count--;//人员总数减一
	printf("输出成功!\n");
}


void Find_stu(stu *p)//查找联系人
{
	assert(p);
	printf("请输入你想查找的姓名!\n");
	char name[20] = { 0 };
	scanf("%s", name);
	int Num = Find(p, name);
	if (Num == -1)
	{
		printf("没有找到!\n");
		return;
	}
	printf("%s\t", p->num[Num].sex);
	printf("%d\t", p->num[Num].age);
	printf("%s\t", p->num[Num].tel);
	printf("%s\t", p->num[Num].add);
	printf("\n");
}

void Mod_stu(stu *p)//修改通讯录
{
	assert(p);
	int input = 0;
	printf("请输入要修改的联系人姓名!\n");
	char name[20] = { 0 };
	scanf("%s", name);
	int num = Find(p, name);//得到联系人姓名对应的数组编号
	if (num == -1)
	{
		printf("没有找到!\n");
		return;
	}
	printf("请输入修改信息!\n");
	while (1)
	{
		printf("****1.sex  2.age  ***\n");
		printf("****3.tel  4.add  ***\n");
		printf("****5.Mod_OK*********\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:printf("请输入修改后的性别!\n");
			scanf("%s", p->num[num].sex);
			break;
		case 2:printf("请输入修改后的年龄!\n");
			scanf("%d", &(p->num[num].age));
			break;
		case 3:printf("请输入修改后的电话!\n");
			scanf("%s", p->num[num].tel);
			break;
		case 4:printf("请输入修改后的地址!\n");
			scanf("%s", p->num[num].add);
		case 5:return;
			break;
		default:printf("输入错误! 重新输入!\n");
			break;
		}
	}
}


void Print_stu(stu *p)//打印通讯录
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		printf("%s  %s  %d  %s   %s\n", p->num[i].name, \
			p->num[i].sex, p->num[i].age, \
			p->num[i].tel, p->num[i].add);
	}
}


void Empty_stu(stu *p)//清空通讯录
{
	assert(p);
	p->count = 0;
}

void sort_stu(stu *p)
{
	assert(p);
	int i = 0, j = 0;
	LINKMAN temp;
	for (int i = 0; i < p->count - 1; i++) 
	{
		for (int j = 0; j < p->count - i - 1; j++) 
		{
			if (strcmp(p->num[j].name,p->num[j+1].name)>0) 
			{
				temp = p->num[j];
				p->num[j] = p->num[j + 1];
				p->num[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int input = 0;
	init_stu(&sta);//初始化
	while (1)
	{
		menu();
		printf("请输入你的操作!\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:Add_stu(&sta);
			break;
		case 2:Dele_stu(&sta);
			break;
		case 3:Find_stu(&sta);
			break;
		case 4:Mod_stu(&sta);
			break;
		case 5:Print_stu(&sta);
			break;
		case 6:Empty_stu(&sta);
			break;
		case 7:sort_stu(&sta);
			break; 
		case 0:exit(1);
			break;
		default:printf("输入错误! 重新输入!\n");
			break;
		}
	}
	system("pause");
	return 0;

}


以上就是实现通讯录的源码,方法十分简单,基本上没有采用什么难的知识点,但值得注意的是这里结构体传参时要传地址,以便节约空间,而且使用assrert断言会使代码变得更严谨一些。

猜你喜欢

转载自blog.csdn.net/yc1515707718/article/details/79594020