c语言通讯录二分查找,C语言程序设计 通讯录程序.doc

《C语言程序设计 通讯录程序.doc》由会员分享,可在线阅读,更多相关《C语言程序设计 通讯录程序.doc(28页珍藏版)》请在人人文库网上搜索。

1、目录:课 程 设 计 任 务 书2目录:3一、目的4二、基本情况5三、时间安排5四、设计和调试过程规范化要求5五、设计内容和设计要求6六、考核方式7一 通讯录的主要功能:8一、问题描述:8二、功能要求:8三、算法提示:8四、测试数据:9二、课题的主要功能模块划分:9三、主要功能的实现10一、按名字查找显示函数 void search( )17二、快速查找函数:void qseek( )17四、程序调试:18五、总结20六、源程序21机械工程学院课程设计评分表30前 言C语言程序设计课程设计是对学生的一种全面综合训练,它包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,多人合作,。

2、以至一整套软件工作规范的训练和科学作风的培养。是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,课程设计的课题比平时的习题复杂得多,也更接近实际。课程设计着眼于理论与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养程序设计工作所需要的知识综合能力和动手能力;另一方面,能使书上的知识变“活”,使学生更好地深化理解和灵活掌握教学内容。为了达到上述目的,本课程设计安排了15个设计课题,训练重点在于基本的程序设计方法和分析问题的能力,而不强调面面俱到。学生选其中一题进行设计,设计完毕写出课程设计报告,用A4纸打印成册;并将课程设计报告与源程序存盘。学习委员将课程设计报告。

3、与磁盘(缺一不可)收齐后交指导老师。一、目的全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。二、基本情况课程类别:必修课课程学分:1学分课程学时:1周课程对象:汽服0901三、时间安排第一周 周日 上午 8:00。

4、12:00 (查阅相关资料并 开始编写源程序)第二周 周一 下午 14:0018:00 (完成源程序编写调试运行 课程设计报告)周三 上午8:0012:00 (完成课程设计报告以及答辩)四、设计和调试过程规范化要求1) 需求分析分析系统功能需求以及用户操作流程。2) 概要设计在需求分析的基础上,确定系统总体框架(系统功能结构图)。3) 详细设计定义数据存储结构,并设计实现系统功能的具体算法,画出各算法的工作流程图。4) 代码设计根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后还。

5、可以返回到主菜单,继续选择其他功能执行。源程序要求书写规范,结构清晰。重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。5) 程序调试程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和改正。如果程序能够基本正确地运行,可考虑增加若干基本的容错功能(如避免用户操作错误时程序出现死循环等);另外尽量对现有算法给出改进方案,并比较不同算法之间的优缺点。五、设计内容和设计要求1设计内容:设计与开发一个通讯录管理系统,对通讯。

6、录中的姓名、单位、电话、QQ 、mail等基本信息进行管理、主要功能如下:1)输入记录;2)显示记录;3)按姓名查找显示记录;4)删除记录;5)插入记录;6)记录保存为文件;7)从文件中读记录;8)按姓名排序;9)显示单条记录;2设计要求:1)设计正确,方案合理。2)界面友好,使用方便。3)程序精炼,结构清晰。4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。5)实际操作过程中遇到的问题及解决方法:设计总结及心得体会.6)上机演示。附:课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标。

7、题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序原代码)。六、考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:1) 平时出勤 (占10%)2) 系统需求分析、功能设计、数据结构设计及程序总体。

8、结构合理与否(占10%)3) 程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)4) 设计报告(占30%) 5) 独立完成情况(占10%)。一 通讯录的主要功能:一 . 问题描述: 一 有个通讯录,要求该系统对通讯录的姓名,单位,电话,进行输入,显示 ,查找,删除,插入,保存等操作的管理。二 . 功能要求:1,本系统采用一个结构体数组,每个数据的结构应包括;姓名,单位,电话名称。2, 本系统显示这样的菜单 请选择系统功能项 a 输入记录;b 显示全部纪录;c 查找记录;d 删除记录;e 插入记录;f 保存文件 ;g 读文件:(1)按序号显示记录;(2)按姓名排序;(3)快速查找。

9、记录;(4)复制文件。 三 算法提示:1 数据结构;结构体类型数组。2 数据库结构;下表构成该系统的基本数据库。姓 名电 话单 位四 测试数据: 姓名电话单位Zhang152二、课题的主要功能模块划分:同 学 录输 入查 找 显 示删 除快 速 查 找记 录.保 存按姓名查找显示记录按序号查找显示记录按姓名查找三、主要功能的实现程序设计一般由两部分组成算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性,在通讯录管理程序中由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大除了能够增加、删除、保存等外更多的情况是查询,且能够实现快速查询。所以选用静态数组保存数。

