C语言课程设计通讯录管理系统.doc
中 国 地 质 大 学本科生课程论文封面2012年12月课程设计评语对课程论文的评语:平时成绩:课程论文成绩:总 成 绩:评阅人签名:注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。目 录课程设计评语2目 录31课程论文题目42程序设计思路43功能模块图54数据结构设计55算法设计66程序代码137程序运行结果228编程中遇到的困难及解决方法259总结心得及良好建议2610致谢261课程论文题目 通讯录管理系统要求:设计具有数据插入、修改、删除、显示和查询功能的电话簿管理系统。数据包括:人名、工作单位、电话号码和E-mail地址。可对记录中的姓名和电话号码进行修改。可增加或删除记录。可显示所有保存的记录。可按人名或电话号码进行查询。2程序设计思路根据题目的要求,程序应该采用结构体数组和文件系统实现。应该有动态的存储空间和文件输入、输出等操作功能;在程序中应该包括添加、显示、删除、查询和修改以及保存和退出的功能;另外还应提供键盘式选择菜单实现功能选择。3功能模块图4数据结构设计整个程序中用到的数据主要是全局变量MAX 100和字符变量name10、addr20、phnum20、email20。5算法设计1. 主函数主函数的设计一般比较的简单,只提供输入,功能处理和输出部分的函数调用。其中个功能模块用菜单方式选择。菜单部分也可以写成函数。流程图程序main() /*主函数*/int n; /*变量保存选择菜单数子*/creat(); do printf("nt*n"); printf("nnt*WELCOME TO USE!*n"); printf("nt*n"); printf("nntt*Please make a choice below*n"); printf("ntt1.Add a piece of meg"); printf("ntt2.List all the meg"); printf("ntt3.Delete a piece of meg"); printf("ntt4.Find a piece of meg"); printf("ntt5.Alter a piece of meg"); printf("ntt6.Save and Quit"); printf("ntt7.Create an address book"); printf("nnn"); printf("t*Input Your Choice:*n");scanf("%d",&n); switch(n) /*输入n的在1-6之间执行switch */ case 1: Add(); /*添加模块*/ break; case 2: List(); /*显示模块*/ break; case 3: Delete(); /*删除模块*/ break; case 4: Find(); /*查询模块:分为名字查询(0)和电话号码查询(1)*/ break; case 5: Alter(); /*修改模块:分为修改名字(0)和修改电话号码(1)*/ break; case 6: exit(0); /*退出模块*/ break; case 7: creat(); /*带回链表起始地址*/ fclose(fp); default: /*输入的n不在1-6之间执行default */ printf("nt*n"); printf("nt The num should be 1-6! n"); printf("nt*n"); break; while(1); 2.各功能模块设计数据结构通讯录的数据信息:人名、工作单位、电话号码、E-mail地址均可以采用字符型数组;可以采用结构体的形式,把各信息作为结构的成员,由于通讯录要具有添加、查找、和删除的功能,所以整个通讯录采用链表比较容易的实现以上功能。用结构体变量作为链表中的接点是最合适的。结构体变量可以是指针类型,我们可以用这个指针类型的成员来存放下一个结点的地址。结构体的类型如下: struct persons typedef struct p char name10 char name10; char addr20; char addr20; char phnum20; char phnum20; char email20; char email20; personsMAX; struct p *next; p,*linklist;struct persons类型为每个链表成员; typedef struct p为一个动态的结点,它的成员next存放下一个结点的地址。以下为各模块分析时要用的指针: linklist head=NULL,t=NULL; /*定义头指针和尾指针*/ p *s,*p0,*p1,*p2,*p3,*p4,*p5; int i; char name110,ch; char str120 ; FILE *fp; /*定义文件指针*/(1)输入模块程序void creat() /*将文件的信息读入结构体数组在转存入链表中*/int j;long k; fp=fopen("people.txt","r+");/*打开文件*/ if(fp!=NULL) for(i=1;i<MAX;i+)j=fgetc(fp); if(j=EOF) return; k=i-1; fseek(fp,k*sizeof(struct persons),0); /*读取一个人的信息*/ fread(&personsi,sizeof(struct persons),1,fp); s=(linklist)malloc(sizeof(p); /*装存入链表中*/ strcpy(s->name,personsi.name); strcpy(s->addr,personsi.addr); strcpy(s->phnum,personsi.phnum);strcpy(s->email,personsi.email); if(head=NULL) /*用尾插法将其插入链表中*/ head=s; else t->next=s; t=s; else fp=fopen("people.txt","w"); i=1; /*不能打开另开辟一个文件*/ 添加模块 由于运用的是链表的形式,且通讯录只是按照输入的先后循序排序,所以对添加的信息采用插入末端的方式,同时添加也使用于空通讯录的信息输入。程序void Add() /*向通讯录中添加(或输入)一个人的信息*/s=(linklist)malloc(sizeof(p);s->next=NULL; printf("nnt*Please input the sb's message:*"); printf("nnttname:"); scanf("%s",s->name); printf("nnttAddr:"); scanf("%s",s->addr); printf("nnttphnum:"); scanf("%s",s->phnum);printf("nnttemai:"); scanf("%s",s->email); if(head=NULL) head=s; /*若通讯录为空则添加在头指针之后相当于输入信息*/ else t->next=s; /*添加到链表的末尾*/ t=s; 显示模块 链表的一大好处是只要定义了头指针,则所有的信息就很容易的找到,指针会一环扣一环的找到每个信息,显示出每个信息,直到最后到位指针结束。程序void List() /*显示所有的信息*/p0=head; /* p0指向头指针*/while(p0!=NULL) /*通讯录不为空*/ printf("tname:%s",p0->name); printf("taddr:%s",p0->addr); printf("tphnum:%s",p0->phnum); printf("temail:%sn",p0->email); p0=p0->next; /* p0向后移一个位置*/ 删除模块 删除一个人的信息相当于是删除链表中的一个结点。在删除后又要保证链表不间断,如同手牵手排队的小孩,一个离队后,它两侧的小孩又自动地把手牵起来,保证不间断即把结点从链表中分离开来,只要撤销原来的链表关系即可。流程图 要删除地信息p1->nexxtp1=p1->nextp2=p1程序void Delete() /*定义一个删除的函数*/char name010;p1=head; printf("nt*Please input a name:*n"); /*输入要删除人的姓名*/printf("nttname0:");gets(name0);scanf("%s",name0);while(strcmp(name0,p1->name)!=0)&&(p1!=NULL) /*根据各种情况判断可能性*/p2=p1;p1=p1->next; /*指针向后移一个位置*/if(strcmp(name0,p1->name)=0) /*找到要删除的位置*/if(p1=head)head=p1->next;else p2->next=p1->next;printf("nt*Delete success!*n");else printf("nt*Delete fail!*n"); /*没找到要删除的位置*/查询模块 按照题目的要求查询可以分为姓名查询和电话号码查询流程图选择查询方式查询输入电话号码:输入姓名:找到找到未找到提示信息未找到提示信息找到的提示信息找到的提示信息程序void Find() /*定义一个查询的函数*/int n;char phnum120,name110;printf("nt*Search by name or phpnum?*name(n=0)phnum(n=1)*n");printf("*Input the number of 'n':*n");scanf("%d",&n); /*选择查询方式*/ if(n=0) /*姓名查询*/printf("ntname:"); p3=head;gets(name1); scanf("%s",&name1); /*输入姓名*/while(strcmp(name1,p3->name)!=0)&&(p3!=NULL) /*根据各种情况判断可能性*/p3=p3->next;if(p3->name=NULL) /*没有找到*/printf("nt*Can not find the message!*"); else if(strcmp(name1,p3->name)=0) /*找到信息并输出*/ printf("nt *Found the message:*n"); printf("ntname: %s",p3->name); printf("taddress:%s",p3->addr); printf("temail: %s",p3->email); printf("tphnum: %s",p3->phnum); else if(n=1) /*电话号码查询*/ printf("ntphnum1"); p3=head; gets(phnum1);scanf("%s",&phnum1); /*输入电话号码*/while(strcmp(phnum1,p3->phnum)!=0)&&(p3!=NULL) /*根据各种情况判断可能性*/p3=p3->next; if(p3->phnum=NULL) /*没有找到*/ printf("nt*Can not find the message!*"); else if(strcmp(phnum1,p3->phnum)=0) /*找到信息并输出*/ printf("nnt*Found the message:*"); printf("ntname: %s",p3->name);修改模块按照题目的要求查询可以分为修改姓名和修改电话号码,修改模块的设计思路和查询模块的思路基本上相同。流程图修改修改失败输入新的电话号码提示修改成功输入新的姓名提示修改成功修改失败找到信息找到信息未找到信息未找到输入电话号码:输入姓名:修改内容程序void Alter() /*定义一个修改的函数*/int m;char phnum220,name210;printf("nnt*Which message do you want to alter?*name(m=0)phnum(m=1)*n"); printf("*Input the number of 'm':*n");scanf("%d",&m); /*选择修改内容*/if(m=0) /*修改姓名*/ printf("ntname:"); scanf("%s",&name2); /*输入要修改的姓名*/ p4=head;while(strcmp(name2,p4->name)!=0)&&(p4!=NULL) /*根据各种情况判断可能性*/p4=p4->next; if(p4=NULL)printf("nt*Can not find the mame!*n"); else if(strcmp(name2,p4->name)=0) /*找到要修改的姓名*/printf("nnt*Input the new nessage:*n"); printf("nnnttname:"); canf("%s",&name2); /*输入新的信息*/ strcpy(p4->name,name2); /*新的姓名修改成功*/ printf("nnt*Altered success!*n"); else if(m=1) /*修改电话号码*/printf("ntphnum:");scanf("%s",&phnum2); /*输入要修改的电话号码*/p4=head;while(strcmp(phnum2,p4->phnum)!=0)&&(p4!=NULL) /*根据各种情况判断可能性*/p4=p4->next; if(p4=NULL) printf("nt*Can not find the phnum!*n"); else if(strcmp(phnum2,p4->phnum)=0) /*找到要修改的电话号码*/ printf("nnt*Input the new nessage:*n"); printf("nnnttphnum:"); scanf("%s",&phnum2); /*输入新的信息*/ strcpy(p4->phnum,phnum2); /*新的电话号码修改成功*/ printf("nnt*Altered success!*n");保存模块程序void Save() /*定义一个保存信息的函数*/ int j;fp=fopen("people.txt","w");for(p5=head,j=0;p5!=NULL;j+,p5=p5->next) /*将信息装出入结构体数组在出入链表中*/ strcpy(personsj.name,p5->name); strcpy(personsj.addr,p5->addr); strcpy(personsj.phnum,p5->phnum);strcpy(personsj.email,p5->email); fwrite(&personsj,sizeof(struct persons),1,fp); 6程序代码#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 100struct persons char name10; char addr20; char phnum20;char email20;personsMAX;typedef struct p char name10; char addr20;char phnum20;char email20; struct p *next; p,*linklist; linklist head=NULL,t=NULL; p *s,*p0,*p1,*p2,*p3,*p4,*p5; int i; char name110,ch; char str120 ; FILE *fp;void creat() int j;long k; fp=fopen("people.txt","r+"); if(fp!=NULL) for(i=1;i<MAX;i+) j=fgetc(fp); if(j=EOF) return; k=i-1; fseek(fp,k*sizeof(struct persons),0); fread(&personsi,sizeof(struct persons),1,fp); s=(linklist)malloc(sizeof(p); strcpy(s->name,personsi.name); strcpy(s->addr,personsi.addr); strcpy(s->phnum,personsi.phnum);strcpy(s->email,personsi.email); if(head=NULL) head=s; else t->next=s; t=s; else fp=fopen("people.txt","w"); i=1; void Add() s=(linklist)malloc(sizeof(p);s->next=NULL; printf("nnt*Please input the sb's message:*"); printf("nnttname:"); scanf("%s",s->name); printf("nnttAddr:"); scanf("%s",s->addr); printf("nnttphnum:"); scanf("%s",s->phnum);printf("nnttemai:"); scanf("%s",s->email); if(head=NULL) head=s; else t->next=s; t=s; void List() p0=head;while(p0!=NULL) printf("tname:%s",p0->name); printf("taddr:%s",p0->addr); printf("tphnum:%s",p0->phnum); printf("temail:%sn",p0->email); p0=p0->next; void Delete()char name010;p1=head;printf("nt*Please input a name:*n");printf("nttname0:");gets(name0);scanf("%s",name0);while(strcmp(name0,p1->name)!=0)&&(p1!=NULL)p2=p1;p1=p1->next;if(strcmp(name0,p1->name)=0)if(p1=head)head=p1->next;else p2->next=p1->next;printf("nt*Delete success!*n");else printf("nt*Delete fail!*n");void Find()int n;char phnum120,name110;printf("nt*Search by name or phpnum?*name(n=0)phnum(n=1)*n");printf("*Input the number of 'n':*n");scanf("%d",&n);if(n=0)printf("ntname:"); p3=head; gets(name1); scanf("%s",&name1);while(strcmp(name1,p3->name)!=0)&&(p3!=NULL)p3=p3->next; if(p3->name=NULL) printf("nt*Can not find the message!*"); else if(strcmp(name1,p3->name)=0) printf("nt *Found the message:*n"); printf("ntname: %s",p3->name); printf("taddress:%s",p3->addr); printf("temail: %s",p3->email); printf("tphnum: %s",p3->phnum);待添加的隐藏文字内容2 else if(n=1) printf("ntphnum1"); p3=head; gets(phnum1);scanf("%s",&phnum1);while(strcmp(phnum1,p3->phnum)!=0)&&(p3!=NULL)p3=p3->next; if(p3->phnum=NULL) printf("nt*Can not find the message!*"); else if(strcmp(phnum1,p3->phnum)=0) printf("nnt*Found the message:*"); printf("ntname: %s",p3->name); printf("taddress:%s",p3->addr); printf("temail: %s",p3->email); printf("tphnum: %s",p3->phnum); void Alter()int m;char phnum220,name210;printf("nnt*Which message do you want to alter?*name(m=0)phnum(m=1)*n");printf("*Input the number of 'm':*n");scanf("%d",&m);if(m=0) printf("ntname:"); scanf("%s",&name2); p4=head;while(strcmp(name2,p4->name)!=0)&&(p4!=NULL)p4=p4->next; if(p4=NULL)printf("nt*Can not find the mame!*n"); else if(strcmp(name2,p4->name)=0) printf("nnt*Input the new nessage:*n"); printf("nnnttname:"); scanf("%s",&name2); strcpy(p4->name,name2); printf("nnt*Altered success!*n"); else if(m=1) printf("ntphnum:");scanf("%s",&phnum2); p4=head;while(strcmp(phnum2,p4->phnum)!=0)&&(p4!=NULL)p4=p4->next; if(p4=NULL) printf("nt*Can not find the phnum!*n"); else if(strcmp(phnum2,p4->phnum)=0) printf("nnt*Input the new nessage:*n"); printf("nnnttphnum:"); scanf("%s",&phnum2); strcpy(p4->phnum,phnum2); printf("nnt*Altered success!*