C语言程序课程设计报告通讯录管理系统.doc
程序设计基础课程设计报告书设计题目 通讯录程序设计 姓 名 专业班级 信管10-01 学 号 指导教师 成 绩 _ 工商管理学院信息管理系2011年4月一、引言2二、系统功能和原始数据3三、程序总体设计3四、功能模块函数设计和调试5五、程序清单11六、课程设计总结17七、参考资料17一、引言为了系统的运用C程序设计方面的知识,考察自身知识结构上的不足,巩固程序设计基础,我做了一个通讯录管理系统。我觉得它的综合性比较强,不仅能运用到初级设计的顺序,选择,循环等的结构,同时还可以体现c语言的特色,比如说指针、结构体、共用体、文件。通讯录中涉及到的电话号码是整形数据,而姓名则是字符型的,同时邮箱又是整形和字符型数据的混合使用。有利于加强对数据类型的掌握。通讯录要求的基本功能是:1.数据的录入;2.数据的继续添加;3.数据的修改;4.数据的删除;5.数据的整体浏览;6.数据的查询(1).其中录入、添加、删除可用数组和文件共同完成,最终将数据储存在磁盘上,而不是内存中。(2).数据的浏览浏览可用循环和fread函数。(3).数据的查询用字符串函数中的strcmp其中大部分功能都是由调用函数实现的,这使得整个系统高度的模块化,有利于系统的维护和后续功能的扩展,同时尽量考虑使用过程中存在的问题并添加相应的提示,使得整个系统非常的智能化;另一方面,运用常见的格式控制和特殊的格式控制使得操作界面简洁明了。理论上操作界面可以直接切换,但是本程序设计中由于模块化的设计致使操作界面只能够靠循环来实现了,与理论设想相差一步。二、系统功能和原始数据(1) 原始数据(2) 系统功能1).新建联系人2).添加联系人3).修改信息4).删除一项或者多项5).整体浏览6).利用姓名或者电话号码查找联系人三、程序总体设计(1).数据结构1).整形(包括int和unsigned)2).字符型(2).模块划分和层次结构通讯录管理系统数据录入数据添加数据修改数据查找数据删除浏览(3).函数原型清单1)主函数main()2)菜单函数menu()3)数据输入函数enter()4)数据添加函数add()5)数据修改函数modify()6)记录浏览函数browse()7)数据删除函数deleter()8)数据查找函数search()9)库函数scanf()、printf()、getchar()、puts()、exit()11)处理文件的函数fopen()、fclose()、fread()、sizeof()12)处理字符串的函数strcmp()(4)程序总体框架MainMenuEnterAddBrowseSearchModifyDeleterExit(5)程序组织四、功能模块函数设计和调试1).输入模块作用:信息的录入输入新建的个数nnnJ=1J<=n姓名,籍贯,电话,邮箱箱save()J+menu()2)添加模块作用:完成系统数据的后续添加输入添加的个数tnni=1i<=t姓名,籍贯,电话,邮箱箱save()i+menu()t<=N-n?提示错误3)数据修改模块作用:可对存入记录的姓名、籍贯、联系电话1、联系电话2、邮箱进行修改并保存姓名s.namestrcmp( )=0?c姓名籍贯电话号码1电话号码2邮箱输入正确数据save()menu提示错误4).数据查找模块作用:通过姓名或者联系电话1、联系电话2查找其他信息int w ,c struct people s输出“1代表姓名,2代表电话号码”输入ww=1?输入s.name输出姓名、籍贯、电话1、电话2、邮箱1代表电话1输入ccs.num1s.num2strcmp()=0?strcmp( )=0?否是是提示错误提示错误5)数据删除模块作用:通过对文件的操作删除通讯录中的数据输入想删除的姓名i=1strcmp()=0?peoplei=0save()i<=ni+是删除完毕无此记录否6)数据浏览模块输出标题(fp=fopen(“file”,”wb”)!=null?输出数据没有记录fclose否五、程序清单#define N 50#include<stdio.h>#include<string.h>struct peoplechar name20; char address50; char num115; char num215; char mail20;peopN;void printf_face()/*显示选项*/ printf("nt姓名tt籍贯ttt电话号码1tt电话号码2tt邮箱n"); void printf_one(int i) printf("t%-16s%-24s%-16st%-16st%sn",peopi.name,peopi.address,peopi.num1,peopi.num2,peopi.mail); void printf_n(int n) int j; for(j=0;j<n;j+)/*n是用户想输入记录的多少*/ if(j!=0)&&(j%10=0) printf("nnPress any key to continue.:"); getchar(); puts("nn"); printf_one(j); getchar();int load() FILE *fp; int i; if(fp=fopen("file","rb")=NULL)/*文件的打开*/ printf("nCan not open filen"); exit(0);for(i=0;!feof(fp);i+) fread(&peopi,sizeof(struct people),1,fp);/*数据块的读写*/fclose(fp);return(i-1);/*返回一个值,间接显示存在的记录*/int modify_data(int i,int n)/*数据修改函数*/ int c,w1; void input(int i); void menu(); do puts("n修改选项=>nn 1).姓名 2).籍贯 3).电话号码1 4).电话号码2 5).邮箱 6).所有数据 7).取消并返回"); printf("请选择?: bb"); scanf("%d",&c); if(c>7|c<1) puts("n选择错误,请再次选择!"); getchar(); while(c>7|c<1); do switch(c) case 1: printf("姓名:"); scanf("%s",peopi.name); break; case 2: printf("籍贯"); scanf("%s",peopi.address); break; case 3: printf("电话号码1:"); scanf("%s",peopi.num1); break; case 4: printf("电话号码2:"); scanf("%s",peopi.num2); break; case 5: printf("邮箱:");scanf("%s",peopi.mail);break; case 6: input(i); break; case 7: menu(); puts("nNow:n"); printf_face(); printf_one(i); printf("n确定?nnt1).是 2).不,重新修改 3).返回不保存 bb"); scanf("%d",&w1); while(w1=2); return(w1);void input(int i) printf_face(); printf("t"); scanf("%st%st%st%st%s",peopi.name,peopi.address,peopi.num1,peopi.num2,peopi.mail); void save(int n)/*文件保存函数*/ FILE *fp; int i; if(fp=fopen("file","wb")=NULL) printf("n无法打开n"); exit(0); for(i=0;i<n;i+) if(peopi.name0!='0') if(fwrite(&peopi,sizeof(struct people),1,fp)!=1) printf("文件写入错误!n"); fclose(fp);void printf_back() int w; void browse(); void menu(); printf("nnt_.*操作成功*. _nn"); printf("接下来你想干什么?nnt1).浏览所有t2).返回: bb"); scanf("%d",&w); if(w=1) browse(); else menu();void main() void menu(); menu();void menu() int n, w1; void enter(); void add(); void modify(); void browse(); void deleter(); void search(); do puts("nn*欢迎进入通讯录管理系统*"); puts("tt*菜单*"); puts("tt*1.新建联系人*"); puts("tt*2.添加联系人*"); puts("tt*3.修 改*"); puts("tt*4.删 除*"); puts("tt*5.浏 览*"); puts("tt*6.查 找*"); puts("tt*7.退 出*"); printf("请选择服务种类(1-7) : bb");/*向前退两格,光标落到括号中*/ scanf("%d",&n); if(n<1|n>7) w1=1;getchar(); else w1=0; while(w1=1); switch(n) case 1: enter(); break; case 2: add(); break; case 3: modify(); break; case 4: deleter(); break; case 5: browse(); break; case 6: search(); break; case 7: exit(0); void enter()/*数据输入函数*/ int i,n; printf("想存入多少个记录(0-%d)?:",N); scanf("%d",&n); printf("请输入数据:n"); for(i=0;i<n;i+) printf("n输入第 %d个记录.n",i+1); input(i); if(i!=0) save(n); printf_back();void add()/*数据添加函数*/ int i,n,k,t; n=load(); printf("想添加多少个联系人(0-%d)?:",N-n);/*添加的个数与已存在的个数有关*/ scanf("%d",&t); k=n+t; for(i=n;i<k;i+) printf("n输入第 %d个记录.n",i-n+1); input(i);/*输出第i个记录*/ save(k); printf_back();/*存储所有的记录*/void modify()/*数据修改函数,与modify_data一起使用*/ struct people s; int i,n,k,w0=1,w1,w2=0; n=load(); do k=-1; printf_face(); printf_n(n); do printf("nn请输入你想修改的记录的姓名!n姓名:"); scanf("%s",s.name); for(i=0;i<n;i+) if(strcmp(s.name,peopi.name)=0) k=i; s=peopi; if(k=-1) printf("nn没有记录请重新输入!"); while(k=-1); printf_face(); printf_one(k); w1=modify_data(k,n); if(w1=1) printf("nt_.操作成功. _.nn是否继续?nnt1).是 2).保存返回t bb"); scanf("%d",&w0); w2=1; else w0=0; if(w2=0) peopk=s; if(w0!=1)&&(w2=1) save(n); while(w0=1); menu();void browse()/*文件浏览函数*/ int n; n=load(); printf_face(); printf_n(n); printf("t共有 %d 记录.n",n); printf("nPress any key to back."); getchar(); menu();void search()/*数据查找函数*/ int w0,k,i,n,w1,w2; struct people s; int c; n=load(); do printf("请选择查找类别: 1).姓名 2).电话号码 bb"); scanf("%d",&w1); if(w1<1|w1>2) printf("输入错误!请重新输入!n"); w2=1; while(w2=1); if(w1=1) do k=-1; do printf("nn请输入你想查找项的姓名!n姓名:"); scanf("%s",s.name); for(i=0;i<n;i+) if(strcmp(s.name,peopi.name)=0) k=i; s=peopi; if(k=-1) printf("nn没有记录请重新输入!"); while(k=-1); printf_face(); printf_one(k); printf("n接下来想干什么?nt1).继续 2).返回菜单 bb"); scanf("%d",&w0); while(w0=1); menu(); else printf("nn你想用哪个电话号码查找?nt1).电话号码1 2).电话号码2 bb"); scanf("%d",&c);switch(c)case 1:printf("请输入电话号码1n电话号码1:"); scanf("%s",s.num1); for(i=0;i<n;i+) if(strcmp(s.num1,peopi.num1)=0) k=i; s=peopi; else printf("nn没有记录请重新输入!"); ;break;case 2: printf("请输入电话号码2n电话号码2:"); scanf("%s",s.num2); for(i=0;i<n;i+) if(strcmp(s.num2,peopi.num1)=0) k=i; s=peopi; else printf("nn没有记录请重新输入!"); ;break; printf_face(); printf_one(k); printf("n接下来你想干什么?nt1).继续 2).返回菜单 bb"); scanf("%d",&w0); while(w0=1); menu(); void deleter()/*数据删除函数*/struct people s; int i,n,k,w0,w1; n=load(); do k=-1; printf_face(); printf_n(n); do printf("nn请输入你想删除项的姓名!n姓名:"); scanf("%s",s.name); for(i=0;i<n;i+) if(strcmp(s.name,peopi.name)=0) k=i; s=peopi; if(k=-1) printf("nn没有记录请重新输入!"); while(k=-1); printf_face(); printf_one(k); printf("n确定?nt1).是 2).返回 bb"); scanf("%d",&w0); if(w0=1) peopk.name0='0' save(n); else break; printf("nt_.操作成功._.n"); printf("接下来你想干什么?nt1).继续 2).返回 bb"); scanf("%d",&w1); while(w1=1); menu();六、课程设计总结通过课程设计我更深入的学习了C程序设计,整个知识体系比以前更加完整。同时又深入的学习了文件,指针,函数等内容,为以后的学习奠定了一定的基础。在整个设计过程中我深刻的体会到了模块化的程序设计方法的优点。在一定程度上体验了程序设计的过程。在整个设计过程中不断出现的问题及解决中,我体会到C语言具有很强的灵活性,运用熟练了可以设计出很好的程序,如果掌握不好的话就会出现很多设计漏洞。七、参考资料1 谭浩强.C程序设计(第三版).北京:清华大学出版社,20052 刘腾红 孙细明.信息系统分析与设计.科学出版社,20033 住群雄.系统分析与设计.电子工业出版社,20034