高级语言课程设计报告格式朱立刚.docx
- 文档编号:28108047
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:14
- 大小:310.23KB
高级语言课程设计报告格式朱立刚.docx
《高级语言课程设计报告格式朱立刚.docx》由会员分享,可在线阅读,更多相关《高级语言课程设计报告格式朱立刚.docx(14页珍藏版)》请在冰豆网上搜索。
高级语言课程设计报告格式朱立刚
西安郵電學院
高级语言课程设计报告书
系部名称
通信工程学院
学生姓名
朱立刚
专业名称
电子信息科学与技术
班级
电科0901班
学号
04092013
指导教师
夏虹
时间
2010年11月22日至
2010年12月03日
实验题目电话簿管理系统
一、实验目的
1.利用静态数组实现电话簿管理,数组中每一个元素是结构体类型;
2.通过这个例子了解数据管理的基本功能;
3.通过实验掌握数组元素为结构体的应用,数组作函数参数,文件读写等知识。
二、实验内容
1.用c语言编写一个简单、但操作齐全的电话簿管理系统;
2.编程时采用结构体、数组(链表)、文件等数据结构存储组织数据。
实现:
数据的录入、数据读写和数据存储;数据的添加、修改、删除、查询操作;
数据的统计、排序及报表打印。
三、需求分析
要实现对电话簿进行操作,必须先定义主函数。
对于一个合格的电话簿系统,首先必须考虑信息安全问题,我先写了一个密码保护函数,运行前先进行密码输入,有三次出错机会;正确,进入菜单选项,否则,跳出。
对于电话簿,必须能进行信息录入,于是设计了信息录入选项;信息录入后还必须进行显示,又设计了显示记录选项;对于通讯录的一个基本功能——查找,我设计了按姓名查找和按序号查找选项。
对于电话簿的添加、修改、删除问题,还必须有添加修改选项、删除选项。
为方便查找,我设计了按姓名字母字典顺序的排序方法;并进行了文件的保存与备份。
对于一个刚打开的新程序,只有进行了文件读入才能对信息进行操作,否则就必须进行信息输入,为避免这种有违设计理念的问题,我加入了读取信息选项。
四、概要设计
1、方案设计
基本功能模块结构图
2、数据结构说明
#defineM50/*估计的记录数*/
typedefstruct
{
charname[20];/*字符型姓名*/
charunits[30];/*字符型地址*/
chartele[10];/*字符型电话号码*/
}ADDRESS;/*结构体类型名*/
各函数作用:
voidmain();/*主函数*/
voidpassword();/*密码保护函数*/
intenter(ADDRESSt[]);/*输入函数*/
voidlist(ADDRESSt[],intn);/*显示记录函数*/
voidsearch(ADDRESSt[],intn);/*按姓名查找记录函数*/
intdelete(ADDRESSt[],intn);/*删除记录函数*/
intadd(ADDRESSt[],intn);/*添加记录函数*/
voidsave(ADDRESSt[],intn);/*保存记录函数*/
intload(ADDRESSt[]);/*读取文件函数*/
voiddisplay(ADDRESSt[]);/*按序号查找显示记录函数*/
voidsort(ADDRESSt[],intn);/*按姓名排序函数*/
voidqseek(ADDRESSt[],intn);/*快速查找函数*/
voidcopy();/*文件复制函数*/
voidprint(ADDRESStemp);/*显示单条记录函数*/
intfind(ADDRESSt[],intn,char*s);/*查找函数*/
intmenu_select();/*菜单函数*/
3、各模块功能说明
main();主函数
程序采用模块化设计,主函数是程序入口,各模块相互独立,可分块调试,均由主函数控制调用。
控制功能通过循环执行一个开关语句,该语句条件是通过调用主菜单函数得到的返回值,根据该值调用相应的各功能函数,同时设置一个断点(即当返回值为一定条件时运行exit()函数结束程序)以避免造成死循环。
voidpassword();密码保护函数
程序事先定义一个已知的字符串作为密码,通过数组将输入字符与原字符比较(用强制转化函数atoi()将字符转化为整型数字比较大小)。
密文输入通过“for(i=0;i<3;i++){b[i]=getch();printf("*");}”实现。
通过三个if嵌套语句实现整型数的比较与是否继续操作的判断。
intmenu_select();主菜单
利用输出函数printf()输出字符串,在屏幕上显示一个菜单和提示输入选项,输入0~11之间的数字(字符型),然后执行c=atoi(s),将字符转化为数字,如果不在0~11之间则循环等待重新输入,入果在范围内则将此数字作为菜单函数的返回值返回给主函数,主函数根据返回值调用相应功能函数。
intenter(ADDRESSt[]);输入记录函数
输入记录时按照一条一行的格式输入,每个数据之间用空格分隔。
由于记录不是一次性全部输入,而是随时添加和删除的,而预先开辟的空间数往往大于实际记录数,所以程序设计为首先输入准备输入的记录数n,再用for循环语句循环n次,输入记录。
每一条记录有三个字段,都是字符串类型,用格式输入函数scanf(“%s%s%s”t[i].name,t[i].adr,t[i].tele)完成输入(用空格分隔)。
输入停止,返回到主函数。
voidlist(ADDRESSt[],intn);显示所有记录
将主函数传递过来的数组用for循环输出,循环次数由参数长度决定。
voidsearch(ADDRESSt[],intn);和
intfind(ADDRESSt[],intn,char*s);查找记录函数
按姓名查找采用顺序查找。
先输入要查找姓名,然后按顺序查找结点,如果没有找到则输出没有找到,否则,显示找到的记录信息。
查找函数自己定义了find()函数,专门用于查找。
从第一条记录开始,将记录中的姓名字段和待比较的姓名字符串s进行比较,如果相等程序结束,返回该记录下标号i;如果不相等,则继续下一条比较,所有记录比较完后循环结束,返回下标变量i。
search()函数通过调用find()得到整型数i,判断i值如果大于n-1,已超过实际记录数,说明所有记录都进行过比较,没有找到则查找不成功;否则,调用输出函数 printf(),显示第i条记录。
intdelete(ADDRESSt[],intn);删除记录函数
输入要删除记录的姓名,调用find()函数,如果没有该记录,显示没有找到信息;否则,调用printf()函数,显示记录,并接着显示是否要删除选项。
如果确实要删除该记录,则将其后记录以次前移。
所以删除第i条记录,用for循环语句,从第i+1开始,一次将每个字段拷贝到前一条记录相应字段,直到最后一条记录。
由于删除了一条记录,所以记录总数减一,返回记录数,程序结束。
intadd(ADDRESSt[],intn);插入、修改记录函数
先输出插入、修改选项,1代表插入2代表修改。
从键盘输入选择数,进入if循环函数,如果不是1或2,则显示出错并结束该次程序;否则;判断为1进入插入选项,判断为2进入修改选项。
对于插入选项,定义一个临时变量temp,并将输入信息存放在该变量内;再输入插入位置的姓名,调用find()函数查找,找到后用for循环,将当前记录信息拷贝到后一条,再将新纪录信息拷贝到第i位;由于新插入,所以记录数n=n+1,并返回n值。
对于修改记录选项,同样调用find()函数,找出需要修改者;再将新修改信息存储在临时变量temp中,最后分别将该新修改记录拷贝到第i位相应位置,并反回n值。
该程序结束。
voidsave(ADDRESSt[],intn);保存函数
先定义一个指向文件的指针,按照wb写的方式打开文件名为record.txt的文件,如果文件不存在,则自动新创建该文件,如果文件不能正常打开则退出程序;否则,先写入记录数n,然后用循环语句,用文件格式输出语句fprintf(fp,"%2s%18s%32s",t[i].name,t[i].adr,t[i].tele);intload(ADDRESSt[])逐条写入记录,每输出一条,写入一个换行符号。
voiddisplay(ADDRESSt[]);按序号查找函数
由于数组是按照顺序存储的,且对数组元素的访问可以直接按照其下标号实现随机访问,所以设计了按照记录位置访问记录。
本函数实现的是从文件中查找,所以先用rb方式打开记录文件record.txt,输入对应序号id,从文件中读入记录数,判断序号位置在记录数范围内是顺序存放,所以指定序号id的存储位置首地址为(id-1)*sizeof(ADDRESS)利用fseek函数将记录指针移动到该位置,读出记录数,调用print()函数显示该条记录。
voidsort(ADDRESSt[],intn);按姓名排序函数
本函数采用冒泡排序法,按照姓名排序,所以排序码为记录的姓名字段,由于数组下标是从0开始的,所以n条记录的比较是从t[0].name,t[1].name开始到t[n-2].name,t[n-1].name,因为姓名是字符串所以用字符串比较函数strcmp()实现,移动记录借助临时结构体变量temp,移动要保持整条记录的移动,所以每个字段都要移动,对于字符串赋值使用复制函数strcpy()实现。
voidqseek(ADDRESSt[],intn);按序号查找函数
本函数采用二分法查找,首先用检索的姓名值与中间位置结点的姓名进行比较,如果相等,则检索完成,调用print()函数显示信息;若不相等,再根据姓名比较该中间姓名字段的大小,确定下一步检索范围,如果大于,则在后一区间检索,如果小于,在后一区间检索,重复这样的步骤直到找到或者确定没这样的结点为止。
范围的具体划分设置变量l、r分别代表左边界和右边界,初值l=0,r=n-1,当l<=r(左边界<=右边界)时,计算中间结点m=(l+r)/2,然后进行比较,入到前一区间中检索,则修改右边界r=m-1,如果到后一区间检索,则修改左边界l=m+1。
若l>r,则说明左边界已大于右边界,查找失败。
voidcopy();文件备份函数
本函数将事先保存的记录文件record.txt按rb方式打开,输入目标文件名,然后利用文件格式读写函数将源文件信息写到目标文件中。
voidprint(ADDRESStemp);显示记录函数
定义了临时结构体变量,接受调用函数的信息后,利用printf()函数输出信息。
五、详细设计及运行结果
流程图:
运行结果截图:
1.密码保护运行截图:
错误验证
正确验证
登陆菜单选项
2..读入信息运行截图:
3.显示记录截图:
4.修改、添加记录截图:
A.插入信息
显示结果
B.修改信息
显示结果
5.查找记录截图:
A.按姓名查找
运行结果
B.按序号查找
运行结果
6.删除信息截图:
7.按姓名排序截图:
8.文件备份截图:
六、调试情况,设计技巧及体会(重点)
1、测试数据
见上页程序运行截图。
2、对调试中主要问题进行总结
a.调试过程中发现程序中有很多的语法错误,这原因其中一部分是自己平时练习不够多所造成的,当然也不排除自己不认真的坏毛病。
b.有死循环出现,纠其原因因是循环C结构还没彻底弄清楚还不能正确自如的运用导致给程序调试过程中增加了很多的麻烦,也浪费了很多的时间。
3、对自己设计进行评价,指出合理和不足之处,提出改进的方案
该程序基本上实现了设计时的全部要求。
总体来说,个程序模块还是比较简练,设计思路考虑的也比较全面。
尤其是在查找模块,我认为很有亮点。
该模块采用二分查找法,大大缩短了查找时间,减少了在查找过程中不必要的时间浪费。
但是同样还存在个别模块设计冗长、繁琐。
如在密码保护模块,我采用了三次if循环嵌套用以实现密码循环三次输入。
但用循环嵌套很容易出错,也不符合模块化程序设计思想,我想如果用一次for循环就能很好实现。
还有就是改密码保护的密码为程序定义,无密码修改操作选项,这无形中增加了风险;如果能添加密码修改模块,我想应该会更完美。
4、在设计过程中的感受
首先,它让我花费了近三天时间写程序,以后的大多数时间就在调程序,从构思到结构大体框架再到细节。
这让我明白“宏观主宰全局,细节决定成败”的道理,即使是小到一个分号也有可能使你的程序无法运行。
就像老师所说,写程序的时候必须很认真,欲速则不达。
程序的关键在于调试程序。
在实习中,我深刻体会到老师发挥的重要作用:
C语言程序对我们来说比较难,在匆忙的学习中更是难上加难,似乎觉得自己仅是个匆匆过客,但在老师的帮助下我学会了如何调试,如何查找系统没有提示的错误,最后终于排除万难把程序搞定,体会到原来编程也挺有意思的快感。
没有夏老师的帮助我很难在短期内把程序设计做的这样好,在此特别感谢夏老师对我的帮助。
七、源程序清单(略,详见实验报告电子版源代码)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 语言 课程设计 报告 格式 朱立刚