数据结构课设—C语言实现通讯录管理系统(顺序表实现)

这个项目是我大一时期数据结构的课程设计,在我潜心研究下出来的,对于当时的我来说算是非常满意啦,哈哈哈哈哈哈哈哈哈哈☆*: .。. o(≧▽≦)o .。.:*☆

目录

一、引言

1.目的:

2.意义:

3.主要任务:

4.程序功能:

5.编译工具:

二、正文

1.系统模块:

2.算法流程图:

3.各个模块的实现:

(1)定义结构体

①定义xx(信息)结构体包含:

②定义结构体xxb(信息表)包含:

③实现代码:

(2)主函数main() 

①主函数模块main()的功能是:

   ②主函数模块main()流程如图(3)所示:

   ③主函数模块main()实现代码: 

(3)选单模块Menu() 

①选单模块Menu()的功能是:

②选单模块Menu()实现代码:

(4)退出选单模块Quit() 

①退出选单模块Quit()的功能是:

②退出选单模块Quit()实现代码:

(5)创建数据模块Create() 

①创建数据模块Create()的功能是:

②创建数据模块Create()的流程如图(4)所示:

③创建数据模块Create()实现代码:

(6)添加数据模块Add() 

①添加数据模块Add()的功能是:

②添加数据模块Add()的流程如图(5)所示:

③添加数据模块Add()实现代码:

(7)查询模块Find() 

①查询模块Find()的功能是:

②查询模块Find()的流程如图(6)所示:

③查询模块Find()实现代码:

(8)修改模块Alter() 

①修改模块Alter()的功能是:

②修改模块Alter()的流程如图(7)所示:

③修改模块Alter()实现代码:

(9)删除模块Delete() 

①删除模块Delete()的功能是:

②删除模块Delete()的流程如图(8)所示:

③删除模块Delete()实现代码:

(10)显示模块List() 

①显示模块List()的功能是:

②显示模块List()的流程如图(9)所示:

③显示模块List()实现代码:

(11)统计模块nv( ) 

①统计模块nv( )的功能是:

②统计模块nv( )的流程如图(10)所示:

③统计模块nv( )实现代码:

(12)显示公司信息模块ti( ) 

①显示公司信息模块ti( )的功能是:

②显示公司信息模块ti( )流程如图(11)所示:

③显示公司信息模块ti( )实现代码:

三、结论

四、参考文献

一、引言

1.目的:

(1)训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

2.意义:

(1)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

(2)训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。

3.主要任务:

使用顺序表实现对通讯录信息的插入、查找、删除、修改、输出等操作,以及统计通讯录中男女比例和显示出同一公司中的人的信息。

4.程序功能:

(1)显示提示菜单。

(2)创建顺序表。

(3)创建通讯人信息。

(4)添加通讯人信息。

(5)查找指定联系人信息。

(6)修改指定联系人信息。

(7)删除指定联系人信息。

(8)显示所有联系人信息。

(9)统计通讯录中男女比例。

(10)显示出同一公司中的人的信息。

(11)退出通讯录管理系统。

5.编译工具:

编程语言:C语言。

编译环境:Visual Studio 2022。

二、正文

1.系统模块:

系统模块主要是用选单模块来调用各个小模块来实现任务要求的功能,根据任务要求,下面将系统功能进行详细设计划分,具体结构如图(1)所示。

 

图(1) 系统模块图

2.算法流程图:

本系统通过main()函数进行对menu()调用,然后通过menu()利用Switch函数实现

利用其它函数进行相关操作,具体流程如图(2)所示

图(2) 算法流程图

3.各个模块的实现:

(1)定义结构体

定义xx(信息)结构体包含:

编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20])、公司名称(char address[50])

定义结构体xxb(信息表)包含:

单个信息(xx grxx[MaxLen])

表中共有多少信息(int length)

实现代码:

typedef struct {
	char num[10];
	char name[10];
	char sex[10];
	char phone[20];
	char address[50];
}xx;
typedef struct
{
	xx grxx[MaxLen];
	int length;
}xxb;

(2)主函数main()

主函数模块main()的功能是:

根据选单的选项调用各函数,并完成相应的功能。运用if判断用户输入的数值是否正确,用goto实现输错数值后的重新赋值,然后运用switch函数进行功能的选择。

主函数模块main()流程如图(3)所示:

图(3) 主函数模块main()流程图

主函数模块main()实现代码:      

