C语言实战教程:构建简易通讯录管理系统

本文介绍了如何使用C语言实现一个基础的通讯录管理系统,涉及数据结构设计、动态内存管理、功能模块化和用户交互。详细解析了personinfo结构体和关键函数如添加、删除、查询等的操作。
摘要由CSDN通过智能技术生成

🤖💻👨‍💻👩‍💻🌟🚀

🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟

专栏:数据结构              

👨‍💻👩‍💻 先赞后看,已成习惯👨‍💻👩‍💻

👨‍💻👩‍💻 创作不易,多多支持👨‍💻👩‍💻

🚀 启动创新引擎,揭秘C语言的密码🚀


💡目录

项目概述

技术要点概览

核心代码解析

数据结构定义 (personinfo.h)

功能实现 (personinfo.c)

主函数 (main.c)

总结与反思


项目概述

本通讯录管理系统旨在实现基本的联系人信息管理功能,包括添加、删除、查询、修改联系人信息以及显示通讯录列表。项目主要由三个文件构成:personinfo.h(头文件)personinfo.c(功能实现)main.c(主函数及程序入口)

技术要点概览

  • 数据结构:定义personinfo结构体存储联系人信息,使用p_arr结构体封装通讯录数组及其管理逻辑。
  • 动态内存管理:通过 realloc动态调整通讯录数组的大小,实现按需扩容。
  • 功能模块化:将各个功能(如添加、删除、查询等)封装成独立的函数,提高代码的可读性和可维护性。
  • 用户交互:通过printfscanf实现简单的命令行界面,使用户能够方便地与程序交互。

核心代码解析

数据结构定义 (personinfo.h)

typedef struct {
    int age;
    char sex[4];
    char number[11];
    char name[20];
    char address[20];
} personinfo;

typedef struct {
    personinfo* arr;
    int size;
    int capacity;
} p_arr;

功能实现 (personinfo.c)

menu函数:打印菜单

void menu()
{
	printf("=====================================\n");
	printf("============1.添加联系人=============\n");
	printf("============2.删除联系人=============\n");
	printf("============3.打印通讯录=============\n");
	printf("============4.修改联系人=============\n");
	printf("============0.退出通讯录=============\n");
	printf("=====================================\n");
}

p_arr_init函数:初始化通讯录

void p_arr_init(p_arr* ps)//将p_arr指向空指针,成员=0
{
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

p_arr_check函数:判断是否需要扩容

void p_arr_check(p_arr* ps)//检查是否需要扩容

{
	if (ps->capacity == ps->size)
	{
		int new_capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->arr = (personinfo*)realloc(ps->arr, new_capacity * sizeof(personinfo));
		assert(ps->arr);
		ps->capacity = new_capacity;
	}
}

p_arr_stick函数:

void p_arr_pop(p_arr* ps)//删除联系人
{
	assert(ps);
	assert(ps->arr);

	for (int i = 0; i < ps->size; i++)//讲赎罪内所有数据往后移一个位置
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;//有效数据数量-1
}

p_arr_stick函数:添加联系人

void p_arr_stick(p_arr* ps) 
{
    // 省略了错误检查和输入代码,直接展示核心逻辑
    scanf("%s %d %s %s %s", person.name, &(person.age), person.address, person.number,
    person.sex);

    p_arr_check(ps); // 自动扩容
    ps->arr[ps->size++] = person; // 添加并更新size
}

p_arr_show函数:打印通讯录

void p_arr_show(p_arr* ps)//打印
{
	assert(ps);
	assert(ps->arr);

	system("cls");
	
	int i = ps->size;
	while (i > 0)
	{
		printf("姓名,年龄,地址,手机号码,性别\n");
		printf("%s %d %s %s %s\n", ps->arr[i-1].name, ps->arr[i-1].age, ps->arr[i-1].address, ps->arr[i-1].number, ps->arr[i-1].sex);
		i--;
	}
	Sleep(1000);
}

💡tips:在最后一行中的Sleep函数不要省略,防止看不到结果就被刷新

p_arr_find函数:查找联系人

static int p_arr_find(p_arr* ps, char* name)//查找
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (!strcmp(ps->arr[i].name, name)) //如果匹配strcmp返回0,取反得到1
        {
			return i;
		}
	}
	return 0;
}

