C语言课程设计| |通讯录管理系统!!!(含完整代码)


前言

大家好,具体学习完了结构体,为大家分享一个结构体的小项目——通讯录管理系统!!!

顺便分享一直日落照片啦!!!
在这里插入图片描述


一、通讯录功能如下

1 1.通讯录存放的联系人数量为动态开辟
2 联系人信息的内容为:姓名,性别,年龄,电话,地址
3 增加联系人
4 删除联系人
5 查找联系人
6 修改联系人
7 排序联系人
8 打印联系人

二、通讯录具体实现

1.文件类型、联系人、通讯录的定义

文件:
test.c 测试通讯录
AddressBook.c 各个功能的实现
AddressBook.h 头文件

联系人的定义:
利用结构体定义出联系人类型

struct People {
    
    
	char name[name_MAX];//姓名
	char address[address_MAX];//住址
	char sex[sex_MAX];//性别
	char phnum[phnum_MAX];//电话号码
	int age;//年龄
};

通讯录的定义:

typedef struct AddBook {
    
    
	struct People* contact;//联系人
	int size;//长度
	int Capacity;//通讯录当前容量

}Book;

定义需要使用到的一些宏:

#define name_MAX 20
#define address_MAX 30
#define sex_MAX 5
#define phnum_MAX 12
#define InitCapacity 3

2.菜单的实现

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");
}

3.通讯录功能选择的函数实现

int main()
{
    
    
	Book book;
	InitBook(&book);//程序开始运行时就初始化通讯录
	int input = 0;
	do
	{
    
    
		menu();
		printf("请输入你的选择:\n");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case Add:
			addContact(&book);
			break;
		case Show:
			showContact(&book);
			break;
		case Del:
			delContact(&book);
			break;
		case Find:
			findContact(&book);
			break;
		case Exchange:
			changeContact(&book);
			break;
		case Sort:
			sortBook(&book);
			break;
		case Size:
			bookNum(&book);
			break;
		case Exit:
			saveBook(&book);
			destoryBook(&book);
			printf("退出通讯录!\n");
			system("pause");
			system("cls");
			break;
		default:
			printf("输入有误,重新输入!\n");
			system("pause");
			system("cls");
			break;
		}
	} while (input);
	return 0;
}

switch语句中的case1,2,3,4不好对应功能,为了提高代码可读性,我们可以定义一个枚举类型:

enum imput {
    
    
	Exit,
	Add,
	Show,
	Del,
	Find,
	Exchange,
	Sort,
	Size

};

4.初始化通讯录函数

void InitBook(Book* book)
{
    
    
	assert(book);
	book->size = 0;
	book->Capacity = InitCapacity;//初始容量设定为3
	book->contact = (struct People*)malloc(book->Capacity * sizeof(struct People));
	if (book->contact == NULL)
	{
    
    
		perror("malloc");
		exit(-1);
	}
	memset(book->contact, 0, book->Capacity*sizeof(book->Capacity));
	//每个联系人设置为0
	readFile(book);//初始化时将文件中联系人的信息读取到通讯录中
}

5.通讯录销毁函数

void destoryBook(Book* book)
{
    
    
	free(book->contact);
	book->contact = NULL;
	book->Capacity = book->size = 0;
	printf("销毁成功!\n");
}

6.通讯录容量检查函数

void chect_Capacity(Book* book)
{
    
    
	assert(book);
	if (book->Capacity == book->size)//如果通讯录当前人数等于通讯录容量,则开始扩容
	{
    
    
		struct Peopel* temp = (struct People*)realloc(book->contact, (book->Capacity + 2) * sizeof(struct People));
		if (temp == NULL)
		{
    
    
			perror("realloc");
			exit(-1);
		}
		else
		{
    
    
			book->contact = temp;
			book->Capacity += 2;//扩容后更新通讯录容量大小
			temp = NULL;
			//printf("扩容成功!\n");
		}
	}
}

7.添加联系人

void addContact(Book* book)
{
    
    
	assert(book);
	chect_Capacity(book);//先检查容量
	printf("请输入你要添加的联系人姓名:\n");
	scanf("%s", book->contact[book->size].name);
	printf("请输入你要添加的联系人性别:\n");
	scanf("%s", book->contact[book->size].sex);
	printf("请输入你要添加的联系人年龄:\n");
	scanf("%d", &(book->contact[book->size].age));
	printf("请输入你要添加的联系人住址:\n");
	scanf("%s", book->contact[book->size].address);
	printf("请输入你要添加的联系人号码:\n");
	scanf("%s", book->contact[book->size].phnum);
	printf("添加成功!!\n");
	book->size++;//联系人个数加1
	system("pause");
	system("cls");
}

在这里插入图片描述

8.显示联系人

void show(Book* book, int num)
{
    
    //这是显示指定位置的某位联系人
	printf("姓名:%s\t性别:%s\t年龄:%d\t住址:%s\t号码:%s\n", book->contact[num].name,
		book->contact[num].phnum, book->contact[num].age,
		book->contact[num].address, book->contact[num].phnum);
}
void showContact(Book* book)
{
    
    //显示所有联系人
	assert(book);
	if (book->size == 0)
	{
    
    
		printf("还未存入联系人!\n");
		system("pause");
		system("cls");
	}
	else
	{
    
    
		int i = 0;
		for (i = 0; i < book->size; i++)
		{
    
    
			show(book, i);
		}
		system("pause");
		system("cls");
	}
}

9.检查某个联系人是否存在

