C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦

目录


本篇博客是博主期末的C语言课程设计的作业,作为一个模板写出来和大家分享,大家按需借鉴

摘要

本文介绍了一个基于C语言的通讯录管理系统。该系统可实现联系人信息的添加、查找、修改、删除、显示和排序等功能,并且提供了简单易用的用户交互界面。使用C语言的结构体和指针来存储和管理联系人信息,并使用文件读写功能对联系人信息进行保存和访问。在程序设计阶段,我们使用了模块化设计,将不同功能划分为不同的函数,以提高程序的可读性和可维护性。

系统的交互界面简单明了,用户可以通过几个简单的输入命令实现对联系人信息的添加、删除、查找、修改等操作。所有操作都反映在一个可视化的菜单上,便于用户了解当前操作和系统状态。通讯录系统还能够执行一些其他实用的功能,如备份和还原联系人数据。

我们通过使用C语言的高效性和简单性,设计了一个易于使用和维护的通讯录管理系统,使其适用于广泛的用户群体。该系统可用于日常生活和工作中,帮助用户管理联系人信息,提高工作效率和准确性。对于初学者来说,本系统也是一个很好的C语言实践项目,可以帮助他们更加深入地了解C语言的结构体、指针和文件读写等概念和用法。

关键字:通讯录管理系统、功能、结构体、指针、文件读写

第一章 绪论

 C语言课程设计的目的,你开发的这个软件的意义,软件要实现什么功能。

 以上是要求,下面是模板

1.1项目意义

1.提高编程能力:通过实现通讯录管理系统,可以提高C语言编程能力,掌握C语言的基本语法和数据结构。

2.实践项目开发:实现通讯录管理系统是一个小型的项目开发,可以让学生在实践中掌握项目开发的流程和方法。

3.提高问题解决能力:在实现通讯录管理系统的过程中,会遇到各种问题,需要学生自己思考和解决,从而提高问题解决能力。

4.培养团队合作精神:通讯录管理系统可以分为多个模块,需要多人协作完成,可以培养学生的团队合作精神。

5.实现实用功能:通讯录管理系统是一个实用的小工具,可以帮助用户管理联系人信息,提高生活效率。

1.2通讯录功能

1. 添加联系人:输入联系人的姓名、电话、地址等信息,将其保存到通讯录中。

2. 显示联系人:将通讯录中所有联系人的信息显示出来。

3. 查找联系人:根据姓名或电话号码查找联系人,并显示其详细信息。

4. 修改联系人:根据姓名或电话号码查找联系人,并修改其信息。

5. 删除联系人:根据姓名或电话号码查找联系人,并从通讯录中删除。

6. 清空联系人:删除通讯录中所有联系人。

7. 保存联系人:将通讯录中的联系人信息保存到文件中。

8. 读取联系人:从文件中读取联系人信息,并添加到通讯录中。

9. 退出系统:退出通讯录管理系统。

第二章 详细设计与实现 

这部分是C语言实现通讯录系统设计部分的,各函数的流程图和整个项目的流程图

2.1 Contact程序运行流程图

2.2 AddContact(增加)函数流程图

2.3 DelContact(删除)函数流程图

2.4 SearchConact(查找)函数流程图

 

2.5 ModifyContact(修改)函数流程图

2.6 SortContact(排序)函数流程图

第三章 系统测试

3.1 菜单

3.2 增加联系人信息

3.3 删除联系人信息

3.4 查找联系人信息

 3.5 修改联系人信息

3.6 按联系人信息排序

 3.7 打印联系人信息

4.心得体会 

在实现通讯录管理系统的过程中,我学到了很多关于C语言编程的技巧和经验。以下是我的心得体会

1. 数据结构的选择很重要。在通讯录管理系统中,我使用了结构体来存储联系人的信息,这样可以方便地对联系人进行增删改查操作。

2. 内存管理要注意。在使用动态内存分配函数(如malloc和free)时,要注意及时释放内存,避免内存泄漏。

3. 错误处理很重要。在编写程序时,要考虑到各种可能出现的错误情况,并对其进行处理,以保证程序的稳定性和可靠性。

4. 模块化编程可以提高代码的可读性和可维护性。在编写通讯录管理系统时,我将不同功能的代码分成了多个模块,这样可以方便地对代码进行修改和维护。

5. 调试是编程过程中必不可少的一步。在编写通讯录管理系统时,我经常使用调试工具来查找程序中的错误,以便及时进行修复。

总之,通过实现通讯录管理系统,我不仅学到了很多关于C语言编程的技巧和经验,还提高了自己的编程能力和解决问题的能力。

5. 源码

5.1 DynamicContact.h

通讯录函数声明部分

#pragma once
#define _CRT_SECURE_NO_WARNINGS //vs 编译器需要,其他编译器不需要,可自行删去

