通讯录管理系统软件学院.docx
- 文档编号:2820181
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:21
- 大小:96.29KB
通讯录管理系统软件学院.docx
《通讯录管理系统软件学院.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统软件学院.docx(21页珍藏版)》请在冰豆网上搜索。
通讯录管理系统软件学院
案例一通讯录管理系统
1.1需求分析
1.1.1系统概述
随着科技的进步和信息产业的飞速发展,通讯录成为现代生活中一个重要的工具。
通讯录管理系统利用计算机对通讯录进行统一管理,包括添加、修改、删除、查询等功能,实现通讯录管理工作的系统化、规范化和自动化,为人们的工作和生活提供便利。
1.1.2系统运行环境
1、硬件环境
●处理器:
IntelPentium166MX或更高
●内存:
32MB
●硬盘空间:
1GB
●显卡:
SVGA显示适配器
2、软件环境
●操作系统:
Windows98/ME/2000/XP
1.1.3功能需求描述
1输入记录:
可从文件中将数据读入内存,也可直接从键盘输入数据并将它们存入数组中。
2查询记录:
提示用户输入要查找记录的序号或姓名,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
3删除记录:
提示用户输入要删除记录的姓名,如果没有该记录,显示没找到信息;否则,显示记录信息,并询问用户是否确实要删除,若是,则删除。
4修改记录:
提示用户输入要修改记录的姓名,首先查找该记录是否存在,若存在,则提示用户进行修改,否则提示用户没有找到该记录。
5插入记录:
提示用户输入某记录的姓名,并查找该记录是否存在,若存在,则提示用户输入新的记录信息插入在此记录前。
6记录排序:
按照姓名进行排序。
7保存信息至文件:
将所有的通讯录信息保存到磁盘文件中,以方便用户管理。
8文件备份:
将磁盘文件做一个备份文件,以防止数据意外丢失。
1.2总体设计
1.2.1设计思路
程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
在通讯录管理程序中,由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大,除了能够增加、删除、保存等外,更多的情况是查询,且能够实现快速查询,所以选用静态数组保存数据,实现多种查询方式。
1.2.2系统模块结构图
现代人社会交往越来越多,人们随身携带有通讯录,对通讯录进行必要的管理,对人们实现快速查询记录提供了极大的方便。
其基本功能模块如图1-1所示。
输入
显示
查找
删除
插入
保存
读入
按序号查找
拷贝
排序
快速查找
退出
图1-1基本功能模块图
1.2.3数据结构设计
由于使用静态数组需要预先估计记录数,所以先预定一个常数M,表示记录数,也就是数组的大小,记录联系人的信息至少应有姓名、单位、电话,所以定义每个数组元素的类型为结构体。
由于数组存储是采用顺序存放,在内在空间中占用连续空间,所以若干条记录通讯录的管理实质就是对顺序存储的线性表的管理。
结点结构如下:
#defineM50//估计的记录数
typedefstruct//定义数据结构
{
charname[20];//姓名
charunites[30];//单位
chartele[15];//电话
}ADDRESS;//结构体类型名
1.2.4功能模块设计
1、main()主函数
程序采用模块化设计,主函数是程序的入口,各模块独立,可分块调试,均由主函数控制调用。
控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
2、menu_select()主菜单
直接利用输出函数printf输出字符串,在屏幕上显示一个菜单,并显示一个提示输入选项,输入0-11之间的数字,将此数字作为菜单函数的返回值返回主函数,主函数根据这个数字调用相应的功能函数。
制作简便,操作简单,界面如图1-2所示。
图1-2主菜单界面
由于程序中很多地方用到了字符串输入语句,会造成下一个字符不能正确读入,为了在程序调用执行了各个函数后能够清晰地看到菜单,并输入新的选项,首先写了一条输出信息,printf("按任意键继续\n");表示按任意键继续,一条读字符语句等待输入字符,按任意键即可进入主菜单。
读者可以将这两条语句加上注释不执行来体会它的功能。
按照所见即所得的方式直接设计输出函数,输出字符串,达到菜单效果,将精力主要放在程序功能的实现上,利用do循环语句,一直执行scanf("%s",s);语句,让用户输入0-11之间的数,按照字符串形式输入,然后执行c=atoi(s);,将字符串转化为数字,返回主函数,如果输入范围不是0-11,则循环等待重新输入。
既然是数字选项,为什么不用整数格式输入,而要按字符串输入,再将其转换呢?
如果按照整数格式输入,当用户输入了非数字字符,例如a和b等,由于类型不同将导致程序出错,所以对于不参与运算的数据,表面上看是数字,也应将其设为字符处理,例如电话号码,千万不要设为整数类型。
程序设计技巧很多,所以同学们在编程调试中应注意并仔细体会。
3、输入模块
输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰,且能直接反映数据之间的关系。
但由于函数的特性,在输入时,数据用回车分隔也是可以的,但与界面设计不吻合。
界面如图1-3所示。
由于记录并不是一次性全部输入,而是随时增加和删除的,而预先开辟的空间数往往大于实际的记录数,所以程序设计为首先输入准备输入的记录数n,然后用循环语句循环n次,输入记录。
通讯录的每一条记录有三个字段,都是字符串类型,用格式输入scanf("%s%s%s",t[i].name,t[i].unites,t[i].tele);完成输入,三个字段用空格分隔。
输入完一条按回车键,继续输入下一条,达到规定的记录数,输入停止,返回记录数到主函数。
4、显示模块
通讯录建立好后,更频繁的操作是显示和查找记录,本模块实现显示所有记录功能。
输出界面如图1-4所示。
图1-4输出界面
将主函数传递过来的数组输出,用for循环,循环次数由参数长度决定。
输出时,为了格式美观清晰,设计一定的样式输出,注意利用格式输出函数,根据字段的长度设定输出的长度,每输出10个记录暂停一下,按任意键继续。
5、查找模块
查找指定姓名的记录,采用顺序查找法。
首先输入要查找记录的姓名,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个find()函数,专门进行查找。
从第一条记录开始,将记录中的姓名字段和待比较的姓名字符串s进行比较,一旦相等,程序结束,返回该记录的下标号i,也就是记录所在的序号;如果不相等,则继续下一条比较,所有记录比较完毕,循环结束,返回此时的下标变量i的值。
search()函数通过调用find()得到了整数i,判断i的值如果大于n-1,已超过实际记录数,说明所有记录都进行比较,没有找到,查找不成功;否则说明找到,调用输出函数print(),显示该第i条记录。
6、删除模块
输入要删除记录的姓名,调用find函数,如果没有该记录,显示没找到信息;否则,调用print函数,显示记录信息,接着显示是否确实要删除,请输入确认信息整数0或1,1表示是,0表示否。
如果输入了1,则系统删除信息。
要删除数组中的某一条记录,实际所做的操作是将其后继记录依次前移一条,所以删除第i条记录,用for语句,从i+1开始,依次将每个字段拷贝到前一条记录的相应字段,即覆盖了前一条记录,达到前移的目的,直到最后一条记录。
注意前移记录的时候是逐个字段赋值,不能一个记录整体赋值。
由于删除了一条记录,记录数减1,返回记录数,程序结束。
假如删除前如图1-5所示,则删除第i条记录后如图1-6所示。
t0
t1
…
ti-1
ti
ti+1
ti+2
…
tn-1
图1-5删除记录前
t0
t1
…
ti-1
ti+1
ti+2
…
tn-1
图1-6删除记录后
7、插入模块
输入要插入记录的信息,保存到临时变量temp中,然后再输入一个姓名,用字符串s表示,确定新记录插入在该记录之前,调用find()函数查找姓名为s的记录,得到该记录所在的序号,从最后一条记录开始,向后移动,即第n-1条移动到第n条,第n-2条移动到第n-1条,直到第i条移动到第i+1条,将新信息存入到第i条记录位置。
注意移动必须从后倒退,否则从第i条开始,将会覆盖后面的信息数据而出错。
如果没有指定的记录,则find函数返回的i值为n,实际上一条记录也不会移动,新信息将会插入到最后一个位置。
假如插入前如图1-7所示,则记录插入在i位置后如图1-8所示。
t0
t1
…
ti-1
ti
ti+1
ti+2
…
tn-1
图1-7插入记录前
t0
t1
…
ti-1
temp
ti
ti+1
ti+2
…
tn-1
图1-8插入记录后
8、保存模块
前面所讲到的数据输入和输出是以终端为对象的,当程序关闭后,数据也丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。
按照文件的读写要求,先定义一个指向文件的指针,按照wb写的方式打开文件名为record.txt的文件(文件名可任意定义),如果文件不存在则系统自动创建该文件,保存在某文件夹下(用户可以任意指定),然后确定文件的打开方式,如果文件不能正常打开,则退出程序;否则,先写入记录数n,然后用循环语句,用文件格式输出语句fprintf(fp,"%-20s%-30s%-15s",t[i].name,t[i].unites,t[i].tele);逐条写入记录,每输出一条,写入一个换行符号。
因为是文本文件,写入后record.txt文件可以用Windows下的记事本打开,如图1-9所示。
9、读入模块
数据一旦输入保存到磁盘文件中后,更多的操作是将数据从文件读入内存,进行显示、查找等各项操作。
按照文件的读写要求,先定义一个指向文件的指针,按照rb的方式打开已经保存好的文件record.txt,用语句fp=fopen("record.txt","rb"),同时判断是否正常打开,如果文件打不开,则退出程序;否则,利用格式输入函数,先读出记录数,然后利用循环语句,用格式输入函数fscanf(fp,"%20s%30s%15s",t[i].name,t[i].unites,t[i].tele);将记录逐条读入,读出的记录保存在结构体数组中。
由于结构体数组是用数组名作为参数,而数组名是数组存放的单元首地址,所以它是一种地址传递方式,数据的变动直接反映在参数所指的数组。
而记录数是按值传递,其值的改变不会影响到主函数,为了保证数据的正确性,所以将记录数返回主函数。
10、按序号查找模块
由于数组是按照顺序存储的,且对数组元素的访问可以直接按照其下标号实现随机访问,所以设计了按照记录位置(也就是记录的序号)访问记录。
本模块实现的是从文件中查找,所以先用rb方式打开记录文件record.txt,输入序号id,从文件读入记录数,判断序号位置在记录数范围之内,由于记录是顺序存放,所以指定序号id的存储位置首地址应为(id-1)*sizeof(ADDRESS),利用函数fseek将记录指针移动到该位置,读出记录,调用print()函数显示它。
11、拷贝模块
为了保存数据,防止意外发生,为数据做备份是很有必要的。
本模块是将文件读写功能结合到一起的应用。
将事先保存的记录文件record.txt按rb方式打开,输入目标文件名,然后利用文件读写函数将源文件中的信息写到目标文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 系统软件 学院