课程名称: C语言程序设计能力教程 实验名称: 通讯录管理系统 姓 名: 陶 星 学 号: 1140810621 指导老师: 杨 剑 实践时间: 2012年12月26日 1 设计题目的内容、任务及具体要求
本程序是非数值计算型算法设计,主要使用的是数组的相关操作,包括结构体数组的输入、输出、查询、删除等。我们设计的这个通讯录系统也初步实现了人员信息的显示、删除、查询、修改等必要的功能。
(1) 录入联系人信息:以链表形式存放联系人信息并以文件形式存放通讯录信息。 (2) 浏览:按录入先后为序进行通讯录信息浏览。
(3) 查询:能实现指定联系人姓名查询或指定电话号码查询功能。 (4) 修改:能修改定联系人信息。 (5) 删除:能将指定联系人信息删除。
(6) 系统以菜单方式工作,界面友好,易于操作,容错性好。
2 总体设计思路
我们首先设计出了主函数,然后根据去要实现的功能分别设计录入联系人信息、浏览、查询、修改、删除功能的子函数。删除函数的设计是首先从文件内找到要删除的人,然后通过写一个实现删除目的的FOR循环实现删除。修改也大体和删除相同,添加函数在设计时通过申请一片空间,然后通过指针将需要添加的信息添加进去,从而实现添加功能。
3 系统功能设计
本系统除主函数外,一共采用8个函数来完成系统功能。函数名及功能说明如下: (1) 系统主菜单:menu_select() (2) 初始时加载数据:LoadData() (3) 录入联系人信息:Input() (4) 浏览所有联系人信息:Display() (5) 查找联系人:Search( ) (6) 修改联系人:Modify( ) (7) 删除联系人:Delete( ) (8) 保存联系人Save();
(9) 显示某一个联系人的所有信息:DisplayDetails() 函数间的调用关系如下图所示:
开始LoadDatamenu_select=1InputSave=2Display=3SearchDisplayDetails=4ModifyDisplayDetails=5DeleteDisplayDetails=0退出SaveSave4程序功
能结构图及功能描述
本程序主要分为六个模块。它们分别为:录入联系人信息、浏览所有联系人、查找联系人、修改联系人、删除联系人和退出系统。程序功能结构图如下图所示:
通讯录管理系统录入联系人信息浏览所有联系人查找联系人修改联系人删除联系人退出系统 (1) 在程序的主界面,显示系统的所有功能,包括:录入联系人信息、浏览所有联系人、查找联系人、修改联系人、删除联系人和退出系统。系统应提示用户如何选择相应功能。
(2) 当用户选择录入联系人信息后,系统进入录入联系人信息界面,在该界面应提示用户输入相应信息,当用户正确录入联系人信息后,自动生成一个不重复的联系人ID号,并将该联系人的信息以链表形式存放并以文件形式存放在通讯录文件的最后,并给出录入成功的提示并提示用户是否需要继续录入,根据用户的选择做出相应的处理。
(3) 当用户选择浏览所有联系人后,系统进入浏览所有联系人界面,在该界面中显示所有联系人的主要信息(所显示信息由用户确定)。
(4) 当用户选择查找联系人后,系统提示用户选择查询的关键字(基本要求是:可按联系人姓名、电话号码进行查询,该项用户可以扩展,可适当增加其他关键字)。当用户选择查询关键字,并按提示输入其值后,系统显示查询后的结果(如有该联系人,则显示该联系人的详细信息,否则给出适当提示)。
(5) 当用户选择修改联系人后,提示用户输入需修改的联系人ID,根据该ID查询到相应的联
系人信息,并显示,用户按提示输入更改后的联系人信息,系统更新相应的联系人信息并提示用户。
(6) 当用户选择删除联系人后,需提示用户输入需删除的联系人ID,根据该ID查询到相应的联系人信息,并显示,用户确认后,系统删除相应的联系人信息并提示用户。。
(7) 当用户选择退出系后,退出程序。
5 功能模块的具体设计
(1) 开始界面
(2) 查找菜单界面 (3) 修改菜单界面
6 程序部分
#include char name[20]; char post[20]; char tel[20]; char email[20]; } TelInfo[500]; int NO; FILE *fp; void mainmenu(); /*主菜单*/ void newrecord(); /*新建联系人*/ void browsemenu(); /*浏览所有信息*/ void searchmenu(); /*查找菜单*/ void searchname(); /*按姓名查找*/ void searchtel(); /*按电话查找*/ void modifymenu(); /*修改菜单*/ void deletemenu(); /*删除菜单*/ void deleteall(); /*删除所有*/ void deletesingle(); /*删除单个*/ void deletename(); /*按姓名删除*/ void deletetel(); /*按电话删除*/ int loadfile(); /*导入或建立文件*/ void savefile(); /*保存文件*/ void main() { printf(\"\\n\\ :)欢迎使用乐乐通讯录管理系统 beta\"); printf(\"\\n\\\\ 文件导入中……请稍后……\\n\\n\\n\\n\\n\"); system(\"cls\"); /*清屏*/ loadfile(); while (1) mainmenu(); } void mainmenu() { char choice; system(\"cls\"); printf(\"\\n\\n\"); printf(\"\\n\\┏━━━━━━━━━ 主菜单 ━━━━━━━━━━┓\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ 欢迎你使用“通讯录查询系统” ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ 预祝您使用愉快! ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 1-新建菜单 *****************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 2-浏览菜单 *****************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 3-查找菜单 *****************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 4-修改菜单 *****************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 5-删除菜单 *****************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃***************** 6-退 出 ********************┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┗━━━━━━━━━━━━━━━━━━━━━━━┛\"); printf(\"\\n\\ 请选择:\"); choice=getch(); switch (choice) { case '1': newrecord(); break; case '2': browsemenu(); break; case '3': searchmenu(); break; case '4': modifymenu(); break; case '5': deletemenu(); break; case '6': printf(\"\\n\\\谢谢您对通讯录管理系统的使用!!! \\n\"); exit(0); default: mainmenu(); } } void newrecord() { system(\"cls\"); printf(\"\\n\\**************** 请输入联系人信息 ****************\\n\"); printf(\"\\n\\ 输入姓名:\"); scanf(\"%s\ printf(\"\\n\\ 输入工作单位:\"); scanf(\"%s\ printf(\"\\n\\ 输入联系电话:\"); scanf(\"%s\ printf(\"\\n\\ 输入Email地址:\"); scanf(\"%s\ NO++; savefile(); printf(\"\\n\\ 是否继续添加(y/n):\"); if (getch()=='y') newrecord(); return; } void browsemenu() { int i; system(\"cls\"); if(NO!=0) { printf(\"\\n\\*************** 以下为通讯录所有信息************\"); for (i=0;i printf(\"\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ if(i<(NO-1)&&(i+1)%3==0) { printf(\"\\n\\n\\ 按任意键继续下一页:\"); getch(); system(\"cls\"); printf(\"\\n\\*************** 以下为通讯录所有信息************\"); } } printf(\"\\n\\************************************************\"); } else printf(\"\\n\\\+_+通讯录中无任何纪录\"); printf(\"\\n\\n\\ 按任意键返回主菜单进行添加:\"); getch(); return; } void searchmenu() { char choice; system(\"cls\"); printf(\"\\n\\n\\******************* 查找菜单 *******************\"); printf(\"\\n\\n\\***************** 1-按姓名查找 *****************\"); printf(\"\\n\\n\\***************** 2-按电话查找 *****************\"); printf(\"\\n\\n\\***************** 3-返回主菜单 *****************\"); printf(\"\\n\\n\\************************************************\"); printf(\"\\n\\n\\ 请选择:\"); choice=getch(); switch (choice) { case '1': searchname(); break; case '2': searchtel(); break; case '3': mainmenu(); break; } } void searchname() { int mark=0; int i; int a=0; char name[20]; system(\"cls\"); printf(\"\\n\\***************** 按姓名查找 *******************\"); printf(\"\\n\\ 请输入姓名:\"); scanf(\"%s\ for(i=a;i system(\"cls\"); printf(\"\\n\\************ 以下是您查找的联系人信息 **********\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ printf(\"\\n\\************************************************\"); printf(\"\\n\\n\\ 按任意键返回主菜单:\"); mark++; getch(); return; } } if(mark==0) { printf(\"\\n\\ 没有该姓名的联系人纪录\"); printf(\"\\n\\n\\ 按任意键返回主菜单\"); getch(); return; } } void searchtel() { int mark=0; int i; int a=0; char tel[20]; system(\"cls\"); printf(\"\\n\\****************** 按电话查找 ******************\"); printf(\"\\n\\ 请输入电话:\"); scanf(\"%s\ for(i=0;i system(\"cls\"); printf(\"\\n\\************* 以下是您查找的联系人信息 *********\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址:%s\ printf(\"\\n\\************************************************\"); printf(\"\\n\\n\\ 按任意键返回主菜单:\"); mark++; getch(); return; } } if (mark==0) { printf(\"\\n\\ 没有该联系人信息\"); printf(\"\\n\\n\\ 按任意键返回主菜单\"); getch(); return; } } void modifymenu() { int mark=0; int i,k; int a=0; int t=0; char choice; char name[20]; struct record modify; system(\"cls\"); printf(\"\\n\\ 请输入您要修改的姓名:\"); scanf(\"%s\ for(i=a;i k=i; mark=1; modify=TelInfo[i]; system(\"cls\"); printf(\"\\n\\********** 以下是您将修改的联系人信息 **********\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ printf(\"\\n\\n\\ 是否继续?y/n\"); if(getch()=='n') modifymenu(); else { printf(\"\\n\\ 选择您要修改的选项:\"); printf(\"\\n\\n\\\(1).姓 名\"); printf(\"\\n\\\(2).工作单位\"); printf(\"\\n\\\(3).联系电话\"); printf(\"\\n\\\(4). Email地址\"); printf(\"\\n\\\(5).返 回\"); printf(\"\\n\\n\\ 请选择: \"); choice=getch(); switch(choice) { case '1': printf(\"姓 名:\"); scanf(\"%s\ break; case '2': printf(\"工作单位:\"); scanf(\"%s\ break; case '3': printf(\"联系电话:\"); scanf(\"%s\ break; case '4': printf(\" Email地址:\"); scanf(\"%s\ break; case '5': mainmenu(); break; default: modifymenu(); } system(\"cls\"); printf(\"\\n\\ 您的修改结果为:\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ printf(\"\\n\\n\\ 确认修改?y/n\"); if(getch()=='n') { TelInfo[i]=modify; printf(\"\\n\\ 修改未保存!\"); } else { printf(\"\\n\\+_+修改成功!\"); savefile(); } mark++; printf(\"\\n\\ 是否继续修改(y/n)\"); if (getch()=='y') modifymenu(); } } } if (mark==0) { printf(\"\\n\\+_+没有该联系人的纪录\"); printf(\"\\n\\n\\ 是否继续修改(y/n)\"); if (getch()=='y') modifymenu(); return; } } void deletemenu() { char choice; system(\"cls\"); if(NO==0) { printf(\"\\n\\\ 对不起,通讯录中无任何纪录\"); printf(\"\\n\\n\\\ 按任意键返回主菜单\"); getch(); return; } system(\"cls\"); printf(\"\\n\\n\\******************* 删除菜单 *******************\"); printf(\"\\n\\n\\***************** 1---删除所有 ******************\"); printf(\"\\n\\n\\***************** 2---删除单个 ******************\"); printf(\"\\n\\n\\***************** 3---返回主菜单 *****************\"); printf(\"\\n\\n\\************************************************\"); printf(\"\\n\\n\\ 请选择:\"); choice=getch(); switch(choice) { case '1': deleteall(); break; case '2': deletesingle(); break; case '3': mainmenu(); break; default: deletemenu(); } } void deleteall() { printf(\"\\n\\ 确认删除(y/n)\"); if (getch()=='y') { if ((fp=fopen(\"TelInfo\ printf(\"\\n\\ 不能打开文件,删除失败\"); fp=fopen(\"TelInfo.txt\ NO=0; printf(\"\\n\\ 纪录已删除,按任意键返回主菜单\"); getch(); fclose(fp); return; } else return; } void deletesingle() { char choice; system(\"cls\"); printf(\"\\n\\n\\******************* 删除菜单 *******************\"); printf(\"\\n\\ 1-按姓名删除\"); printf(\"\\n\\ 2-按号码删除\"); printf(\"\\n\\ 3-返回删除菜单\"); printf(\"\\n\\n\ 请选择:\"); choice=getch(); switch (choice) { case '1': deletename(); break; case '2': deletetel(); break; case '3': deletemenu(); break; } } void deletename() { int i,j; int mark=0; char name[20]; system(\"cls\"); printf(\"\\n\\ 请输入要删除联系人姓名:\"); scanf(\"%s\ if(NO==0) { printf(\"\\n\\\ 对不起,通讯录中无任何纪录\"); printf(\"\\n\\n\\\ 按任意键返回主菜单\"); getch(); return; } for (i=0;i printf(\"\\n\\ 以下是您要删除的联系人纪录:\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ printf(\"\\n\\n\\ 是否删除(y/n)\"); if (getch()=='y') { for (j=i;j printf(\"\\n\\ 删除成功\"); savefile(); printf(\"\\n\\ 是否继续删除(y/n)\"); if (getch()=='y') deletename(); return; } else return; } continue; } if (mark==0) { printf(\"\\n\\ 没有该联系人的纪录\"); printf(\"\\n\\n\\ 是否继续删除(y/n)\"); if (getch()=='y') deletename(); return; } } void deletetel() { int i,j; int mark=0; char tel[20]; system(\"cls\"); printf(\"\\n\\ 请输入要删除联系电话:\"); scanf(\"%s\ if(NO==0) { printf(\"\\n\\\对不起,通讯录中无任何纪录\"); printf(\"\\n\\n\\\ 按任意键返回主菜单\"); getch(); return; } for (i=0;i printf(\"\\n\\ 以下是您要删除的联系人纪录:\"); printf(\"\\n\\n\\ 姓 名: %s\ printf(\"\\n\\ 工作单位: %s\ printf(\"\\n\\ 联系电话: %s\ printf(\"\\n\\ Email地址: %s\ printf(\"\\n\\n\\ 是否删除(y/n)\"); if (getch()=='y') { for (j=i;j printf(\"\\n\\删除成功\"); savefile(); printf(\"\\n\\ 是否继续删除(y/n)\"); if (getch()=='y') deletetel(); return; } else return; } continue; } if (mark==0) { printf(\"\\n\\没有该联系人的纪录\"); printf(\"\\n\\n\\ 是否继续删除(y/n)\"); if (getch()=='y') deletetel(); return; } } int loadfile() { FILE *fp; if((fp=fopen(\"TelInfo.txt\ { printf(\"\\n\\n\\n\\n\\n\\\电话簿文件不存在\"); if ((fp=fopen(\"TelInfo.txt\ { printf(\"\\n\\\\建立失败\"); exit(0); } else { printf(\"\\n\\\ 电话簿已建立\"); printf(\"\\n\\n\\\ 按任意键进入主菜单\"); getch(); NO=0; return(NO); } exit(0); } fseek(fp,0,2); if (ftell(fp)>0) { rewind(fp); for (NO=0;!feof(fp) && fread(&TelInfo[NO],sizeof(struct record),1,fp);NO++); printf(\"\\n\\n\\n\\n\\\\ :)文件导入成功\"); printf(\"\\n\\┏━━━━━━━━━━━━━━━━━━━━━━━┓\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ very good ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┗━━━━━━━━━━━━━━━━━━━━━━━┛\"); printf(\"\\n\\n\\\\ 按任意键返回主菜单\"); getch(); return(NO); } printf(\"\\n\\n\\n\\\ 文件导入成功\"); printf(\" \\n\\\\ 电话簿文件中无任何纪录\"); printf(\"\\n\\┏━━━━━━━━━━━━━━━━━━━━━━━┓\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ 没有可以访问的数据!! ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┃ ┃\"); printf(\"\\n\\┗━━━━━━━━━━━━━━━━━━━━━━━┛\"); printf(\"\\n\\n\\\ 按任意键返回主菜单进行添加\"); getch(); NO=0; return(NO); } void savefile() { int i; if ((fp=fopen(\"TelInfo.txt\ printf(\"\\n\\文件打开失败!\\n\"); for (i=0;i 7 软件的调试及测试 (1)当软件中总有输入人员信息时: 1)查看全部信息时: 根据提示输入2 2)查找人员信息时: 根据提示输入3 然后按回车 输入要查找人的姓名或电话 然后按回车 显示查找的人的信息 3)修改人员信息时: 根据提示输入4 按回车 输入需要修改的人员姓名 按回车 显示查找到的人员的信息 8 总结 通过这次通讯录的设计,我对很多的函数有了新的认识,也学会了运用多种函数,明白了写软件的基本过程和基本方法。 在设计的过程中遇到了很多的困难,有程序上的也有实验报告上的,尤其是软件在一次一 次的调试失败后,对我们打击很大。但最后我们还是咬牙让自己坚持了下来,通过小组的不断试验和讨论以及同学们的帮助,我们总算顺利的完成了程序设计。虽然在调试过程中遇到了许多困难,但当调试成功时那种喜悦的感觉,没有什么东西可以代替。在编写过程中我们都发现我们有许多的知识漏洞和缺陷,需要进一步努力来不断完善自己。 总之,此次过程不仅给我很多好的经验,同时加深了同学间的关系,增强了团队解决问题的能力。 电子科技大学成都学院 2011届课程设计成绩评定表 学生姓名 课程名称 设计题目 实验要求 同组成员 陶 星 学号 1140810621 专业 通信工程 C语言程序设计 通讯录管理系统设计 本程序是非数值计算型算法设计,主要使用的是数组的相关操作,包括结构体数组的输入、输出、查询、删除等。 这个通讯录系统 初步实现 人员信息的显示、删除、查询、修改等必要的功能。 唐梅(1140810532)陈奕欣(1140810530)朱司晨(1140810618) 心得体会: 此次实验,我主要负责部分程序的编写调试以及实验报告的编写。 通过这次C语言通讯录的设计,我对很多的函数有了新的认识,也学会了运用多种函数,明白了写软件的基本过程和基本方法。 在设计的过程中遇到了很多的困难,尤其是在一次一次的调试失败后,对我打击很大。但最后我们还是咬牙让自己坚持了下来,通过小组的不断试验和讨论以及同学们的帮助,我们总算顺利的完成了程序设计。虽然在调试过程中遇到了许多困难,但当调试成功时那种喜悦的感觉,没有什么东西可以代替。 总之,此次过程不仅给我很多好的经验,同时加深了同学间的关系,增强了团队解决问题的能力,更激发了我对今后的实验和学习的兴趣和信心。 成绩考核(由指导教师组填写)对小组做整体评阅。(前四项为优、良、中及格不及格,总成绩为通过不同过)。如个别学生不通过,请在备注栏标明。 考勤 程序及运行结果 设计报告 PPT及答辩 总成绩 备注 指导教师组签字: 完成时间 2012 年 12 月 26 日 因篇幅问题不能全部显示,请点此查看更多更全内容