C语言通讯录的实现(结构体+数组+文件+动态开辟内存空间+枚举、增删查改、完整的课程设计报告)

整个成员管理系统设计为数据增加模块、数据修改模块、数据删除模块、数据按名字或按类别查找模块、数据浏览模块、数据清空模块、数据存储模块。


contact.h

// 头文件 
#include 
#include 
#include 
#include 
#include 
#define na 20
#define te 20
#define em 30
#define cate 20
#define first_size 3
enum Select
{
	Exit,
	Add,
	Dele,
	Find,
	Modify,
	Sort,
	Show,
	Destory, 
	Save,
};

typedef struct people
{
	char name[na];
	char tele[te];
	char category[cate];
	char email[em];
	
}people;

typedef struct num_con  //通讯录
{
	people *data;//结构体数组 存放好多人信息 
	int size;//记录当前已有的元素个数 
	int capa;//当前最大容量 capa ==size时,容量已满 
}num_con;


void menu();

void check(num_con *ps);//检查是否需要扩容 

int find_kind();//选择查找类型 

int find(num_con *ps,char name[na]);//查找名字 

void Initialize_con(num_con *ps);//初始化

void add(num_con *ps);//增加 

void dele(num_con *ps);//删除

void findkind(num_con *ps);//按类别查找 

void findname(num_con *ps);//按名字查找

void modify(num_con *ps);//修改 
 
void sort(num_con *ps);//排序 

void show(const num_con *ps);//显示 

void destory(num_con * ps);//清空 

void save(num_con *ps); //保存 

void load(num_con *ps);//加载 

main.c 

#include "contact.h"
/* 测试 */

int main(int argc, char *argv[]) 
{	
	//创建通讯录 
	num_con con;
	
	Initialize_con(&con); //初始化 
	int input=0; 
	int i=0;
//读取数据	
	read(&con);	

	do
	{
		menu();
		printf("快点选择鸭!\n");
		scanf("%d",&input);
		switch(input)
		{
			case Exit:
				save(&con);//保存数据 
				destory(&con);//销毁通讯录并释放内存 
				system("cls"); 
				printf("退出成功\n"); 
				break;
				
			case Add:
				add(&con);
				break;
				
			case Dele:
				dele(&con); 
				break;
				
			case Find:
				i=find_kind(); 
				if(i==1)
					findname(&con);
				else if(i==2) 				
					findkind(&con);
				break;
				
			case Modify:
				modify(&con);
				break;
				
			case Sort:
				sort(&con);
				break;
				
			case Show:
				show(&con);
				break;	
			
			case Destory:
				destory(&con);
				break;
				
			case Save:
				save(&con);
				break; 
				
			default:
				printf("输入错误鸭,请重新输入哦!\n");
				break; 
		}
		
	}while(input); 

	return 0;
}

contact.c

//函数 
#include "contact.h"

void menu ()
{
	printf("———————————————\n");
	printf("************通讯录************\n");
	printf("***0.退出************1.增加***\n");
	printf("***2.删除************3.查找***\n");
	printf("***4.修改************5.排序***\n");
	printf("***6.显示************7.清空***\n");
	printf("**********8.保存文件**********\n");
	printf("******************************\n");	
}


void Initialize_con(num_con *ps)//初始化 
{
	ps->data=(people *)malloc(first_size*sizeof(people));//动态初始化空间 
	if(ps->data==NULL)
		return;
	ps->size=0;
	ps->capa=first_size; 
	
	//把文件中已经存放的信息加载入通讯录
	load(ps); 

}
 

void check(num_con *ps)//检查是否需要扩容 
{
	if(ps->size==ps->capa)
	{
		//增容
		//临时指针存放增加容量后的空间 
		people * newcapa=(people *)realloc(ps->data,(ps->capa+1)*sizeof(people)); 
		if(newcapa!=NULL)//扩容成功 
		{	
			ps->data==newcapa; 
			ps->capa+=1;//容量扩大 
			printf("扩容成功啦\n"); 
		} 
		else
			printf("哎哟扩容失败了\n"); 
	}
}


//选择查找类型 
int find_kind()
{
	int i=0;
	while(1)
	{
		printf("请选择查找类型\n1.按名字\t2.按类型\n");
		scanf("%d",&i);
		if(i==1||i==2)
		{
			return i;
		
		}
		else
		{
			printf("输入有误,请重新输入\n"); 
		}
	}
	
} 


//查找名字
int find(num_con *ps,char name[na])
{
	int i=0;
	for(i=0;isize;i++)
	{
		
		if(strcmp(name,ps->data[i].name)==0)
			return i;
		
	}
	return -1;
} 

