通讯录管理系统C语言课程设计大作业,c语言课程设计报告---通讯录管理系统.doc...

253b171540df25e1b84436cbe50dfc72.gifc语言课程设计报告---通讯录管理系统.doc

Yangtze University College of Arts and Science 学生实习手册 (课程设计报告) 学 部 理 工 学 部 专 业 电 子 信 息 工 程 班 级 5111班 姓 名 王嘉 学 号 201140020 课程名称 C 语言课程设计 指导教师 杜红 呙明辉 实习时间 2012 年 7 月 6 日至 2012 年 7 月 15 日 一 、 实习题目 通讯录管理系统 二、需求分析 问题描述 本程序属于非数值计算型算法设计,学生需要设计出 图书馆模拟 系统所需要的基本功能,并设计简单的界面(无需图形化) 。 实现功能 1、 通过 提示 菜单选择 可以进行的 操作 2、将图书的信息存入文件中,并命名为 BookInfo.txt 3、将图书借阅情况信息存入文件中,并命名为 SendInfo.txt 4、在本系统中可以进行管理系统包含的基本操作,其中包括 a 查看所有图书的信息; b 输入一本图书的图书编号,从当前图书中进行查找,如果找到则显示该图书的相关信息,如果没有找到则给出提示信息; c 添加一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则提示重新输入,否则将该图书按照顺序插入到相应位置; d 删除一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则将该图书删除,否则给出提示信息,提示该图书不存在; e 借阅一本图书,需要给出学号和 图书编号,如果图书编号不存在则重新输入,直到输入正确为止,并将学号和相应的图书编号存入 SendInfo.txt文件中。 5、图书基本信息包括图书编号、书名、作者、出版社和价钱这些简单信息。 6、图书信息文件中每一行存放一本图书的信息。 7、借阅信息文件中每一行存放一本书的借阅情况。 知识点 本程序主要考察对自定义函数的熟悉程度,本程序中主要使用到的是数组的相关操作,包括数组的输入、输出、查找、插入、删除等操作,需要对数组有比较深入的掌握。 说明 1当程序执行的时候所读取的图书信息文件必须存在,否则可 能会出现错误。 2图书信息文件中存放图书信息的时候是按照行来存放的,即一行一本书。 3借阅信息文件中存放学生借阅情况是按照行来存放的,即一行存放一个学号和一个图书编号。 4程序执行的基本过程为 a 在所有操作之前,也就是加载操作菜单之前,先从文件中读取所有图书的信息,并存入一个数组中,此时数组可以定义为包含 100个元素; b 然后根据菜单所进行的所有操作都是对当前数组进行操作,此时也就是对数组的查找、定位、添加、修改、删除操作; c 当退出系统的时候再将当前数组中的所有元素按照一本图书一行的方式写回图书信 息文件中,此时注意选择覆盖方式,这样就可以将原来的所有数据覆盖,只保留最新的数据; 当按行读取图书信息文件的时候,有可能最后一行只有一个回车,这时候实际上所读取的数据为空字符串,需要对此作判断,如果是空字符串,则说明已经没有人员,就必须将当前读入的空字符串写入数组中。 三、概要设计 系统功能模块图 主 菜 单添 加 显 示 删 除 查 询 修 改 保 存模 糊 查 询帮 助姓 名地 址电 话精 确 查 询排 序添加可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。 显示可以以表格形式输出所有通讯录里的记录。 删除输入欲删除的那个人的名字后,会选择删除他(她)的记录内容。 查询可以选择用姓名、电话、地址三种方式查询。 修改输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改。 保存输入文件名(带后缀名)后,即可将通讯录信息保存到文件。 帮助显示帮助信息。 四、详细设计 1.通讯录 程序主体 include include include typedef struct /*公共部分 */ int score; /*编号 */ char name10; /*姓名 */ char num15; /*号码 */ char email20; /*邮箱 */ char age8; /*年龄 */ char adds20; /*住址 */ Person; Person pe80,temp; int menu_select; /*界面函数 陆 */ int Person per,int n; /*添加记录 王 */ void DisplayPerson per,int n; /*显示函数 公共 */ int Delete_a_recordPerson per,int n; /*删除函数 赵应振 */ void Query_a_recordPerson per,int n; /*查询函数 王嘉 */ void ChangePerson per,int n; /*修改函数 赵 */ void WritetoTextPerson per,int n; /*打印保存 公共 */ void rankint n; /*排序函数 陆 */ void main /*主函数 陆 */ int n0,i0,k; FILE *fp1; /*运行之前从文件中读取之前输入的项目 */ iffp1“PersonInfo.dat“,“rb“NULL /*如果没有文件,自动创建一个 */ fp1“PersonInfo.dat“,“wb“; do kfread i; ni-1; whilek0; /*文件读取完毕或 错误时 fread 函数返回值为 0。资料来自 csdn论坛 */ fclosefp1; for switchmenu_select case 1 printf“nt 添加记录到通讯录 n“; /*添加记录 */ npe,n; break; case 2 printf“nttt 通讯录记录表 n“; /*显示记录 */ Displaype,n; break; case 3 printf“nt 从通讯录中删除记录 n“; nDelete_a_recordpe,n; /*删除记录 */ printf“t“; system“pause“; break; case 4 printf“nt 在通讯录中查找记录 n“; Query_a_recordpe,n; /*查找记录 */ printf“t“; system“pause“; break; case 5 printf“nt 修改通讯录中的记录 n“; Changepe,n; /*修改数据 */ printf“t“; system“pause“; break; case 6 printf“nt 保存通讯录中的记录 n“; WritetoTextpe,n; /*保存数据 */ printf“t“; system“pause“; break; case 7 /*帮助信息 */ printf“nt 使用帮助 n“; printf“nt1.添加记录,用于输入你想添加的条目的信息,注意格式。 n“; printf“nt2.显示记录,用于显示当前所有条目。 n“; printf“nt3.删除记录,用于删除当前所有条目中的某一条。 n“; printf“nt4.查找记录,用于查找当前所有条目中的某一条,可以姓名模糊查找。n“; printf“nt5.修改记录,用于修改当前所有条目中的某一条。 n“; printf“nt6.保存记录,用于保存当前所有条目和打印当前所有条目。 n“; system“pause“; break; case 0 printf“ntt 谢谢使用,再见 n“; /*结束程序 */ printf“ntt“; system“pause“; printf“ntt“; exit0; 主体部分主要做一些基本定义,如结构体定义,函数声明, 主函数 。 其中主函数中 有读取函数,即 开始 使用时 加载之前输入 存储文件 内容信息 ,另外的存储文件 内容信息 函数部分,我们放在了存储打印函数了。函数主体是一个死循环加通道函数,循环的终止时依靠 system()和 exit()函数控制。 二 工作流程图 添加函数 用于添加通讯录记录, 入口 参数 为结构体,总人数 n, 出口参数 ni,无其他函数调用 开 始I n t i 0 为 计 数 循 环 的 次 数终 止 条 件为 输 入 y / n依 次 输 入 要 录 入的 内 容并 循 环 i 返 回 值n i 结 束YN显示函数 用于显示通讯录记录, 入口 参数 为结构体,总人数 n,无 出口参数 ,调用排序函数函数对编号进行排序 开 始I n t i 0 控 制 循 环 并记 录 此 时 i 对 应 的 结 构 体 信 息判 断 条 件i 7,循环中有清屏 system“cls“;直到有 0到 7输入时循环结束。 测试 3 添加函数 和修改函数 中输入编号是一定为整型数字, Do while0scanf“td“, forj0;j对此有解释 A return value of 0 indicates that no fields were assigned。 这时字母 会遗留在 “输入缓冲区 “中。因为缓冲中有数据,所以 scanf 不会等待用户输入,就再次去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致死循环。可用 getchar 将输入缓冲区中的内容清掉,从而避免了 scanf 输入失败时的死循环 程序用了很多的循环,因此对于循环的控制要十分小心, 循环三个函数 for while 和do-while 的区别也是十分重要的, 有的循环是要先作某步,就用 do-while,有的循环不知道循环次数用 while 等等。 解决其中大部分问题,当然还存在一些问题没有解决 。我相信在以后的学习能够解决好它们。 但是,收获还是不小的, 我不仅对 C 的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。 还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的 C 程序。 总体来说,这次 C 语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。 希望以后的日子,能有更加努力。 八、附录 源程序清单 include include include typedef struct /*公共部分 */ int score; /*编号 */ char name10; /*姓名 */ char num15; /*号码 */ char email20; /*邮箱 */ char age8; /*年龄 */ char adds20; /*住址 */ Person; Person pe80,temp; int menu_select; /*界面函数 陆 */ int Person per,int n; /*添加记录 王 */ void DisplayPerson per,int n; /*显示函数 公共 */ int Delete_a_recordPerson per,int n; /*删除函数 赵应振 */ void Query_a_recordPerson per,int n; /*查询函数 王嘉 */ void ChangePerson per,int n; /*修改函数 赵 */ void WritetoTextPerson per,int n; /*打印保存 公共 */ void rankint n; /*排序函数 陆 */ void main /*主函数 陆 */ int n0,i0,k; FILE *fp1; /*运行之前从文件中读取之前输入的项目 */ iffp1“PersonInfo.dat“,“rb“NULL /*如果没有文件,自动创建一个 */ fp1“PersonInfo.dat“,“wb“; do kfread i; ni-1; whilek0; /*文件读取完毕或错误时 fread 函数返回值为 0。资料来自 csdn论坛 */ fclosefp1; for switchmenu_select case 1 printf“nt 添加记录到通讯录 n“; /*添加记录 */ npe,n; break; case 2 printf“nttt 通讯录记录表 n“; /*显示记录 */ Displaype,n; break; case 3 printf“nt 从通讯录中删除记录 n“; nDelete_a_recordpe,n; /*删除记录 */ printf“t“; system“pause“; break; case 4 printf“nt 在通讯录中查找记录 n“; Query_a_recordpe,n; /*查找记录 */ printf“t“; system“pause“; break; case 5 printf“nt 修改通讯录中的记录 n“; Changepe,n; /*修改数据 */ printf“t“; system“pause“; break; case 6 printf“nt 保存通讯录中的记录 n“; WritetoTextpe,n; /*保存数据 */ printf“t“; system“pause“; break; case 7 /*帮助信息 */ printf“nt 使用帮助 n“; printf“nt1.添加记录,用于输入你想添加的条目的信息,注意格式。 n“; printf“nt2.显示记录,用于显示当前所有条目。 n“; printf“nt3.删除记录,用于删除当前所有条目中的某一条。 n“; printf“nt4.查找记录,用于查找当前所有条目中的某一条,可以姓名模糊查找。n“; printf“nt5.修改记录,用于修改当前所有条目中的某一条。 n“; printf“nt6.保存记录,用于保存当前所有条目和打印当前所有条目。 n“; system“pause“; break; case 0 printf“ntt 谢谢使用,再见 n“; /*结束程序 */ printf“ntt“; system“pause“; printf“ntt“; exit0; int menu_select /*界面函数 陆 */ char c,null20; do system“cls“; printf“tt *通讯录 * n“; printf“tt n“; printf“tt 1. 添加记 录 n“; printf“tt 2. 显示记录 n“; printf“tt 3. 删除记录 n“; printf“tt 4. 查询记录 n“; printf“tt 5. 修改记录 n“; printf“tt 6. 保存记录 n“; printf“tt 7. 功能帮助 n“; printf“tt 0. 退出程序 n“; printf“tt n“; printf“t 提醒退出程序前,请保存记录。 n“; printf“tt 请您选择 0-7“; cgetchar; getsnull; whilec7; returnc-0; int Person per,int n /*添加记录 王 */ int temp,i0,j0,k10,k20; /*temp 为临时编号存 储变量 */ char sign,null20; /*k1 为编号检测阀开关, k2 为 符检测阀开关 */ whilesignn /*编号的唯一 by王嘉 */ do while0scanf“td“, forj0;j1 printf“t“; system“pause“; printf“t-n“; printf“n“; system“pause“; int Delete_a_recordPerson per,int n /*删除函数 赵应振 */ char ch,name20; int i0,j,tabi,deletescore,count10,count20; /*tabi 为标记的 i 值 ,deletescore 为选择删除的编号 */ printf“t 请输入想删除记录中的名字 “; scanf“s“,name; whilestrcmpperi.name,name0 count2; ifin printf“t 通讯录中没有此人 n“; returnn; fori0;in;i /*同名人员删除问题 */ /*统计并找出通讯录中存在相同姓名的条目 */ while strcmpperi.name,name0 printf“t 此人姓名 sn“,peri.name; printf“t 此人年龄 sn“,peri.age; printf“t 通讯地址 sn“,peri.adds; printf“t 电 子邮箱 sn“,peri.email; printf“t-n“; count1; i; ifcount11 /*当姓名唯一时 */ printf“t 是否删除 y/n“; fstdin; scanf“c“, ifchy chy-32 forjcount2;jn-1;j perjperj1; printf“tt 已经成功删除 n“; fstdin; return n-1; else printf“t 未删除 nt 谢谢使用 nt“; return n; else /*当姓名有两个或以上时,按编号删除。 */ printf“tt 请输入要删除人的编号 ntt“; scanf“d“, fori0;in;i if peri.scoredeletescore printf“t-n“; printf“t 此人编号 dn“,peri.score; printf“t 此人姓名 sn“,peri.name; printf“t 此人年龄 sn“,peri.age; printf“t 通讯地址 sn“,peri.adds; printf“t 电子邮箱 sn“,peri.email; printf“t-n“; tabii; printf“tt 是否删除 y/nntt“; fstdin; scanf“c“, ifchy chy-32 forjtabi;jn-1;j perjperj1; printf“ttt 已经成功删除 n“; fstdin; return n-1; else printf“tt 谢谢使用 “; return n; void Query_a_recordPerson per,int n /*查询函数 by王嘉 */ int m; printf“tn 请选择查询方式 n“; /*查找总菜单 */ printf“t n“; printf“t 1姓名 n“; printf“t 2电话 n“; printf“t 3地址 n“; printf“t 4返回 n“; printf“t n“; printf“请选择 “; scanf“d“, whilem1 getchar; scanf“d“, ifm1 int x; printf“tn 请选择查询方式 n“; /*查找二级菜单 */ printf“t n“; printf“t 1精确查找 n“; printf“t 2模糊查找 n“; printf“t n“; printf“请选择 “; scanf“d“, whilex1 getchar; scanf“d“, ifx1 /*精确查找单元 */ char s20; int i0; printf“t 请输入想查询的姓名 “; scanf“ts“,s; whilestrcmpperi.name,s0 ifin printf“t 通讯录中没有此人 n“; return; printf“t 此人编号 dn“,peri.score; printf“t 此人年龄 sn“,peri.age; printf“t 电话号码 sn“,peri.num; printf“t 通讯地址 sn“,peri.adds; printf“t 电子邮箱 sn“,peri.email; ; ifx2 /*模糊查找单元 */ char s20; int i0,j0; printf“t 请输入想查询的姓名 “; scanf“ts“,s; whilein ifstrstrperi.name,s /*使用 strstr函数指向第一次出现 */ printf“s“,peri.name; printf“t 此人编号 dn“,peri.score; printf“t 此人年龄 sn“,peri.age; printf“t 电话号码 sn“,peri.num; printf“t 通讯地址 sn“,peri.adds; printf“t 电子邮箱 sn“,peri.email; else j; i; ifjn printf“t 通讯录中没有此人 n“; /*如果找了 n 次没结果,则无此人 */ ifm2 char s20; int i0; printf“t 请输入想查询的电话 “; scanf“ts“,s; whilestrcmpperi.num,s0 ifin printf“t 通讯录中没有此人 n“; return; printf“t 此人编号 dn“,peri.score; printf“t 此人姓名 sn“,peri.name; printf“t 此人年龄 sn“,peri.age; printf“t 通讯地址 sn“,peri.adds; printf“t 电子邮箱 sn“,peri.email; ; ifm3 char s20; int i0; printf“t 请输入想查询的地址 “; scanf“ts“,s; whilestrcmpperi.adds,s0 ifin printf“t 通讯录中没有此人 n“; return; printf“t 此人编号 dn“,peri.score; printf“t 此人姓名 sn“,peri.name; printf“t 此人年龄 sn“,peri.age; printf“t 电话号码 sn“,peri.num; printf“t 电子邮箱 sn“,peri.email; void ChangePerson per,int n /*修改函数 赵 */ char s20; int i0,j0,temp,k10,k20; printf“t 请输入想修改的记录中的名字 “; scanf“s“,s; whilestrcmpperi.name,s0 ifin printf“t 通讯录中没有此人 n“; return; else printf“t 此人编号 dn“,peri.score; printf“t 此人姓名 sn“,peri.name; printf“t 此人年龄 sn“,peri.age; printf“t 电话号码 sn“,peri.num; printf“t 电子邮箱 sn“,peri.email; printf“nt 重新输入信息 n“; printf“t 编号 “; do /*修改函数同样重复输入函数时的问题 */ while0scanf“td“, forj0;jn;j /*此处循环为计数 k1, k1 初值为 0*/ iftempperj.score k1; /*k1 为两种情况 0 或 1*/ ifk11 /*k1 为 1 时,有重复并使 k1 归零进入循环 */ printf“t 编号重复,请重新输入 nt 编号 “; k10; else break; /*k1 为 0 时,无重复,结束循环 */ whilek10; /*循环的终止条件是没有找出相同, k10*/ peri.scoretemp; printf“t 姓名 “; scanf“ts“,peri.name; printf“t 年龄 “; scanf“ts“,peri.age; printf“t 电话号码 “; scanf“ts“,peri.num; printf“t 通讯住址 “; scanf“ts“,peri.adds; printf“t 电子邮箱 “; scanf“ts“,peri.email; do /*Email 的 符检测 */ /*By陆文虎 */ forj0;j20;j ifperi.emailj k2; ifk21 printf“tEmail 格式错误,未检测到合法 符,请重新输入 nt 电子邮箱 “; scanf“ts“,peri.email;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一:需求分析 二:总体设计 三:详细设计 四:调试与测试 五;测试结果 六:本次课程设计的心得体会 七:附录 本程序设计亮点介绍(及)改进方面 1.在修改函数中,可以实现单条记录修改(运用switch) 2.查询函数中,能返回该函数继续查询(运用了递归) 3.使用变量少,仅通过变量i的递加和表示成员数的变量n就实现了数据结构体之间的联 系 4.界面美观,使用方便 5.允许编号输入为字符 6.在显示函数上能够分屏显示(换页) 缺点 在输入数据时,未输完一个成员的所有信息不能退出输入 一:需求分析 A.需要实现的功能有:输入功能、输出功能、显示功能、查找功能、以及增加、删 除、修改功能。输入功能要求一次完成若干信息的输入;显示功能要能完成所有信息的 显示,并且自动分页;查找可以通过多种方式进行。 按需求的功能,应该设计出输入函数、输出函数、显示函数、查找函数、修改函数。另 需要一个标准界面。 B.数据存储问题 这个系统数据庞大复杂,需要需要适当应用数组,循环,结构体,文件操作等基本 语句及稍有难度的语句。因此要求我们熟练掌握结构化程序设计的基本思路和方法,在 所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定 程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,利用自己所学知识 解决实际问题的能力,为以后的程序开发打下基础。 二:总体设计 主要结构图示 本程序由主函数和多个子函数组成,可执行多种数据管理的功能。具体通过c语言中 结构体数组来实现。主函数主体为定义的结构体,和一个switch函数,以提供多种程序 操作功能。 主要需运用到结构体数组、文件、函数等内容知识。 子函数有六个,分别负责添加、显示、删除、查询、修改、保存的功能。通过变量i使结 构体数组之间达成数据链表的功能,利用该方法主要考虑到成员中对于结构体指针尚未 熟练掌握,而这种方法更加便捷易懂。 子函数功能介绍 1. 添加:输入成员信息,依次输入编号、姓名、QQ、电话号码、单位、电子邮箱、身 份。 2. 显示:以表格形式输出所有通讯记录 3. 删除:只需输入该成员姓名,便删除其所有记录 4. 查询:可选用姓名、电话、单位身份4种方式来查询 5. 修改:输入该成员姓名后,再依次输入更新信息完成修改 6. 保存:输入文件名(带后缀)后保存。C-free中会默认以txt文件保存至c- free standard/temp文件夹中 三:详细设计 1. 主函数 完成变量的初始化与函数的定义之后,运用for( ; ; )来开启一个无限循环。循环内有switch函数来实现函数的选择功能,case1、case2等分 别执行不同的函数操作,每个函数中调用了相应的函数,并采用函数system("pause") ;暂停等待按键。在case6中采用函数exit(0)跳出循环。 下面在讲一下主函数中定义的n的作用,n的初值是1,当执行完case1中的函数input ( )后返回值为n+i,i为输入的成员数,返回值重新赋给n,n变为成员数,从而确定了之后 display()等函数循环中的终止条件。 2. 分函数 【1】添加 【2】显示 【3】删除 【4】查询 【5】修改 保存函数:【1】定义一个文件指针fp 【2】输入想创建的文件名称,如filename 【3】开辟文件,用fopen以"写"的方式打开,并把fp指针指向该文件 【4】在文件中输入信息 【5】保存(即fclose(filename)) 查询函数:运用了if来实现选择,并通过递归返回继续查询。 注:身份以及单位的查询方式有所不同,单位只能查找一条符合的记录,而按身份查询 可显示所有符合的信息。若查找不到,则返回继续查询,选择5返回则退出查询。 四:调试与测试 我们编写的函数具有一定的容错能力。具体表现为 【1】如select函数中输入0-6以外的数,则循环继续进行,直到输入0-6为止 【2】sign!='n'&&sign!='N'语句保证了大小写不会影响结果 【3】while(m!='1'&&m!='2'&&m!='3'&&m!='4') { printf("输入错误,请重新选择:"); scanf("%c",&m); }保证了输入正确 【4】当输入的成员信息错误时,可通过修改函数进行改动 五:测试结果 1.主函数运行正常。通过for语句是界面循环,并有switch及system函数进行配合调节 达到目的。(界面显示如下) 2.测试结果:运行正常,达到了预订的目标。 此处为通过保存函数保存后的txt文本中的学生信息 六:心得 课程设计是一个不断学习、思考、编写、修改的过程。它对我们的能力提出了挑战。 我不仅意识到c语言基础的重要性,更意识到了自学能力的重要性,同学学习书本,查找 资料等多种途径来构建思

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值