int isExit(Book* book, char name[20])
{
    
    //根据年龄判断某个联系人是否存在
	assert(book);
	int i = 0;
	for (i = 0; i < book->size; i++)
	{
    
    
		if (strcmp(book->contact[i].name, name) == 0)
		{
    
    
			return i;
		}
	}
	return -1;
}

10.删除联系人

void delContact(Book* book)
{
    
    
	assert(book);
	char name[20];
	printf("请输入要删除的联系人姓名:\n");
	scanf("%s", name);
	int ret = isExit(book, name);//先检查要删除的联系人是否存在
	if (ret != -1)
	{
    
    
		int i = 0;
		for (i = ret; i < book->size - 1; i++)
		{
    
    
			book->contact[i] = book->contact[i + 1];
			//利用数组前移的方法将要删除的联系人覆盖进行删除
		}
		book->size--;
		printf("删除成功!\n");
	}
	else
	{
    
    
		printf("查无此人!\n");
	}
	system("pause");
	system("cls");
}

11.查找某个联系人

void findContact(Book* book)
{
    
    
	assert(book);
	char name[20];
	printf("请输入要查找的联系人姓名:\n");
	scanf("%s", name);
	int ret = isExit(book, name);//先判断联系人是否存在
	if (ret != -1)
	{
    
    
		printf("找到了,此人信息为:\n");
		show(book, ret);
	}
	else
	{
    
    
		printf("查无此人!\n");
	}
	system("pause");
	system("cls");
}

12.修改联系人

先判断要修改的联系人是否存在,在判断是否进行修改

void changeContact(Book* book)
{
    
    
	assert(book);
	char name[20];
	printf("请输入要修改的联系人姓名:\n");
	scanf("%s", name);
	int ret = isExit(book, name);
	if (ret != -1)
	{
    
    
		printf("请输入你修改后的联系人姓名:\n");
		scanf("%s", book->contact[ret].name);
		printf("请输入你修改后的联系人性别:\n");
		scanf("%s", book->contact[ret].sex);
		printf("请输入你修改后的联系人年龄:\n");
		scanf("%d", &book->contact[ret].age);
		printf("请输入你修改后的联系人住址:\n");
		scanf("%s", book->contact[ret].address);
		printf("请输入你修改后的联系人号码:\n");
		scanf("%s", book->contact[ret].phnum);
		printf("修改成功!\n");
	}
	else
	{
    
    
		printf("查无此人!\n");
	}
	system("pause");
	system("cls");
}

13.排序联系人

利用qsort函数根据年龄大小对联系人进行排序

//qsort函数的比较函数
int com_by_age(const void* e1, const void* e2)
{
    
    
	return ((struct People*)e1)->age - ((struct People*)e2)->age;
}
void sortBook(Book* book)
{
    
    
	assert(book);
	if (book->size == 0)
	{
    
    
		printf("通讯录为空,无法排序!\n");
		system("pause");
		system("cls");
		return;
	}
	//用qsort函数按照年龄大小排队
	qsort(book->contact, book->size, sizeof(book->contact[0]), com_by_age);
	printf("按照年龄大小排序成功!\n");
	system("pause");
	system("cls");
}

14.当前所有的联系人数量

void bookNum(Book* book)
{
    
    
	assert(book);
	printf("现在共有 :%d 名联系人!\n", book->size);
	system("pause");
	system("cls");
}

15.将通讯录信息写进文件

void saveBook(Book* book)
{
    
    
	//打开文件
	FILE* pf = fopen("BOOK.txt", "wb");
	if (pf == NULL)
	{
    
    
		perror("saveBook::fopen");
	}
	//size_t fwrite(const void* ptr, size_t size, size_t count, FILE * stream);
	//写文件
	int i = 0;
	for (i = 0; i < book->size; i++)
	{
    
    
		fwrite(book->contact + i, sizeof(struct People), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	printf("写入文件成功!\n");
}

16.将文件数据读取到通讯录

void readFile(Book* book)
{
    
    
	FILE* pf = fopen("BOOK.txt", "rb");
	if (pf == NULL)
	{
    
    
		perror("readFile::fopen");
		return;
	}
	//size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
	struct People temp = {
    
     0 };
	while (fread(&temp, sizeof(struct People), 1, pf))
	{
    
    
		chect_Capacity(book);//每次存时检查一下容量,不够了就扩容
		book->contact[book->size] = temp;
		book->size++;
	}
	fclose(pf);
	pf = NULL;
}

17.头文件展示

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
//#define MAX 1000
#define name_MAX 20
#define address_MAX 30
#define sex_MAX 5
#define phnum_MAX 12
#define InitCapacity 3
enum imput {
    
    
	Exit,
	Add,
	Show,
	Del,
	Find,
	Exchange,
	Sort,
	Size

};
struct People {
    
    
	char name[name_MAX];
	char address[address_MAX];
	char sex[sex_MAX];
	char phnum[phnum_MAX];
	int age;
};
typedef struct AddBook {
    
    
	struct People* contact;
	int size;
	int Capacity;

}Book;

void addContact(Book* book);

void showContact(Book* book);

void findContact(Book* book);

void delContact(Book* book);

void bookNum(Book* book);

void sortBook(Book* book);

void changeContact(Book* book);

void InitBook(Book* book);

void destoryBook(Book* book);

void chect_Capacity(Book* book);

void saveBook(Book* book);

总结

今天的通讯录管理系统就分享到这里啦,希望可以帮助到大家!!!

猜你喜欢

转载自blog.csdn.net/m0_71214261/article/details/132673133
今日推荐