10、据实现多种查询方式。1数据结构由于使用静态数组需要预先估计记录数,所以先预定义一个常数 M 表示记录,也就是数组的大小,记录联系人的信息至少应有姓名、单位、电话。所以定义每个数组元素的类型为结构体。由于数组存储是采用顺序存放在内存空间中占用连续空间,所以若干条记录通讯录的管理实质就是对顺序存储的线性表的管理结点结构如下:#define M 50 /*估计的记录数*/typedef structchar name20; /*姓名*/char units30; /*单位*/char tele10; /*电话*/ADDRESS; /*结构体类型名*/2main()主函数程序采用模块化设计,主函数是程。

11、序的入口各模块独立。可分块调试均由主函数控制调用控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值调用相应的各功能函数。同时设置一个断点。即当返回值为一定条件时运行 exit()函数结束程序,以免造成死循环。10-1图输出界面 3 menu_select()主菜单直接利用输出函数 printf 输出字符串在屏幕上显示一个菜单并显示一个提示输入 选项输入 011 之间的数字,将此数字作为菜单函数的返回值返回主函数,主函数根据 这个数字调用相应的功能函数, 制作简便, 操作简单界面如图 10-2 所示:图 10-2 主菜单界面由于程序中很多地方用到了字。

12、符串输入语句会造成下一个字符不能正确读入为了 在程序调用执行了各个函数后能够清晰地看到菜单并输入新的选项。首先写了一条输出 信息printf(press any key enter menu.n)表示按任意键继续一条读字符语句 getch() 等待输入字符,按任意键即可进入主菜单,读者可以将这两条语句加上注释不执行来体会它的功能。按照所见即所得的方式直接设计输出函数输出字符串达到菜单效果将精力主要放在程序功能的实现上利用 do循环语句一直执行 scanf(%s ,s)语句。让用户输入 011 之间的数按照字符串形式输入。然后执行 c=atoi(s) 将字符串转化为数字,返回主函数 。如果输入范。

13、围不是 011,则循环等待重新输入。既然是数字选项为什么不用整数格式输入而要按字符串输入。再将其转换呢,如果按照整数格式输入,当用户输入了非数字字 符。例如 a 和 b 等由于类型不同将导致程序出错。所以对于不参与运算的数据表面上看是数字也应将其设为字符处理。例如电话号码,千万不要设为整数类型,程序设计技巧很多。所以读者在编程调试中应注意并仔细体会。4enter()输入记录输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰且能直接反映数据之间的关系,但由于 scanf 函数的特性,在输入时数据用回车分隔也是可以的,但与界面设计不吻合界面.由于记录并不是一次性全部输入而是随时填加。

14、和删除的,而预先开辟的空间数往往大于实际的记录数。所以程序设计为首先输入准备输入的记录数 n, 然后用 for 循环语句循 环 n 次输入记录,通讯录的每一条记录有三个字段都是字符串类用格式输入 scanf(%s%s%s,ti.name,ti.units,ti.tele)完成输入三个字段用空格分隔输入完一条按 回车键继续输入下一条达到规定的记录数输入停止,返回记录数到主函数。5list()显示所有记录通讯录建立好后更频繁的操作是显示和查找记录本函数实现显示所有记录功能输出界面如图 10-3所示图 10-3 输出界面将主函数传递过来的数组输出用 for 循环,循环次数由参数长度决定,输出时,为 。

15、了格式美观清晰设计一定的样式输出,注意利用格式输出函数根据字段的长度设定输出的长度,每输出 10 个记录暂停一下,按任意键继续。6search()和 find()查找记录查找指定姓名的记录采用顺序查找法,首先输入要查找记录的姓名;然后顺序查找结点,如果没找到,则输出没找到信息。否则,显示找到的记录信息因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个 find()函数专门进行查找,从第一条记录开始将记录中的姓名字段和待比较的姓名字符串 s 进行比较一旦相等程序结束,返回该记录的下标号 i也就是记录所在的序号记录别人的信息就免不了要记录其姓名,地址,电话为了方便以后及时输入信息需要。