//添加 
void add(num_con *ps)
{
	check(ps);//检查当前通讯录容量
	char a[cate];
	int b=1;
	//增加一个人的数据 
		printf("名字:>\n");
		scanf("%s",ps->data[ps->size].name);//data数组下标==size 
		printf("电话:>\n");
		scanf("%s",ps->data[ps->size].tele);
		
		do 
		{
		printf("类别:请准确输入朋友、同事、商务、一般:>\n");
		scanf("%s",a);
		getchar();//接受回车 
		if(strcmp(a,"朋友")==0||
		   strcmp(a,"同事")==0||
		   strcmp(a,"商务")==0||
		   strcmp(a,"一般")==0)
		{ 
			b=0;
			strcpy(ps->data[ps->size].category,a);
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
		
		}while(b);
		
		printf("地址:>\n");
		scanf("%s",ps->data[ps->size].email);

		ps->size++;
		printf("好耶!成功添加!\n"); 

}


//删除 
void dele(num_con *ps)
{
	printf("删掉谁好呢?\n");
	char a[na];
	scanf("%s",a);
	
	//寻找名字 
	int result=find(ps,a);
	if(result==-1)
	{
		printf("找不到啊呜呜呜\n"); 		
	} 
	else
	{		
		int j=0;
		for(j=result;jsize-1;j++)
		{
			ps->data[j]=ps->data[j+1];	
			 
		}
		ps->size--;
		printf("删除成功!\n");
	}
} 

//按类别查找 
void findkind(num_con *ps)
{
	int i=0,t=0;
	char a[cate]; 
	printf("按类别查找:\n请输入:>朋友、同事、商务、一般:>\n");
	scanf("%s",a);

	printf("正在查找中...\n");
	printf("————————————————————\n"); 
	for(i=0;isize;i++)
	{

			if(strcmp(ps->data[i].category,a)==0)
			{
				t=1;
				printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址"); 
		
			printf("%-10s\t%-10s\t%-10s\t%-10s\n",
			ps->data[i].name,
			ps->data[i].tele,
			ps->data[i].category,
			ps->data[i].email);	
			}
	}
	if(t==0)
	{
		printf("找不到啊呜呜呜\n"); 
	
	}

	
}


//按名字查找
void findname(num_con *ps)
{
	int i=0;
	if(0==ps->size)
	{
		printf("通讯录为空,无法查找\n");
		return;
	}
	char a[na]; 
	printf("按名字查找:\n请输入:>\n"); 
	scanf("%s",a);
	getchar();//接受回车 
	printf("正在查找中...\n");
	printf("————————————————————\n");
	int result=find(ps,a);
	if(result==-1)
	{
		printf("找不到啊呜呜呜\n"); 		
	} 
	else
	{
		printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址"); 
		printf("%-10s\t%-10s\t%-10s\t%-10s\n",
			ps->data[result].name,
			ps->data[result].tele,
			ps->data[result].category,
			ps->data[result].email);
	}	
}


//修改 
void modify(num_con *ps)
{
	int i=0;
	if(0==ps->size)
	{
		printf("通讯录为空,无法修改\n");
		return;
	}
	
	char a[na];
	printf("请输入要修改的人的名字\n");
	scanf("%s",a);
	
	//寻找名字 
	int result=find(ps,a);
	if(result==-1)
	{
		printf("找不到啊呜呜呜\n"); 		
	} 
	else
	{
		printf("已找到\n请输入修改的内容:>\n");
		printf("名字修改为:>\n");
		scanf("%s",ps->data[result].name);
		printf("电话修改为:>\n");
		scanf("%s",ps->data[result].tele);
		printf("类别修改为:>\n");
		scanf("%s",ps->data[result].category);
		printf("邮箱修改为:>\n"); 
		scanf("%s",ps->data[result].email); 
		printf("修改成功啦!\n");
	}
	
	
}


//排序
void sort(num_con *ps)
{
	int i=0,j=0;
	people peo;
	printf("正在按名字排序中:>\n");
	for(i=0;isize;i++)
	{
		for(j=i+1;jsize;j++)
		if(strcmp(ps->data[i].name,ps->data[j].name)>=0)
		{
			peo=ps->data[i];
			ps->data[i]=ps->data[j];
			ps->data[j]=peo;
		}
	}
	printf("排好啦!想看看嘛~\n");
}
 
 
//显示 
void show(const num_con *ps)
{
	int i=0;
	if(ps->size==0)
		printf("通讯录为空\n");
	else
	{
		printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址"); 
		for(i=0;isize;i++)
		{
			printf("%-10s\t%-10s\t%-10s\t%-10s\n",
			ps->data[i].name,
			ps->data[i].tele,
			ps->data[i].category,
			ps->data[i].email);	
		}	
	}
}


//清空 
void destory(num_con * ps)
{
	free(ps->data);
	ps->data=NULL;	
	ps->size=0;
	system("cls");
	printf("已被清空\n");
		
}

//加载 
void load(num_con *ps)
{
	
	people t={0};//创建成员信息的临时变量 
	FILE*pf=fopen("CONTACT","rb");
	if(pf==NULL)
	{
		printf("load::%s\n",strerror(errno));//错误信息
		return; 
	}
	//读取文件
	while(fread(&t,sizeof(people),1,pf))//如果读到 0 ,即读取完毕 
	{
		check(ps);//检查容量
		ps->data[ps->size]=t;
		ps->size++; 
	}
	fclose(pf); 
	pf=NULL;
}


void save(num_con *ps)
{
	int i=0;
	FILE* pf=fopen("CONTACT","wb");
	if(pf==NULL)
	{
		printf("save::%s\n",strerror(errno));//错误信息 
		return ;
	}
	
	//写入文件
	for(i=0;isize;i++)
	{
		fwrite(&(ps->data[i]),sizeof(people),1,pf);

	}
	fclose(pf);
	pf=NULL; 
	system("cls"); 
	printf("保存成功\n"); 
 }

强烈建议各位在敲完一段函数之后,及时调试,免得错误难以找出。最好还是一个函数一个文件。

最后附上课程设计报告,希望对你有所帮助。


1.课程设计内容简介

使用计算机对通讯录成员信息进行管理,拥有手工管理无法达到的优点。搜索迅速,查找方便,修改方便,存储量大,成本低等。将通讯录保存在电脑中,不仅十分便利,还能及时更新数据,防止数据丢失。

在本通讯录中,你可以对联系人进行分类,同事类、朋友类、商务类、一般类。分好组后,可以进行增删改查。当用户需要查询联系人时可以直接通过搜索名字,或者通过分组来查询联系人。本系统提高了查询工作效率,为用户提高更多便利。

2.需求分析

1.通讯录记录文件存储,要提供文件的输入输出功能,运行程序时将通讯录数据从文件读取到内存中;

2.实现成员信息的删改,因而提供文件的修改和删除,并将修改后的信息再保存到文件中;

3.要浏览所有成员记录,故提供显示操作;

4.要按名字排序输出信息,因而提供排序操作;

5.要清空通讯录信息,所以提供清空操作;

6.另外要提供可视化菜单以及实现功能的选择。

3.总体设计

整个成员管理系统设计为数据增加模块、数据修改模块、数据删除模块、数据查找模块、数据浏览模块、数据清空模块、数据保存模块

4.详细设计

数据结构采用结构体,设计成员信息纪录结构体并为struct people 创建一个新的名字people 

typedef struct people

{

char name[na];

char tele[te];

char category[cate];

char email[em];

}people;

主函数菜单的选择功能,用switch 实现,并使用枚举便于提示程序员,每一个数字对应的自定义功能。

enum Select

{

Exit,

Add,

Dele,

Find,

Modify,

Sort,

Show,

Destory,

Save,

};

(1)主函数输出提示菜单

增加成员纪录、修改成员纪录、删除成员纪录、查找成员记录、浏览成员纪录、清

空成员记录。

(2)检查容量模块

检查是否需要扩容,如果容量不足,则使用realloc增加空间。

(3)选择查找类别模块

通过菜单选择按什么类别查找,按名字,或按类别。

(4)查找名字模块

通讯录的查找修改可以通过该函数寻找是否存在某一成员,节省代码量。

(5)数据增加模块

通过菜单选择增加成员纪录。

(6)数据修改模块

通过菜单选择修改成员纪录。

(7)数据删除模块

通过菜单选择删除成员记录。

(8)数据查找模块

通过菜单选择查找成员记录,可按名字,可按类型。

(9)数据排序模块

通过菜单选择按名字这一字符串大小来排序。 

  

(10)数据显示模块

通过菜单选择显示成员记录,新输入的以及文件中的信息。     

(11)数据清空模块

通过菜单选择清空成员信息。

(12)文件读取模块

用fopen打开CONTACT文件,用fread读取CONTACT文件。将该模块放入初始化结构体数组的函数中,以后打开该程序使用显示功能,即可加载成员信息。

(13)文件保存模块

用fwrite把成员信息写入CONTACT文件,可通过菜单选择保存功能,也可选择退出功能时自动保存。

建立通讯录结构体数组,包含内容如下。

typedef struct num_con  //通讯录

{

people *data;//结构体数组 存放好多人信息

int size;//记录当前已有的元素个数

int capa;//当前最大容量 capa ==size时,容量已满

}num_con;

感谢观看!留个赞再走吧!祝你生活愉快!

你可能感兴趣的:(c语言)