p_arr_revise函数:修改联系人信息

void p_arr_revise(p_arr* ps)//修改
{
	system("cls");
	int input = 0;
	do
	{
		printf("请输入要修改的名字\n");
		char name[20] = {0};
		scanf("%99s", name);
		int res = p_arr_find(ps, name);
		if (res == -1)
			printf("该联系人不存在\n");
		else
		{


			printf("0.exit 1.name 2.age 3.address 4.sex 5.number\n");
			scanf("%1d", &input);
			switch (input)
			{
			case 1:
			{
				printf("请输入\n");
				scanf("%99s", ps->arr[res].name);
				break;
			}case 2:
			{
				printf("请输入\n");
				scanf("%3d", &(ps->arr[res].age));
				break;
			}case 3:
			{
				printf("请输入\n");
				scanf("%99s", ps->arr[res].address);
				break;
			}case 4:
			{
				printf("请输入\n");
				scanf("%99s", ps->arr[res].sex);
				break;
			}case 5:
			{
				printf("请输入\n");
				scanf("%99s", ps->arr[res].number);
				break;
			}case 0:
			{
				break;
			}
			default:
				printf("错误输入\n");
			}
		}
	} while (input);
	
}

💡tips:ps->arr[res].age为数字,需&操作

EXIT函数:退出函数

void EXIT(p_arr*ps)//退出
{
	return ;
}

主函数 (main.c)

主函数通过一个简单的菜单驱动程序来调用各项功能:

#include"personinfo.h"

int main()
{
	typedef void (*ArrFunction)(p_arr*);
	p_arr arr;

	p_arr_init(&arr);//初始化
	p_arr_check(&arr);//检查扩容
	void (*pf[])(p_arr*) = {EXIT ,p_arr_stick,p_arr_pop,p_arr_show,p_arr_revise};

	int x;
	do {
		menu();
		scanf("%d", &x);

		(*pf[x])(&arr);
		system("cls");
	} while (x);
	return 0;
}

定义函数指针数组用来进入函数。


总结与反思

通过这个通讯录管理系统的实践,我们不仅复习了C语言的基础知识,还掌握了如何设计和实现一个小型项目。重点在于理解数据结构的选择、内存管理的重要性以及模块化编程的优势。此项目还可以进一步扩展,比如增加排序功能、采用文件存储实现持久化通讯录,或是引入更复杂的错误处理机制。


结束语与感谢

在本次深度探索中,我们不仅构建了一个实用的C语言通讯录管理系统,更重要的是,我们一同回顾并实践了数据结构、内存管理、函数设计及用户交互等核心编程技能。希望通过本教程,您能够感受到C语言的魅力所在,同时也为您的编程之旅增添一份宝贵的经验。

在此,衷心感谢每一位读者的耐心跟随与实践。无论是初学者的小试牛刀,还是资深程序员的温故知新,您的每一分努力都是推动技术成长的宝贵力量。编程之路漫漫,愿本文成为您探索之旅中的一盏明灯,引领您向更广阔的编程世界进发。

我们始终相信,技术的精进源自不懈的实践与学习。期待您在未来的编程道路上,能够创造出更多有意义、有价值的项目,不仅提升自我,也惠及他人。如果您在实践中遇到了新的挑战或有独到的见解,欢迎分享交流,共同促进技术社区的成长与进步。

最后,不要忘了享受编程带来的乐趣,正是这份热爱与执着,让代码不仅仅是冷冰冰的指令,而是充满创造力与温度的艺术品。

再次感谢您的阅读,期待在下一个项目中与您再次相遇!


致此,旅程虽暂告一段落,但编程的世界无限宽广,愿我们都能在代码的海洋里乘风破浪,探索不息。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值