一、引言
为了系统的运用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)程序总体框架
(5)程序组织
四、功能模块函数设计和调试
1).输入模块
作用:信息的录入
2)添加模块
作用:完成系统数据的后续添加
3)数据修改模块
作用:可对存入记录的姓名、籍贯、联系电话1、联系电话2、邮箱进行修改并保存
4).数据查找模块
作用:通过姓名或者联系电话1、联系电话2查找其他信息
5)数据删除模块
作用:通过对文件的操作删除通讯录中的数据
6)数据浏览模块
五、程序清单
#define N 50
#include
#include
struct people
{char name[20]; char address[50]; char num1[15]; char num2[15]; char mail[20];}peop[N];
void printf_face()/*显示选项*/
{ printf("\n\t姓名\t\t籍贯\t\t\t电话号码1\t\t电话号码2\t\t邮箱\n"); }
void printf_one(int i)
{ printf("\t%-16s%-24s%-16s\t%-16s\t%s\n",peop[i].name,peop[i].address,peop[i].num1,peop[i].num2,peop[i].mail); }
void printf_n(int n)
{ int j;
for(j=0;j { if((j!=0)&&(j%10==0)) {printf("\n\nPress any key to continue...:"); getchar(); puts("\n\n");} printf_one(j); } getchar(); } int load() { FILE *fp; int i; if((fp=fopen("file","rb"))==NULL)/*文件的打开*/ { printf("\nCan not open file\n"); exit(0); } for(i=0;!feof(fp);i++) fread(&peop[i],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修改选项=>\n\n 1).姓名 2).籍贯 3).电话号码1 4).电话号码2 5).邮箱 6).所有数据 7).取消并返回"); printf("请选择?: [ ]\b\b"); scanf("%d",&c); if(c>7||c<1) {puts("\n选择错误,请再次选择!"); getchar();} }while(c>7||c<1); do { switch(c) { case 1: printf("姓名:"); scanf("%s",peop[i].name); break; case 2: printf("籍贯"); scanf("%s",peop[i].address); break; case 3: printf("电话号码1:"); scanf("%s",peop[i].num1); break; case 4: printf("电话号码2:"); scanf("%s",peop[i].num2); break; case 5: printf("邮箱:");scanf("%s",peop[i].mail);break; case 6: input(i); break; case 7: menu(); } puts("\nNow:\n"); printf_face(); printf_one(i); printf("\n确定?\n\n\t1).是 2).不,重新修改 3).返回不保存 [ ]\b\b"); scanf("%d",&w1); }while(w1==2); return(w1); } void input(int i) { printf_face(); printf("\t"); scanf("%s\t%s\t%s\t%s\t%s",peop[i].name,peop[i].address,peop[i].num1,peop[i].num2,peop[i].mail); } void save(int n)/*文件保存函数*/ { FILE *fp; int i; if((fp=fopen("file","wb"))==NULL) { printf("\n无法打开\n"); exit(0); } for(i=0;i if(peop[i].name[0]!='\0') if(fwrite(&peop[i],sizeof(struct people),1,fp)!=1) printf("文件写入错误!\n"); fclose(fp); } void printf_back() { int w; void browse(); void menu(); printf("\n\n\t^_^.*操作成功*. ^_^\n\n"); printf("接下来你想干什么?\n\n\t1).浏览所有\t2).返回: [ ]\b\b"); 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("\n\n*******************************欢迎进入通讯录管理系统***************************"); puts("\t\t************************菜单**********************"); puts("\t\t*******************1.新建联系人*******************"); puts("\t\t*******************2.添加联系人*******************"); puts("\t\t*******************3.修 改*******************"); puts("\t\t*******************4.删 除*******************"); puts("\t\t*******************5.浏 览*******************"); puts("\t\t*******************6.查 找*******************"); puts("\t\t*******************7.退 出*******************"); printf("请选择服务种类(1-7) : [ ]\b\b");/*向前退两格,光标落到括号中*/ 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 {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 { 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("\n\n请输入你想修改的记录的姓名!\n姓名:"); scanf("%s",s.name); for(i=0;i if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_face(); printf_one(k); w1=modify_data(k,n); if(w1==1) {printf("\n\t^_^.操作成功. ^_^.\n\n是否继续?\n\n\t1).是 2).保存返回\t[ ]\b\b"); scanf("%d",&w0); w2=1;} else {w0=0; if(w2==0) peop[k]=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).电话号码 [ ]\b\b"); scanf("%d",&w1); if(w1<1||w1>2) {printf("输入错误!请重新输入!\n"); w2=1;} }while(w2==1); if(w1==1) {do { k=-1; do { printf("\n\n请输入你想查找项的姓名!\n姓名:"); scanf("%s",s.name); for(i=0;i if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_face(); printf_one(k); printf("\n接下来想干什么?\n\t1).继续 2).返回菜单 [ ]\b\b"); scanf("%d",&w0); }while(w0==1); menu(); } else { printf("\n\n你想用哪个电话号码查找?\n\t1).电话号码1 2).电话号码2 [ ]\b\b"); scanf("%d",&c); switch(c) { case 1:{ printf("请输入电话号码1\n电话号码1:"); scanf("%s",s.num1); for(i=0;i if(strcmp(s.num1,peop[i].num1)==0) {k=i; s=peop[i];} else printf("\n\n没有记录请重新输入!"); };break; case 2:{ printf("请输入电话号码2\n电话号码2:"); scanf("%s",s.num2); for(i=0;i if(strcmp(s.num2,peop[i].num1)==0) {k=i; s=peop[i];} else printf("\n\n没有记录请重新输入!"); };break; } printf_face(); printf_one(k); printf("\n接下来你想干什么?\n\t1).继续 2).返回菜单 [ ]\b\b"); 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("\n\n请输入你想删除项的姓名!\n姓名:"); scanf("%s",s.name); for(i=0;i if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_face(); printf_one(k); printf("\n确定?\n\t1).是 2).返回 [ ]\b\b"); scanf("%d",&w0); if(w0==1) {peop[k].name[0]='\0'; save(n);} else break; printf("\n\t^_^.操作成功.^_^.\n"); printf("接下来你想干什么?\n\t1).继续 2).返回 [ ]\b\b"); scanf("%d",&w1); }while(w1==1); menu(); } 六、课程设计总结 通过课程设计我更深入的学习了C程序设计,整个知识体系比以前更加完整。同时又深入的学习了文件,指针,函数等内容,为以后的学习奠定了一定的基础。在整个设计过程中我深刻的体会到了模块化的程序设计方法的优点。在一定程度上体验了程序设计的过程。 在整个设计过程中不断出现的问题及解决中,我体会到C语言具有很强的灵活性,运用熟练了可以设计出很好的程序,如果掌握不好的话就会出现很多设计漏洞。