//动态版通讯录

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>

//类型声明

//PeoInit结构体所用
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
//通讯录初始状态的容量大小
#define DEFAULT_SZ 3

//枚举选项

enum Option //test函数所用的枚举
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};

enum Modify //修改联系人所用的枚举
{
	EXIT0,
	NAME,
	SEX,
	AGE,
	TELE,
	ADDR
};

//结构体声明

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;//存放联系人的信息
	int count;//通讯录中已经保存的信息个数
	int capacity;//记录通讯录当前的最大容量
}Contact;


//函数声明

//初始化通讯录
void InitContact(Contact* p);

//销毁通讯录
void DestroyContact(Contact* p);

//添加联系人
void AddContact(Contact* p);

//删除联系人
void DelContact(Contact* p);

//查找联系人
void SearchContact(const Contact* p);

//修改联系人信息
void ModifyContact(Contact* p);

//打印联系人
void PrintContact(const Contact* p);

//排序
void SortContact(const Contact* p);

//保存通讯录的信息到文件
void SaveContact(const Contact* pc);

//加载文件信息到通讯录中
void LoadContact(Contact* p);

5.2 DynamicContact.c

通讯录功能实现部分

#include "DynamicContact.h"

//排序所用菜单
void menu2()
{
	printf("********************************\n");
	printf("******  1.name    2.age   ******\n");
	printf("******  0.exit            ******\n");
	printf("********************************\n");
}
//修改联系人所用的菜单
void menu1()
{
	printf("********************************\n");
	printf("******  1.name    2.sex   ******\n");
	printf("******  3.age     4.tele  ******\n");
	printf("******  5.addr    0.exit  ******\n");
	printf("********************************\n");

}

//检测通讯录容量
void CheckCapacity(Contact* p)
{
	assert(p);
	if (p->capacity == p->count)
	{
		PeoInfo* tmp = (PeoInfo*)realloc(p->data, (p->capacity + 2) * sizeof(PeoInfo));
		if (p->data != NULL)
		{
			p->data = tmp;
		}
		else
		{
			perror("CheckCapacity::realloc");
			return;
		}

		p->capacity += 2;
		printf("增容成功\n");
	}
}

//初始化通讯录
void InitContact(Contact* p)
{
	assert(p);
	p->count = 0;
	p->capacity = DEFAULT_SZ;
	p->data = (PeoInfo*)malloc(p->capacity * sizeof(PeoInfo));

	if (p->data == NULL)
	{
		perror("InitContact::malloc");
		return;
	}

	memset(p->data, 0, p->capacity * sizeof(PeoInfo));//把PeoInit全部初始化为0

	//加载文件信息到通讯录中
	LoadContact(p);
}

//销毁通讯录
void DestroyContact(Contact* p)
{
	free(p->data);
	p->data = NULL;
	p->capacity = 0;
	p->count = 0;

	printf("销毁成功\n");
}

//添加联系人
void AddContact(Contact* p)
{
	//检查容量
	CheckCapacity(p);

	//录入信息
	printf("请输入名字:>");
	scanf("%s", p->data[p->count].name);
	printf("请输入性别:>");
	scanf("%s", p->data[p->count].sex);
	printf("请输入年龄:>");
	scanf("%d", &(p->data[p->count].age));
	printf("请输入电话:>");
	scanf("%s", p->data[p->count].tele);
	printf("请输入地址:>");
	scanf("%s", p->data[p->count].addr);

	p->count++;
	printf("添加成功\n\n");
}