16、设立一个输入记录栏,为了显示所存内容 设立一个显示记录栏,有时 插入一些新的信息就在设立一个插入记录栏,同时为去掉过 时的信息,这是删除栏就必不可少,有时记录的信息比较多时,如果一个一个地用人力来找不仅难找,还要发费很多时间,显然不符合人们的要求,就必须要有一个查找方式,对 设计了两中普通方式和一种快速的查找方式, 两种普通方式其一是按姓名查找记录,其二是按姓名查找显示纪录,快速查找顾名思义其速度要比普通查找快,但是其要求比普通查找要克扣既在查找前必须按姓名排好序,最后是文件的复制,如果不相等则继续下一条比较 所有记录比较完毕循环结束返回,此时的下标变量 i 值,search()函数通过调用 。

17、find()得 到了整数 i,判断 i 的值如果大于 n-1已超过实际记录数说明所有记录都进行过比较 没有找到查找不成功,否则 说明找调用输出函数 print()显示该第 i 条记录。7delete()删除记录输入要删除记录的姓名,调用 find 函数如果没有该记录,显示没找到信息,否则,调用 print 函数显示记录信息,接着显示是否确实要删除,请输入确认信息整数 0 或 11 表示是0 表示否如果输入了 1 ,则系统删除信,要删除数组中的某一条元素 实际 所做的操作是将其后继记录依次前移一条,所以删除第 i 条记录用 for 语句从 i+1 开始依次将每个字段拷贝到前一条记录的相应字段,即。

18、覆盖了前一条记录达到前移的目的,直到最后一条记录。注意前移记录的时候是逐个字段赋值,不能一个记录整体赋值。由于删除了一条记录,记录数减 1,返回记录数程序结束,假如删除前则删 除第 i 条记录。8 add()插入记输入要插入记录的信息保存到临时变量 temp 然后再输入一个姓名,用字符串 s 表示确定新记录插入在该记录之前调用 find()函数查找姓名为 s 的记录得到该记录所 在的序号, 从最后一条记录开始向后移动,即第 n-1 条移动到第 n 条第 n-2 条移动到 第 n-1 条直到第 i 条移动到第 i+1 条将新信息存入到第 i 条记录位置注意移动必须从后倒,否则从第 i 条开将会覆。

19、盖后面的信息数据而出错,如果 没有指定的记录则 find 函数返回的 i 值为 n,实际上一条记录也不会移动新信息将插 入到最后一个位置录插入在 i 位置。、9 save()保存记录到文件然后确定文件的打开方式如果文件不能正常打开则退出程序否则先写入记录数 n然后用循环语句文件格式输出语句 fprintf(fp,%-20s%-30s%-10s,ti.name,ti.units, ti.tele)逐条写入记录每输出一条写入一个换行符号写入后 record.txt 文件可以用 Windows 下的记事本打开。10load()从文件中读取记录数据一旦输入保存到磁盘文件中后 更多的操作是将数据从文件读。

20、入内存 进行显示 查找等各项操作先定义一个指向文件的指针按照 rb 的方式打开已经保存好的文件 record.txt ,用语句 fp=fopen(record.txt,rb) 。同时判断是否正常打开,则退出程序。否则,利用格式输入函数先读出记录数。然后利用循环语句用格式输入函数fscanf(fp,%20s%30s%10s,ti.name,ti.units,ti.tele)将记录逐条读入读出的记录保存在结构体数组中。由于结构体数组是用数组名作为参数而数组名是数组存放的单元首地址,所以它是一种地址传递方式数据的变动直接反映在参数所指的数组而记录数是按值传递其值的改变不会影响到主函数为了保证数据的正。

21、确性所以将记录数 、返回主函数。11display()按序号查找记录由于数组是按照顺序存储且对数组元素的访问可以直接按照其下标号实现随机访问。所以设计了按照记录位置也就是记录的序号访问记录本函数实现的是从文件中查找。所以先用 rb 方式打开记录文件 record.txt ,输入序号 id ,从文件读入记录数判断序号位置在记录数范围之内。由于记录是顺序存放所以指定序号 id 的存储位置首地址应为 (id-1)*sizeof(ADDRESS) 利用函数 fseek 将记录指针移动到该位置读出记录,调用 print() 函数显示它。12sort()排序冒泡排序是一种比较简单且常用的排序方法具体的做法。