int main()
{
	xxb L;
	int i;
	InitList(&L);
	while (1) {
		Menu();
		printf("请输入您想要的功能:(1-9)\t");
	loop:scanf_s(" %d", &i);
		if (i <= 0 || i >= 10)
		{
			system("cls");
			Menu();
			printf("未设定功能,请重新输入:");

			goto loop;
		}
		switch (i)
		{
		case 1:
			Create(&L);
			break;
		case 2:
			Add(&L);
			break;
		case 3:
			Find(L);
			break;
		case 4:
			Alter(&L);
			break;
		case 5:
			Delete(&L);
			break;
		case 6:
			List(L);
			break;
		case 7:
			nv(L);
			break;
		case 8:
			ti(L);
			break;
		case 9:
			Quit();
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

(3)选单模块Menu()

选单模块Menu()的功能是:

显示提示选单。使用printf函数进行界面排版。

选单模块Menu()实现代码:

void Menu()
{
	printf("\t\t\t《通讯录管理系统菜单》\n");
	printf(">————————————————————————————————\n");
	printf("*\t1.新建联系人\n");
	printf("*\t2.添加联系人信息\n");
	printf("*\t3.查找指定联系人信息\n");
	printf("*\t4.修改指定联系人\n");
	printf("*\t5.删除指定联系人\n");
	printf("*\t6.显示全部联系人信息\n");
	printf("*\t7.显示本通讯录男女比例\n");
	printf("*\t8.显示出同一公司中的人的信息\n");
	printf("*\t9.退出菜单\n");
	printf(">————————————————————————————————\n");
}

(4)退出选单模块Quit()

退出选单模块Quit()的功能是:

退出选单。运用exit()函数直接退出选单。

退出选单模块Quit()实现代码:

void Quit()
{
	exit(0);
}

(5)创建数据模块Create()

创建数据模块Create()的功能是:

创建新的数据记录。先判断通讯录是否满员,再进行输入内容,对编号进行判断是否重复,在输入其他数据,最后询问是否继续添加,使用循环结构进行多次写入。

创建数据模块Create()的流程如图(4)所示:

图(4) 创建数据模块Create()流程图

创建数据模块Create()实现代码:

void Create(xxb* L)
{
	xx x;
	char ch;
	int n = 0, i;
	do
	{
		printf(">————————————————————————————————\n");
		if (L->length == MaxLen)
		{
			printf("通讯录已满!\n");
			system("pause");
			system("cls");
			return;
		}
		printf("请输入通讯者的编号:");
		fflush(stdin);
	num:gets(x.num);
		for (i = 0; i < L->length; i++)
		{
			if (strcmp(L->grxx[i].num, x.num) == 0)
			{
				printf(">————————————————————————————————\n");
				printf("已有此编号,请重新输入:");
				goto num;
			}
		}
		printf("请输入通讯者的姓名:");
		gets(x.name);
		printf("请输入通讯者的性别:");
		gets(x.sex);
		printf("请输入通讯者的电话:");
		gets(x.phone);
		printf("请输入通讯者的公司名称:");
		gets(x.address);
		L->grxx[L->length++] = x;
		n++;
		printf(">————————————————————————————————\n");
		printf("是否继续添加通讯者信息?(Y/N):");
		scanf_s(" %c", &ch);
	} while (ch == 'y' || ch == 'Y');
	printf(">————————————————————————————————\n");
	printf("本次共添加%d位信息\n", n);
	system("pause");
	system("cls");
	return;
}

(6)添加数据模块Add()

添加数据模块Add()的功能是:

增加新的数据记录,并返回选单。判断通讯录是否满员,再进行输入内容,对编号进行判断,对编号进行判断是否重复,在输入其他数据

添加数据模块Add()的流程如图(5)所示:

图(5) 添加数据模块Add()流程图

添加数据模块Add()实现代码:

void Add(xxb* L)
{
	xx x;
	char ch;
	printf(">————————————————————————————————\n");
	if (L->length == MaxLen)
	{
		printf("通讯录已满!\n");
		return;
	}
	printf("请输入通讯者的编号:");
	fflush(stdin);
num:gets(x.num);
	for (int i = 0; i < L->length; i++)
	{
		if (strcmp(L->grxx[i].num, x.num) == 0)
		{
			printf(">————————————————————————————————\n");
			printf("已有此编号,请重新输入:");
			goto num;
		}
	}
	printf("请输入通讯者的姓名:");
	gets(x.name);
	printf("请输入通讯者的性别:");
	gets(x.sex);
	printf("请输入通讯者的电话:");
	gets(x.phone);
	printf("请输入通讯者的公司名称:");
	gets(x.address);
	L->grxx[L->length++] = x;
	printf(">————————————————————————————————\n");
	printf("添加成功!\n");
	system("pause");
	system("cls");
	return;
}

(7)查询模块Find()

查询模块Find()的功能是:

按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。先判断客户要根据什么值查找,再根据输入值进行判断查找,找到就输出其他信息,没找到就返回菜单。运用switch ( )和if的多层嵌套来判断客户想要实现的功能,再用for循环来查找数据,进行显示操作。

查询模块Find()的流程如图(6)所示:

图(6) 查询模块Find()流程图

查询模块Find()实现代码:

void Find(xxb L)
{
	int i;
	xx r;
	char e[20];
	printf(">————————————————————————————————\n");
	printf("1.按姓名查找\n");
	printf("2.按手机号码查找\n");
	printf("3.按编号查找\n");
	printf("0.返回菜单\n");
	printf(">————————————————————————————————\n");
	printf("请选择查找方式:");
loop1:scanf_s (" %d", &i);
	if (i < 0 || i > 3) {
		printf(">————————————————————————————————\n");
		printf("未设定功能,请重新输入:");
		goto loop1;
	}
	switch (i)
	{
	case 1:
		printf(">————————————————————————————————\n");
		printf("请输入姓名:");
		scanf_s ("%s", e);
		for (i = 0; i < L.length; i++)
		{
			r = L.grxx[i];
			if (strcmp(r.name, e) == 0)
			{
				printf(">————————————————————————————————\n");
				printf("姓名为(%s)的通讯者的其他信息为:\n编号:%s\t性别:%s\t电话:%s\t公司名称:%s\n", e, r.num, r.sex, r.phone, r.address);
				printf(">————————————————————————————————\n");
				system("pause");
				system("cls");
				return;
			}
		}
		printf(">————————————————————————————————\n");
		printf("未找到姓名为(%s)的通讯者\n", e);
		system("pause");
		system("cls");
		break;
	case 2:
		printf(">————————————————————————————————\n");
		printf("请输入电话:");
		scanf_s ("%s", e);
		for (i = 0; i < L.length; i++)
		{
			r = L.grxx[i];
			if (strcmp(r.phone, e) == 0)
			{
				printf(">————————————————————————————————\n");
				printf("电话为(%s)的通讯者的其他信息为:\n编号:%s\t性别:%s\t电话:%s\t公司名称:%s\n", e, r.num, r.name, r.sex, r.address);
				printf(">————————————————————————————————\n");
				system("pause");
				system("cls");
				return;
			}
		}
		printf(">————————————————————————————————\n");
		printf("未找到姓名为(%s)的通讯者\n", e);
		system("pause");
		system("cls");
		break;
	case 3:
		printf(">————————————————————————————————\n");
		printf("请输入编号:");
		scanf_s ("%s", e);
		for (i = 0; i < L.length; i++)
		{
			r = L.grxx[i];
			if (strcmp(r.num, e) == 0)
			{
				printf(">————————————————————————————————\n");
				printf("编号为(%s)的通讯者的其他信息为:\n编号:%s\t性别:%s\t电话:%s\t公司名称:%s\n", e, r.name, r.sex, r.phone, r.address);
				printf(">————————————————————————————————\n");
				system("pause");
				system("cls");
				return;
			}
		}
		printf(">————————————————————————————————\n");
		printf("未找到姓名为(%s)的通讯者\n", e);
		system("pause");
		system("cls");
		break;
	case 0:
		system("cls");
		break;
	}
	return;
}

(8)修改模块Alter()

修改模块Alter()的功能是:

修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。根据客户输入的修改方式进入对应的修改界面,再根据输入值进行修改,修改成功后返回菜单。运用switch ( )和if的多层嵌套来判断客户想要实现的功能,再用for循环来查找数据,进行修改操作。

修改模块Alter()的流程如图(7)所示:

图(7) 修改模块Alter()流程图

修改模块Alter()实现代码:

void Alter(xxb* L)
{
	int i, k = 0;
	xx r;
	char e[20];
	printf(">————————————————————————————————\n");
	printf("1.按姓名修改\n");
	printf("2.按手机号码修改\n");
	printf("3.按编号修改\n");
	printf("0.返回菜单\n");
	printf(">————————————————————————————————\n");
	printf("请选择修改方式:");
loop2:scanf_s (" %d", &i);
	if (i < 0 || i > 3) {
		printf(">————————————————————————————————\n");
		printf("未设定功能,请重新输入:");
		goto loop2;
	}
	switch (i)
	{
	case 1:
		printf(">————————————————————————————————\n");
		printf("请输入要修改人的姓名:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.name, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到姓名为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("姓名为(%s)的通讯者的原信息为:\n编号:%s\t性别:%s\t手机号码:%s\t公司名称:%s\n", e, r.num, r.sex, r.phone, r.address);
			printf(">————————————————————————————————\n");
			printf("请选择要修改的数据\n");
			printf("\t1.姓名;\n");
			printf("\t2.性别;\n");
			printf("\t3.电话;\n");
			printf("\t4.公司名称;\n");
			printf("\t0.退出\n");
			printf(">————————————————————————————————\n");
			printf("您要修改姓名为(%s)通讯者的哪项数据?\n", e);
			scanf_s ("%d", &k);
			switch (k)
			{
			case 1:
				printf("请输入新姓名:");
				scanf_s ("%s", r.name);
				break;
			case 2:
				printf("请输入新性别:");
				scanf_s ("%s", r.sex);
				break;
			case 3:
				printf("请输入新手机号码:");
				scanf_s ("%s", r.phone);
				break;
			case 4:
				printf("请输入新公司名称:");
				scanf_s ("%s", r.address);
				break;
			}
			L->grxx[i] = r;
			printf(">————————————————————————————————\n");
			printf("修改成功!\n");
		}
		system("pause");
		system("cls");
		break;
	case 2:
		printf(">————————————————————————————————\n");
		printf("请输入要修改人的手机号码:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.phone, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到手机号码为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("手机号码为(%s)的通讯者的原信息为:\n编号:%s\t性别:%s\t手机号码:%s\t公司名称:%s\n", e, r.num, r.name, r.sex, r.address);
			printf(">————————————————————————————————\n");
			printf("请选择要修改的数据\n");
			printf("\t1.姓名;\n");
			printf("\t2.性别;\n");
			printf("\t3.电话;\n");
			printf("\t4.公司名称;\n");
			printf("\t0.退出\n");
			printf(">————————————————————————————————\n");
			printf("您要修改手机号码为(%s)通讯者的哪项数据?\n", e);
			scanf_s ("%d", &k);
			switch (k)
			{
			case 1:
				printf("请输入新姓名:");
				scanf_s ("%s", r.name);
				break;
			case 2:
				printf("请输入新性别:");
				scanf_s ("%s", r.sex);
				break;
			case 3:
				printf("请输入新手机号码:");
				scanf_s ("%s", r.phone);
				break;
			case 4:
				printf("请输入新公司名称:");
				scanf_s ("%s", r.address);
				break;
			}
			L->grxx[i] = r;
			printf(">————————————————————————————————\n");
			printf("修改成功!\n");
		}
		system("pause");
		system("cls");
		break;
	case 3:
		printf(">————————————————————————————————\n");
		printf("请输入要修改人的编号:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.num, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到姓名为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("编号为(%s)的通讯者的其他信息为:\n编号:%s\t性别:%s\t电话:%s\t公司名称:%s\n", e, r.name, r.sex, r.phone, r.address);
			printf(">————————————————————————————————\n");
			printf("请选择要修改的数据\n");
			printf("\t1.姓名;\n");
			printf("\t2.性别;\n");
			printf("\t3.电话;\n");
			printf("\t4.公司名称;\n");
			printf("\t0.退出\n");
			printf(">————————————————————————————————\n");
			printf("您要修改手机号码为(%s)通讯者的哪项数据?\n", e);
			scanf_s ("%d", &k);
			switch (k)
			{
			case 1:
				printf("请输入新姓名:");
				scanf_s ("%s", r.name);
				break;
			case 2:
				printf("请输入新性别:");
				scanf_s ("%s", r.sex);
				break;
			case 3:
				printf("请输入新手机号码:");
				scanf_s ("%s", r.phone);
				break;
			case 4:
				printf("请输入新公司名称:");
				scanf_s ("%s", r.address);
				break;
			}
			L->grxx[i] = r;
			printf(">————————————————————————————————\n");
			printf("修改成功!\n");
		}
		system("pause");
		system("cls");
		break;
	case 0:
		system("cls");
		break;
	}
	return;
}

(9)删除模块Delete()

删除模块Delete()的功能是:

删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。根据客户输入的修改方式进入对应的删除界面,再根据输入值进行删除,最终确定客户是否删除,取消删除或删除成功后返回菜单。运用switch ( )和if的多层嵌套来判断客户想要实现的功能,再用for循环来查找数据,进行删除操作。

删除模块Delete()的流程如图(8)所示:

图(8) 删除模块Delete()流程图

删除模块Delete()实现代码:

void Delete(xxb* L)
{
	int i, j, k = 0;
	xx r;
	char e[20], y;
	printf(">————————————————————————————————\n");
	printf("1.按姓名删除\n");
	printf("2.按手机号码删除\n");
	printf("3.按编号删除\n");
	printf("0.返回菜单\n");
	printf(">————————————————————————————————\n");
	printf("请选择修改方式:");
loop3:scanf_s (" %d", &i);
	if (i < 0 || i > 3) {
		printf(">————————————————————————————————\n");
		printf("未设定功能,请重新输入:");
		goto loop3;
	}
	switch (i)
	{
	case 1:
		printf(">————————————————————————————————\n");
		printf("请输入要删除的通讯者的姓名:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.name, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到姓名为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("姓名为(%s)的通讯者的原信息为:\n编号:%s\t性别:%s\t手机号码:%s\t公司名称:%s\n", e, r.num, r.sex, r.phone, r.address);
			printf(">————————————————————————————————\n");
			printf("您确定要删除吗?(Y/N)\n");
			scanf_s (" %c", &y);
			if (y == 'y' || y == 'Y')
			{
				for (j = i; j < L->length; j++)
					L->grxx[j] = L->grxx[j + 1];
				L->length--;
				printf(">————————————————————————————————\n");
				printf("删除成功!\n");
				system("pause");
				system("cls");
				return;
			}
			else
			{
				printf(">————————————————————————————————\n");
				printf("您已取消删除!\n");
				system("pause");
				system("cls");
				return;
			}
		}
		system("pause");
		system("cls");
		break;
	case 2:
		printf(">————————————————————————————————\n");
		printf("请输入要删除的通讯者的手机号码:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.phone, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到手机号码为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("手机号码为(%s)的通讯者的原信息为:\n编号:%s\t性别:%s\t手机号码:%s\t公司名称:%s\n", e, r.num, r.name, r.sex, r.address);
			printf(">————————————————————————————————\n");
			printf("您确定要删除吗?(Y/N)\n");
			scanf_s (" %c", &y);
			if (y == 'y' || y == 'Y')
			{
				for (j = i; j < L->length; j++)
					L->grxx[j] = L->grxx[j + 1];
				L->length--;
				printf(">————————————————————————————————\n");
				printf("删除成功!\n");
				system("pause");
				system("cls");
				return;
			}
			else
			{
				printf(">————————————————————————————————\n");
				printf("您已取消删除!\n");
				system("pause");
				system("cls");
				return;
			}
		}
		system("pause");
		system("cls");
		break;
	case 3:
		printf(">————————————————————————————————\n");
		printf("请输入要删除的通讯者的编号:");
		scanf_s ("%s", e);
		for (i = 0; i < L->length; i++)
		{
			r = L->grxx[i];
			if (strcmp(r.phone, e) == 0)
			{
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			printf(">————————————————————————————————\n");
			printf("未找到编号为(%s)的通讯者\n", e);
			system("pause");
			system("cls");
			break;
		}
		else
		{
			printf(">————————————————————————————————\n");
			printf("编号为(%s)的通讯者的其他信息为:\n编号:%s\t性别:%s\t电话:%s\t公司名称:%s\n", e, r.name, r.sex, r.phone, r.address);
			printf(">————————————————————————————————\n");
			printf("您确定要删除吗?(Y/N)\n");
			scanf_s (" %c", &y);
			if (y == 'y' || y == 'Y')
			{
				for (j = i; j < L->length; j++)
					L->grxx[j] = L->grxx[j + 1];
				L->length--;
				printf(">————————————————————————————————\n");
				printf("删除成功!\n");
				system("pause");
				system("cls");
				return;
			}
			else
			{
				printf(">————————————————————————————————\n");
				printf("您已取消删除!\n");
				system("pause");
				system("cls");
				return;
			}
		}
		system("pause");
		system("cls");
		break;
	case 0:
		system("cls");
		break;
	}
	return;
}

(10)显示模块List()

显示模块List()的功能是:

显示所有记录。运用for实现数据的查找配合printf进行数据的输出。

显示模块List()的流程如图(9)所示:

图(9) 显示模块List()流程图

显示模块List()实现代码:

void List(xxb L)
{
	xx r;
	int i;
	printf("通讯者信息:\n");
	for (i = 0; i < L.length; i++)
	{
		r = L.grxx[i];
		printf("(%d)编号:%s\t姓名:%s\t性别:%s\t电话:%s\t公司名称:%s\n", i + 1, r.num, r.name, r.sex, r.phone, r.address);
	}
	system("pause");
	system("cls");
	return;
}

(11)统计模块nv( )

统计模块nv( )的功能是:

统计通讯录中男女比例。运用for实现数据的查找,if判断是否为男,为男则n++否则v++,显示男女比例n:v,返回选单。

统计模块nv( )的流程如图(10)所示:

图(10) 统计模块nv( )流程图

统计模块nv( )实现代码:

void nv(xxb L)
{
	int i, n = 0, v = 0;
	for (i = 0; i < L.length; i++)
	{
		if (strcmp(L.grxx[i].sex, "男") == 0)
			n++;
		else
			v++;
	}
	printf(">————————————————————————————————\n");
	printf("通讯录中男女比例为%d:%d", n, v);
	system("pause");
	system("cls");
	return;
}

(12)显示公司信息模块ti( )

显示公司信息模块ti( )的功能是:

显示出同一公司中的人的信息。运用for判断通讯录中是否有数据属于此公司,如果没有数据就返回选单,如果有数据属于此公司再判断属于此公司的通讯者并输出他们的信息,运行完成后回到选单。

显示公司信息模块ti( )流程如图(11)所示:

图(11) 显示公司信息模块ti( )流程图

显示公司信息模块ti( )实现代码:

void ti(xxb L)
{
	xx r;
	int i, k = 0;
	char e[20];
	printf(">————————————————————————————————\n");
	printf("请输入您要查找人员信息的公司名称:");
	scanf_s (" %s", e);
	for (i = 0; i < L.length; i++)
	{
		if (strcmp(L.grxx[i].address, e) == 0)
		{
			k = 1;
			break;
		}
	}
	if (k == 0)
	{
		printf(">————————————————————————————————\n");
		printf("本通讯录没有公司为(%s)的人员信息!", e);
		system("pause");
		system("cls");
		return;
	}
	else
	{
		printf(">————————————————————————————————\n");
		printf("本通讯录里公司为(%s)的所有人员信息为:\n", e);
		for (i = 0; i < L.length; i++)
		{
			r = L.grxx[i];
			if (strcmp(L.grxx[i].address, e) == 0)
				printf("(%d)编号:%s\t姓名:%s\t性别:%s\t电话:%s\t公司名称:%s\n", k++, r.num, r.name, r.sex, r.phone, r.address);
		}
		printf(">————————————————————————————————\n");
		system("pause");
		system("cls");
		return;
	}
	return;
}

三、结论

通讯录管理系统是我设计的第1个系统,面对现实当中通讯录管理的实际需求,我总结分析并设计了不同模块来满足需求。在模块的设计和调试当中,我感受到对顺序表有了更多的领悟,我会在之后巩固c语言的知识,坚持勤学勤练。在本次设计当中有许多我想要实现的复杂功能没能成功,系统在体验方面仍有不足。我会继续努力探索,掌握技巧实现更多更便利的功能。

我的通讯录管理系统总共设置了InitList( )、Menu( )、Quit( )、Create( )、Add( )、Find( )、Alter( )、Delete( )、List( )、nv( )、ti( )、main( )十二个模块;其中除去课题中要求的模块还有InitList( )模块,是用来定义顺序表的。同时我还定义了我自己的数据结构所需要的内存量length用来返回表中的数据数量,方便了各大模块的遍历。

本系统还可以添加更多的模块来使现在所拥有的模块变得更简洁运行速度更快,比如定义一个查找模块,使得原来的查找模块与删除模块、修改模块共用查找代码,让原来的查找模块、删除模块、修改模块变得更加简洁;

本系统其实还有很多可以优化的地方,各个模块的代码可以进行大幅度的缩减,有些模块也并未达到我理想的最佳效果,不过本次课设让我学到了很多,让我对顺序表的认知变多,也接触到了以前并未接触到的函数,总体来说我对我的第一个系统还是比较满意的。

四、参考文献

[1]谭浩强。C语言程序设计.北京:清华大学出版社,1997.

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾艾艾_艾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值