通讯录管理.doc
- 文档编号:1978500
- 上传时间:2023-05-02
- 格式:DOC
- 页数:29
- 大小:414.50KB
通讯录管理.doc
《通讯录管理.doc》由会员分享,可在线阅读,更多相关《通讯录管理.doc(29页珍藏版)》请在冰点文库上搜索。
计算机科学与技术学院
《C高级语言程序设计》课程设计报告
(2014/2015学年第一学期)
学生姓名:
薛晋
学生专业:
网络工程
学生班级:
132003班
学生学号:
201320030328
指导教师:
赵俊忠
2015年 1月 10日
计算机科学与技术学院
课程设计任务书
课程设计名称
《C高级语言程序设计》课程设计
课程设计题目
通讯录管理
学生姓名
薛晋
专业班级
网工132003
学号
201320030328
课程设计任务内容
[问题描述]将通讯录的姓名、性别,年龄、电话等进行结构体的声明,再定义结构数组以便进行统一处理。
之后设计菜单函数,显示操作项目,并对添加、显示、查找、删除、排序等功能模块进行调用,以实现管理系统的整体功能。
是用户的工作平台,也是用户与系统对话的平台。
像删除、查找等模块都有子菜单,这样使条理更清晰,并且加入通讯录的容量,使用户可以了解通讯录的存储。
[基本要求]
(1)程序基于结构体数组设计出了通讯录管理系统的基本功能,能对成员的学号、姓名、年龄、电话等进行添加、显示、查找、删除等操作,并且能通过电话号通讯录。
[测试要求]
(1)通信录信息通过链表形式存储,按电话号码降序存储。
按电话号码查询学生信息功能在排序的链表基础上实现。
指导教师:
赵俊忠
时间:
2015年1月10日
目录
一功能需求描述 1
二系统设计描述 2
2.1任务分解 2
2.2函数名以及功能 2
三算法描述 3
3.1流程介绍 3
3.1.1添加流程 3
3.1.2显示流程 4
3.1.3查找流程 5
3.1.4删除流程 5
3.1.5排序流程 6
3.1.6退出流程 6
四开发过程描述 7
4.1:
源代码 7
五设计心得体会 20
附录一:
必选题(链表) 21
源代码:
21
一功能需求描述
在C语言中,数组这样的构造数据类型可以将多个数据用一个名字来命名,为储存和处理带来很大的方便。
但是现实生活中还存在着大量需要作为一个整体来处理的数据,而这些数据的类型又不尽相同。
例如要处理通讯录数据,需要处理学生的学号(num)、姓名(name)、性别(sex)、年龄(age)、电话(phone)、和工作(job)等数据。
这样一组相互关联的数据如果用简单的变量储存,则难以反映出它们的内在联系,而且是程序冗长晦涩;而数组则无法容纳不同变量的元素。
结构体(structure,也称“结构”)就是C语言所提供的处理一组不同类型数据的类型。
但是这种类型需要用户自行定制,因为处理学生的结构体形式与处理教师的结构体形式不同,处理人的结构体形式与处理企业、处理产品、处理公文等的结构体形式均不同,等等。
因此,在结构体的大框架内,还要根据具体需要来定制自己的结构体类型[1]。
一个结构体只能存放一个对象的信息,但经常都是对一组对象来处理若干数据,这样就会用到结构体数组,结构体数组可以将若干待处理对象编成数组形式,然后再把每个对象的信息又存放到结构体中,这样就实现了对若干不同的对象来处理若干不同类型的数据。
因此结构体把数组在生活当中有广泛的应用[2]。
随着全球信息化水平逐步提高,通讯系统逐步成熟,通信成为我们生活中不可缺少的一部分。
通信系统的发达,通信方式的增多,记录信息量的增大,对于通信信息的处理将越来越复杂,仅仅靠人工操作已经满足不了人们的需求,使用功能全、信息量大的管理系统是一个不错的选择。
本次课程设计主要运用C语言中的结构体、数组、链表等数据结构,设计一个简单的管理系统应用程序。
本次课设主要考察了对函数的编写,对指针和数组的相关操作、结构体的定义和使用、算法的分析及设计、流程图的绘制等项目,对于熟悉编程环境、掌握编程流程、了解编程规范都有积极作用。
通过这次课设我们可以了解到数据结构算法的基本思想、锻炼编程思维,养成良好的编程习惯以及严谨的编程态度,为以后的设计打下良好的基础。
本程序基于结构体数组设计出了通讯录管理系统的基本功能,能对成员的学号、姓名、年龄、电话等进行添加、显示、查找、删除等操作,并且能通过姓名通讯录,符合一般管理系统的功能。
二系统设计描述
2.1任务分解
首先,将通讯录的姓名、性别,年龄、电话等进行结构体的声明,再定义结构数组以便进行统一处理。
之后设计菜单函数,显示操作项目,并对添加、显示、查找、删除、排序等功能模块进行调用,以实现管理系统的整体功能。
是用户的工作平台,也是用户与系统对话的平台。
像删除、查找等模块都有子菜单,这样使条理更清晰,并且加入通讯录的容量,使用户可以了解通讯录的存储,总体设计框图如图1所示。
主菜单
1
添加通讯录
2
显示通讯录
3
查找通讯录
4
删除通讯录
5
排序通讯录
6
退出并保存
图1程序的总体框图
2.2函数名以及功能
voidHandleChoice_f(int);//功能选择
voidAddRecord_f();//加入记录
voidInsertNode_f(Node*);//插入节点
Node*InsertPoint_f(char*);//寻找插入点
voidMakeNewHead_f(Node*);//
voidAddToEnd_f(Node*);//
voidMoveToEnd_f();//
voidDisplayList_f();//显示全部记录
voidDeleteRecord_f();//删除记录
voidDelNode_f(Node*);//删除节点
voidDelList_f();//删除链表
voidSearchByPhoneNum_f();//按电话查找记录
voidWriteFile_f();//记录写入文件并关闭程序
voidLoadFile_f();//加载原有记录
intlind_num(plistp_head);
plistlind_shun(plistp_head);//排序
boolbig_char(char*ch0,char*ch1);
三算法描述
3.1流程介绍
本程序一共有六个流程,即添加流程、显示流程、查找流程、删除流程、排序流程、保存流程及退出流程,为分别实现上述六种功能,下面介绍一下这六个流程。
3.1.1添加流程
通过此流程可以实现对信息的添加,首先先对容量进行测试如果没有容量则提示信息已满,若有容量,则显示通讯录使用量和总容量,再对姓名、学号等逐项输入,输入完毕后系统会提示是否继续添加,若是,则继续添加,若否则返回菜单函数。
开始
N
Y
内存分配允许?
输入信息
内存错误
InsertNode_f
结束
图2添加功能的流程图
3.1.2显示流程
通过此流程可以对录入的信息进行输出,只有当有录入信息时才会输出,否
则显示“没有此学生”。
流程图如图3所示。
结束
N
Y
开始
“没有此记录”
是否有该记录?
显示通讯录信息
图3显示功能的流程图
3.1.3查找流程
通过此流程可以实现对录入信息的查找,此程序支持三种查找方式,按学号、姓名、电话查找,然后判断是否有此人,有则输出该用户信息,并且显示通讯录使用容量和剩余容量,否则输出“没有此人信息”并进行重新选择。
流程图如图4所示。
结束
Y
开始
输入查找人姓名
9姓名
N
判断是否有此人?
“没有此记录”
输出此人信息
图4查找功能的流程图
3.1.4删除流程
通过此流程可以对录入的信息进行删除。
此程序提供学号、姓名、电话来查找删除人若没有此人,则显示没有此人信息,并返回删除菜单。
若有此人,系统会询问用户是否删除信息,是则删除,否则不删除,并返回删除菜单。
流程图如图5所示。
开始
输入删除人姓名
9姓名
N
Y
判断是否有此人?
显示信息
没有此人信息
节点删除释放空间
结束
图5删除功能的流程图
3.1.5排序流程
通过此函数可以实现对录入信息进行排序。
的功能此程序提供按学号和姓名的排序,此函数的算法即冒泡法排序通过对排序量进行交换,从而达到排序的目的。
图6排序功能的流程图
开始
以号码排序
返回首节点
3.1.6退出流程
开始
写入文件
删除整个链表
结束
四开发过程描述
4.1:
源代码
#include
#include
#include
#defineboolint
#definefalse0//宏定义
#definetrue1//宏定义
typedefstructnode*plist;//定义指针类型结构plist
#defineNodestructnode//宏定义Node=structnode
Node//结构体类型定义
{
charszName[20];
charszSex[4];
charszAge[4];
charszPhoneNum[12];
charszJob[30];
Node*next;//结构体中指针
};
Node*strpHead;//全局变量,链表头指针
Node*strpCurrent;//用于指向当前正在操作的结点
//函数原型声明
voidHandleChoice_f(int);//功能选择
voidAddRecord_f();//加入记录
voidInsertNode_f(Node*);//插入节点
Node*InsertPoint_f(char*);//寻找插入点
voidMakeNewHead_f(Node*);//
voidAddToEnd_f(Node*);//
voidMoveToEnd_f();//
voidDisplayList_f();//显示全部记录
voidDeleteRecord_f();//删除记录
voidDelNode_f(Node*);//删除节点
voidDelList_f();//删除链表
voidSearchByPhoneNum_f();//按电话查找记录
voidWriteFile_f();//记录写入文件并关闭程序
voidLoadFile_f();//加载原有记录
intlind_num(plistp_head);
plistlind_shun(plistp_head);//排序
boolbig_char(char*ch0,char*ch1);
//主程序
intmain()
{
intUserChoice;
system("cls");//系统中的清屏函数
system("pause");//系统中的暂停函数
strpHead=NULL;//令头指针为空
LoadFile_f();//导入文件
do
{
printf("-----------------菜单--------------------------\n\n");
printf("1.增加记录\n");
printf("2.显示所有记录 \n");
printf("3.按电话查找朋友的信息 \n");
printf("4.删除记录 \n");
printf("5.排序记录\n");
printf("6.退出程序(自动保存记录)\n");
printf("-----------------------------------------------\n\n");
printf("请选择代码(1,2,3,4,5,6):
");
scanf("%d",&UserChoice);//输入语句
HandleChoice_f(UserChoice);//调用用户选择函数
}while(UserChoice>=1&&UserChoice<=6);//判断语句,否则返回do
return0;//返回值
}
//选择函数
voidHandleChoice_f(intUserChoice)//根据用户选择nChoice调用相应的函数
{
switch(UserChoice)//switch选择函数
{
case1:
AddRecord_f();break;//调用添加函数
case2:
DisplayList_f();break;//调用显示函数
case3:
SearchByPhoneNum_f();break;//调用按姓名查找函数
case4:
DeleteRecord_f();break;//删除记录
case5:
strpHead=lind_shun(strpHead);//排序链表函数
break;
case6:
WriteFile_f();//将链表中的数据写回文件,结束程序
if(strpHead!
=NULL)//如果头指针为空
{
DelList_f();//删除链表
}
break;
default:
printf("没有您要的选项!
\n");
break;
}
}
//添加纪录
voidAddRecord_f()
{
Node*strpNew;//为新记录定义临时指针变量
strpNew=(Node*)malloc(sizeof(Node));//申请大小为node,类型为node*,指针类型的空间
getchar();
printf("姓名:
");
gets(strpNew->szName);
printf("性别:
");
gets(strpNew->szSex);
printf("年龄:
");
gets(strpNew->szAge);
printf("电话号码:
");
gets(strpNew->szPhoneNum);
printf("工作:
");
gets(strpNew->szJob);
InsertNode_f(strpNew);
system("cls");
}
//插入函数
voidInsertNode_f(Node*strpNew)
{
Node*strpFront;//添加临时指针
Node*strpBack;//添加临时指针
system("cls");//清屏
if(strpHead==NULL)//空链表,待插入节点就是首节点;
{
strpNew->next=NULL;//令strpnew对应节点的next为空
strpHead=strpNew;//令待插节点为头结点值
}
else
{
if(strcmp(strpNew->szName,strpHead->szName)<0)//带插入节点姓氏首字母在原来首节点之前,插入形成新的首节点
{
MakeNewHead_f(strpNew);
}
else//待插入点不是首节点位置,查找新结点的位置
{
strpCurrent=InsertPoint_f(strpNew->szName);
strpFront=strpCurrent;//指向待插入位置的前向节点
strpBack=strpCurrent->next;//指向待插入位置的后继节点
if(strpBack==NULL)//插入位置在链表最后
{
AddToEnd_f(strpNew);
}
else
{
strpFront->next=strpNew;//节点插入
strpNew->next=strpBack;
}
}
}
}
Node*InsertPoint_f(char*szName)
{
charszTempName[20];
Node*strpTemp;
intnTemp;
if(strpHead->next!
=NULL)//初始链表存在多个节点
{
strpCurrent=strpHead;//指向原始链表首节点
strpTemp=strpCurrent->next;//指向原始链表第二个节点
strcpy(szTempName,strpTemp->szName);//获取第二节点姓名
nTemp=strcmp(szName,szTempName);//待插入节点姓名与第二节点姓名
while((nTemp<0)&&(strpCurrent->next!
=NULL))//若首字母靠后,向后查找插入位置
{
strpCurrent=strpTemp;//将头结点赋值当前节点
if(strpCurrent->next!
=NULL)//当前指针指向的结点中next不为空
{
strpTemp=strpCurrent->next;
strcpy(szTempName,strpTemp->szName);
nTemp=strcmp(szName,szTempName);
}
}
}
else//插入位置在首节点之后
{
strpCurrent=strpHead;
}
return(strpCurrent);
}
// 函数功能:
新结点成为链表的头结点;参数:
插入节点地址;返回值:
无;
voidMakeNewHead_f(Node*strpNew)/*新结点成为链表的头结点*/
{
Node*strpTemp;
strpTemp=strpHead;
strpNew->next=strpTemp;
strpHead=strpNew;
}
// 函数功能:
新结点成为链表的尾结点;参数:
插入节点地址; 返回值:
无;
voidAddToEnd_f(Node*strpNew)
{
strpNew->next=NULL;
MoveToEnd_f();
strpCurrent->next=strpNew;
}
// 函数功能:
当前指针移到链表尾;参数:
无;返回值:
无;
voidMoveToEnd_f()
{
strpCurrent=strpHead;
while(strpCurrent->next!
=NULL)//查找尾节点
strpCurrent=strpCurrent->next;
}
// 函数功能:
显示链表内容;参数:
无;返回值:
无;
voidDisplayList_f()
{
strpCurrent=strpHead;//指向首节点
if(strpCurrent!
=NULL)//如果不是空链表,显示内容
{
printf("\n");
printf("姓名性别年龄电话号码工作\n");
printf("-----------------------------------------------------\n");
do
{
printf("%10s",strpCurrent->szName);
printf("%10s",strpCurrent->szSex);
printf("%10s",strpCurrent->szAge);
printf("%15s",strpCurrent->szPhoneNum);
printf("%10s",strpCurrent->szJob);
strpCurrent=strpCurrent->next;
printf("\n");
}while(strpCurrent!
=NULL);
system("pause");
system("cls");
}
else//链表为空
printf("没有记录可以显示!
\n");
}
// 函数功能:
按姓名查找记录;参数:
无;返回值:
无;
voidSearchByPhoneNum_f()
{
charszSearch[20];
strpCurrent=strpHead;
system("cls");
getchar();
printf("\n输入您要查找的号码:
");
gets(szSearch);
while((strpCurrent!
=NULL)&&(strcmp(strpCurrent->szPhoneNum,szSearch)!
=0))//链表不为空,查找位置
strpCurrent=strpCurrent->next;
if(strpCurrent!
=NULL)//链表结束前,则找到对应记
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理