22、是假设待排序记录的排序码 为 k1k2kn, 先比较 k1 和 k2如果 k1k2, 则交换 k1 和 k2 所代表的记录,然后 对 k2可能是刚交换来的和 k3 进行同样的处理,重复此过程直到处理完 kn-1 和 kn 这样从 k1、 k2 到 kn-1、kn 的 n-1 次比较和交换的过程称为一次冒泡这一步将最大的 k 值记录传到了最后也是最终排序的位置重复这样的步骤不过第二次只需从 k1、k2 到 kn-2、kn-1作 n-2 次比较这样最多作 n-1 次冒泡,为了减少不必要的循环,设置一 个 flag表示本次冒泡是否出现过交换,如果没有交换则说明本次比较已经达到排序要 求可以结束程序了。

23、。本函数采用了冒泡排序方法按照姓名排序,所以排序码为记录的姓名对 语言来说数组的下标是从 0 开始的。所以 n 条记录的比较是从 t0.namet1.name 开 始到 tn-2.nametn-1.name 的因为姓名是字符串比较用字符串比较函数 strcmp 实 现移动记录借助于第三者临时结构体变量 temp移动要保持整条记录的移动所以三 个字段都要移动。对于字符串赋值便捷的方式是用 strcpy 复制函数,否则就要用循环语 句逐字符移动冒泡排序的缺点是移动记录次数多。所以对于记录字段数较多记录长度较长的不宜 选择冒泡排序。13qseek()快速查找排序是一种较为费时的运算,所以经过了排序而。

24、不加以利用未免可惜为此设计了 一种在排序基础上实现的快速查找算二分查找法二分查找法是一种效率较高的检索方法检索时要求记录按检索码值的大小排序并且要求顺序存储对于我们这个线性存储的通讯录经过排序后,就可以实施二分查找法 、按姓名查找将姓名字段作为检索码。二分查找法 首先用检索的姓名值与中间位置的结点的姓名相比较这个中间结点。 将所有记录分成了前后两个区间比较结果。如果相等,则检索完成调用 print 函数显示 结点信息若不相等再根据姓名比较该中间结点的姓名字段的大小确定下一步检索 的范围。若大在后一个区间中检索若小在前一个区间中检索, 重复这样的步骤 直到或者找到满足条件的记录 或者确定没有这样。

25、的结点。范围的具体划分设置变量 l 和 r 分别代表左边界和右边界,初值 l=0,r=n-1当 lr,则说明左边界已大于右边界这样 的区间不可能存在,查找失败。14copy()复制文件为了保存数据防止意外发生为数据做备份是很有必要的本函数是将文件读写功能结合到一起的应用,将事先保存的记录文件 record.txt 按 rb方式打开输入目标文件名然后利用文件格式读写函数将源文件中的信息写到目标文件中。一 . 按名字查找显示函数 void search( )算法:通过调用名字查找函数,输入要查找的姓名.再调用find函数通过这一函数的循环找到与之姓名相应的的字符窜返回其所在序行数,然后调用输出函数。