//查找,找到了返回下标,找不到返回 -1
int FindName(const Contact* p, char name[])
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		if (0 == strcmp(p->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* p)
{
	assert(p);
	if (0 == p->count)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	char name[NAME_MAX];
	printf("请输入要查找的名字:>");
	scanf("%s", name);
	int position = FindName(p, name);//查找
	if (-1 == position)
	{
		printf("要删除的联系人不存在\n\n");
		return;
	}
	//删除
	int i = 0;
	for (i = position; i < p->count - 1; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	p->count--;
	printf("删除成功\n\n");
}

//查找联系人
void SearchContact(const Contact* p)
{
	assert(p);
	char name[NAME_MAX];
	printf("请输入要查找的名字:>");
	scanf("%s", name);
	int position = FindName(p, name);//查找
	if (-1 == position)
	{
		printf("要查找的联系人不存在\n\n");
		return;
	}
	printf("\n-----------------------------------------------\n");
	printf("%-10s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s %-5s %-5d %-12s %-30s\n", p->data[position].name,
		p->data[position].sex, p->data[position].age,
		p->data[position].tele, p->data[position].addr);
	printf("\n-----------------------------------------------\n\n");
}

//修改联系人信息
void ModifyContact(Contact* p)
{
	assert(p);
	int intput = 0;
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:>");
	scanf("%s", name);
	int position = FindName(p, name);//查找
	if (-1 != position)
	{
		printf("\n-----------------------------------------------\n");
		printf("%-10s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s %-5s %-5d %-12s %-30s\n", p->data[position].name, p->data[position].sex,
			p->data[position].age, p->data[position].tele, p->data[position].addr);
		printf("\n-----------------------------------------------\n\n");
		do
		{
			menu1();
			printf("请输入要修改的选项:>");
			scanf("%d", &intput);
			switch (intput)
			{
			case NAME:
				printf("请修改名字:>");
				scanf("%s", p->data[position].name);
				printf("修改成功\n\n");
				break;
			case SEX:
				printf("请修改性别:>");
				scanf("%s", p->data[position].sex);
				printf("修改成功\n\n");
				break;
			case AGE:
				printf("请修改年龄:>");
				scanf("%d", &(p->data[position].age));
				printf("修改成功\n\n");
				break;
			case TELE:
				printf("请修改电话号码:>");
				scanf("%s", p->data[position].tele);
				printf("修改成功\n\n");
				break;
			case ADDR:
				printf("请修改地址:>");
				scanf("%s", p->data[position].addr);
				printf("修改成功\n\n");
				break;
			case EXIT0:
				printf("退出修改\n\n");
				break;
			default:
				printf("选择错误,请重新选择\n\n");
				break;
			}
		} while (intput);
	}
	else
	{
		printf("所要修改的联系人不存在\n\n");
		return;
	}
}

//打印联系人
void PrintContact(const Contact* p)
{
	assert(p);
	int i = 0;
	printf("\n-----------------------------------------------\n");
	printf("%-10s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < p->count; i++)
	{
		printf("%-10s %-5s %-5d %-12s %-30s\n", p->data[i].name, p->data[i].sex,
			p->data[i].age, p->data[i].tele, p->data[i].addr);
	}
	printf("-----------------------------------------------\n\n");
}


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

int cmp_age(const void* e1, const void* e2)
{
	return (((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age);
}

//排序
void SortContact(const Contact* p)
{
	assert(p);
	int intput = 0;
	do
	{
		menu2();
		printf("请选择需要排序的选项:>");
		scanf("%d", &intput);
		switch (intput)
		{
		case 1:
			qsort(p->data, p->count, sizeof(struct PeoInfo), cmp_name);
			printf("按名字排序成功\n\n");
			break;
		case 2:
			qsort(p->data, p->count, sizeof(struct PeoInfo), cmp_age);
			printf("按年龄排序成功\n\n");
			break;
		case 0:
			printf("退出排序\n\n");
			break;
		default:
			printf("选择错误,请重新选择\n\n");
			break;
		}
	} while (intput);

}


//保存通讯录的信息到文件
void SaveContact(const Contact* p)
{
	//打开并创建文件
	FILE* pf = fopen("contact.data.txt", "w");//w:只写,
	if (pf == NULL)
	{
		perror("SaveContact::fopen");
		return;
	}

	//写文件
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		fwrite(p->data + i, sizeof(PeoInfo), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//加载文件信息到通讯录中
void LoadContact(Contact* p)
{
	//打开文件
	FILE* pf = fopen("contact.data.txt", "r");//r:只读
	if (pf == NULL)
	{
		perror("LoadContact::fopen");
		return;
	}


	//读文件
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
		CheckCapacity(p);
		p->data[p->count] = tmp;
		p->count++;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

}

5.3 test.c

通讯录系统设计测试部分

#include "DynamicContact.h"

void menu()
{
	printf("================================\n");
	printf("*********** Contact ************\n");
	printf("================================\n");
	printf("***     1.add     2.del      ***\n");
	printf("***     3.search  4.modify   ***\n");
	printf("***     5.sort    6.print    ***\n");
	printf("***     0.exit               ***\n");
	printf("================================\n");

}
void test()
{
	int intput = 0;
	Contact con;//创建通讯录
	InitContact(&con);//初始化通讯录
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &intput);
		switch (intput)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case PRINT:
			PrintContact(&con);
			break;
		case EXIT:
			SaveContact(&con);//销毁通讯录之前把数据存入文件中
			DestroyContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n\n");
			break;
		}

	} while (intput);
}
int main()
{
	test();
	return 0;
}

本篇博客借鉴于博主枫叶先生,如果大家想学习本篇中的流程图画图方法和工具获取,可以前去关注这个博主!!!

如果觉得文章不错,期待你的一键三连哦,你个鼓励是我创作的动力之源,让我们一起加油,顶峰相见!!!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年12月22日
下一篇 2023年12月22日

相关推荐