26、显示指定的一条记录.读入s in-1 ? 假printf(“not found”) printf(ADDRESS temp)二 . 快速查找函数:void qseek( )通过调用快速查找函数,确认再查找之前,记录以排好序,然后输入待查找姓名,利用折半查找,m=(I+r)/2如果中间接点姓名与待找姓名相等,则调用printf函数显示记录,并返回,if(strcmp(tm.name.s)r,现是没找到。读入sI=0, r=n-1Ir ?假四、程序调试:一、先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的。

27、多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。为了更有效地进行人工检查,所编的程序应力求做到以下几点:应当采用结构化程序方法编程,以增加可读性;尽可能多加注释,以帮助理解每段程序的作用;在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。二、在人工检查无误后,再上机调试。通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息。

28、具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后。

29、,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。四、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法:1.将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘。

30、记写花括弧,只要一对照流程图就能很快发现。2.如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率。4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题。如有则改正之,接着修改程序。5.有的系统还提。

31、供debug(调试)工具,跟踪程序并给出相应信息,使用更为方便,请查阅有关手册。总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确”,而是“掌握调试的方法和技术”,要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序。五、总结课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大。

32、学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免。

33、会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。我做的是通讯录系统,虽然是很简单的一个小的程序,但对我一个初学者来说却是一个很大的困难。更加是第一次做课程设计,所以第一天下午在机房做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努。

34、力,大体上把课本上的知识点看了一遍,知识点也都基本是撑握了,所以下一步就是开始正式的编程序了。不过毕竟是个新手,还是不知如何下手,于是就在网上下了一篇类似的程序,经过仔细的研究,终于读懂了C语言编程的基本过程和方法。 经过一波三折,终于开始正式编程。编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强迫自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。所以认真仔细就是非常重要的了。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦。

35、是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C。

36、语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。六、源程序/*头文件(.h)*/#include stdio.h /*I/O函数*/#include stdlib.h /*标准库函数*/#include string.h/*字符串函数*/#include ctype.。

37、h /*字符操作函数*/#define M 50 /*定义常数表示记录数*/typedef struct /*定义数据结构*/char name20; /*姓名*/char units30; /*单位*/char tele10; /*电话*/ADDRESS;/*以下是函数原型*/int enter(ADDRESS t); /*输入记录*/void list(ADDRESS t,int n); /*显示记录*/void search(ADDRESS t,int n); /*按姓名查找显示记录*/int delete(ADDRESS t,int n); /*删除记录*/int add(ADDRES。

38、S t,int n); /*插入记录*/void save(ADDRESS t,int n); /*记录保存为文件*/int load(ADDRESS t); /*从文件中读记录*/void display(ADDRESS t); /*按序号查找显示记录*/void sort(ADDRESS t,int n); /*按姓名排序*/void qseek(ADDRESS t,int n); /*快速查找记录*/void copy(); /*文件复制*/void print(ADDRESS temp); /*显示单条记录*/int find(ADDRESS t,int n,char *s) ; /*。

39、查找函数*/int menu_select(); /*主菜单函数*/*主函数开始*/main()int i;ADDRESS adrM; /*定义结构体数组*/int length; /*保存记录长度*/clrscr(); /*清屏*/for(;)/*无限循环*/switch(menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/case 0:length=enter(adr);break;/*输入记录*/case 1:list(adr,length);break; /*显示全部记录*/case 2:search(adr,length);break; /*查找记录*/ca。

40、se 3:length=delete(adr,length);break; /*删除记录*/case 4:length=add(adr,length); break; /*插入记录*/case 5:save(adr,length);break; /*保存文件*/case 6:length=load(adr); break; /*读文件*/case 7:display(adr);break; /*按序号显示记录*/case 8:sort(adr,length);break; /*按姓名排序*/case 9:qseek(adr,length);break; /*快速查找记录*/case 10:co。

41、py();break; /*复制文件*/case 11:exit(0); /*如返回值为11则程序结束*/*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select()char s80;int c;gotoxy(1,25);/*将光标定为在第25行,第1列*/printf(press any key enter menu.n);/*提示压任意键继续*/getch(); /*读入任意字符*/clrscr(); /*清屏*/gotoxy(1,1);printf(*MENU*nn);printf(0. Enter recordn);printf(1. List the filen);p。

42、rintf(2. Search record on namen);printf(3. Delete a recordn);printf(4. add record n);printf(5. Save the filen);printf(6. Load the filen);printf(7. display record on ordern);printf( 8. sort to make new filen);printf( 9. Quick seek recordn);printf(10. copy the file to new filen);printf( 11. Quitn);pri。

43、ntf(*n);doprintf(n Enter you choice(011):); /*提示输入选项*/scanf(%s,s); /*输入选择项*/c=atoi(s); /*将输入的字符串转化为整型数*/while(c11); /*选择项不在011之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数*/*输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/int enter(ADDRESS t)int i,n;char *s;clrscr(); /*清屏*/printf(nplease input num n); /*提示信息*/scanf(%d,&n)。

44、; /*输入记录数*/printf(please input record n); /*提示输入记录*/printf(name unit telephonen);printf(-n);for(i=0;in-1) /*如果整数i值大于n-1,说明没找到*/printf(not foundn);elseprint(ti); /*找到,调用显示函数显示记录*/*显示指定的一条记录*/void print(ADDRESS temp)clrscr();printf(nn*n);printf(name unit telephonen);printf(-n);printf(%-20s%-30s%-10sn,。

45、temp.name,temp.units,temp.tele);printf(*end*n);/*查找函数,参数为记录数组和记录条数以及姓名s */int find(ADDRESS t,int n,char *s)int i;for(i=0;in-1) /*如果in-1超过了数组的长度*/printf(no found not deletedn); /*显示没找到要删除的记录*/elseprint(ti); /*调用输出函数显示该条记录信息*/printf(Are you sure delete it(1/0)n); /*确认是否要删除*/scanf(%d,&ch); /*输入一个整数0或1*/if(ch=1) /*如果确认删除整数为1*/for(j=i+1;jn;j+) /*删除该记录,实际后续记录前移*/strcpy(tj-1.name,tj.name); /*将后一条记录的姓名拷贝到前一条*/strcpy(tj-1.units,tj.units); /*将后一条记录的单位拷贝到前一条*/strcpy(tj-1.tele,tj.tele);。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值