C语言程序设计报告-通讯录管理系统_第1页
C语言程序设计报告-通讯录管理系统_第2页
C语言程序设计报告-通讯录管理系统_第3页
C语言程序设计报告-通讯录管理系统_第4页
C语言程序设计报告-通讯录管理系统_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计报告一.课题通讯录管理系统二.设计方案简介为了帮助广大人群解决笔记通讯录所带来的诸多不便,本人利用所学的专业知识,设计了一个简单,便利的系统供大家在线存储众多联系人信息。这样做一来可以将自己的知识生活化,运用自己所学为他人做点事,二来,在完成这项任务的过程中,通过克服一道又一道难题,我巩固了自己的知识,发现了自己的不足,进而提升了自己的能力。该方案从整体出发,化整为零。各个功能都是通过独立函数实现。其中设计了信息录入,信息查询,信息修改,信息删除,信息保存,信息显示等功能。方案的结构一目了然,便于用户操作。经过在MicrosoftVisualC++6.0中多次测试,结果均与预期相符。加上该程序要求的平台不是很高,一般用户均可方便使用。三.算法与数据结构<一>运用的数据类型有:int,char,file,.<二>主要功能模块的算法设计思路如下:1、添加信息函数(voidAdd(Linkl))(1)定义指向结构体变量的指针;(2)移动指针,找到插入结点;(3)在要插入的结点输入信息;(4)调用保存函数,打开文件,保存输入信息。2、修改信息函数(voidModify(Linkl))(1)定义指向结构体变量的指针;(2)用指针检验链表中是否有记录,若没记录,返回主函数;(3)根据要修改的编号查找对应结点;(4)修改信息;(5)打开文件,保存修改记录。3、删除信息函数(voidDel(Linkl))(1)定义指向结构体变量的指针;(2)用指针检验链表中是否有记录,若没记录,返回主函数;(3)根据要修改的编号查找要删除的结点;(4)修改链表,删除对应结点。4、显示记录函数(voidDisp(Linkl))(1)打开文件;(2)用指针检验是否有记录;(3)若无记录,输出提示信息,返回主函数;若有记录,移动指针,依次输出记录;(4)关闭文件。5、查询通讯录信息(voidFind(Linkl))(1)选择查询方式(按姓名、编号或地址);(2)输入查询关键字:(3)在链表中寻找相应结点;(4)调用输出函数,输出结点信息。以上各个函数的流程图如下:(添加信息)FILE*p,打开该磁盘文件 从键盘输入数据是 链表为空 否插入表头插入表尾输出数据,存入磁盘文件关闭文件(显示信息)FILE*fp,打开该文件p=head,使p指向第一个结点 P指向的不是尾结点真 假输出p所指向的结点P指向下一个结点关闭文件关闭文件(按姓名查找)打开磁盘文件是链表为空否输出“尚无记录信息”p=head当name2=p->name是 P是要找的结点否 输出此结点输出“查无此人“的信息关闭文件(按编号查找)打开磁盘文件是链表为空否输出“尚无记录信息”p=head当num2=p->nun是 P是要找的结点否 输出此结点输出“查无此人“的信息关闭文件(按地址查找)打开磁盘文件是链表为空否输出“尚无记录信息”p=head当address2=p->address是 P是要找的结点否 输出此结点输出“查无此人“的信息关闭文件四.总体框架通讯录管理系统:录入通讯录信息修改通讯录信息查询通讯录信息浏览通讯录信息增加通讯录信息推出系通讯录统五.模块设计模块一:头文件,变量定义,函数的声明对系统所使用的变量进行定义,对函数进行声明模块二:界面菜单通过switch(c)调用,以上各函数,实现功能模块三:录入通讯录信息先用voidload()加载数据,说明一个文件指针FILE*fp打开文件"D:\\Contactbook"模块四:通讯录信息的查找声明voidmodify()的前半部分为查找函数,通过switch(item)设定用电话号码查找,用姓名查找两个分支模块五:通讯录信息的修改声明voidmodify()为学生信息修改函数,通过switch(item)设定所要修改的项目模块六:加通讯录信息声明voidinsert()插入通讯录信息,先通过判断通讯录是否存在,若否则继续输入,若是跳出,重新循环模块七:通讯录信息声明voiddel()实现通讯录信息删除,通过学号对比确定要删除的信息,然后用后一个替换掉。模块八:示学生信息通过disp()函数输出通讯录信息模块九;存信息通过voidsave()函数保存信息到文件。设计详情1.主函数主函数设计要求简洁,只提供部分提示语和函数的调显示一系列功能选项显示一系列功能选项输入n,判断n是否是0~6?根据n的值调用各功能模块函数结束开始N图1.主函数流程图七.源代码#include"stdio.h"#include"stdlib.h"#include"string.h"#defineHEADER1"\n"#defineHEADER2"编号姓名电话号码地址邮箱\n"#defineFORMAT"%-6s%-15s%-12s%-10s%-20s\n"#defineDATAp->data.num,p->,p->data.phone,p->data.address,p->data.email#defineEND"\n"intsave=0;//定义与联系人有关的数据结构structperson{ charnum[6]; charname[15]; charphone[12]; charaddress[10]; charemail[20];};//定义每条记录或结点的数据结构typedefstructnode{ structpersondata; structnode*next;}Node,*Link; //Node为node类型的结构变量,*Link为node类型的指针变量voidmenu()//主菜单{ printf("\n");printf("本系统可以实现以下功能:\n"); printf("\n"); printf("1添加记录2删除记录3修改记录\n"); printf("\n"); printf("4查询记录5显示记录6保存记录\n"); printf("\n"); printf("0退出系统\n"); printf("\n"); }voidprinthead()//格式化输出表头{ printf(HEADER1);printf(HEADER2);}voidprintdata(Node*pp)//格式化输出表中数据{ Node*p; p=pp; printf(FORMAT,DATA);}//显示单链表l中存储的联系人记录,内容为person结构中定义的内容voidDisp(Linkl){ Node*p; p=l->next;//存储的是单链表中头结点的指针 if(!p)//p==NULL,NUll在stdlib中定义为0 { printf("\n=====>没有记录!\n"); return; } printf("\n\n"); printhead();//输出表格头部 //逐条输出链表中存储的联系人信息 while(p) { printdata(p); p=p->next;//移动到下一个结点 } }Node*Locate(Linkl,charfindness[],charnameornum[]){ Node*r; if(strcmp(nameornum,"num")==0)//按编号查询 { r=l->next; while(r) { if(strcmp(r->data.num,findness)==0)//若找到findmess值的学号 returnr; r=r->next; } } elseif(strcmp(nameornum,"name")==0)//按姓名查询 { r=l->next; while(r) { if(strcmp(r->,findness)==0)//若找到findmess值的联系人姓名 returnr; r=r->next; } } elseif(strcmp(nameornum,"address")==0)//按地址查询 { r=l->next; while(r) { if(strcmp(r->data.address,findness)==0)//若找到findmess值的联系人地址 returnr; r=r->next; } } return0;//若未找到,返回一个空指针}//输入字符串voidstringinput(char*t,intlengths,char*attention){charn[255];do{printf(attention);//显示提示信息scanf("%s",n);//输入字符串if((int)strlen(n)>lengths) printf("\n超过设定长度!\n");//进行长度校验,超过lengths值重新输入}while((int)strlen(n)>lengths);strcpy(t,n);//将输入的字符串拷贝到字符串t中}intnumberinput(char*attention){ intt=0; printf(attention); scanf("%d",&t); returnt;}//增加联系人记录voidAdd(Linkl){ Node*p,*r,*s; charflag=0,num[6]; r=l; s=l->next; Disp(l);//先打印出已有的联系人信息 while(r->next!=NULL)r=r->next;//将指针移至于链表最末尾 while(l) { while(l) { stringinput(num,6,"输入编号(按'0'返回主菜单):");//格式化输入编号并检验 flag=0; if(strcmp(num,"0")==0)//输入为0,则退出添加操作,返回主界面 {return;} s=l->next; //查询该编号是否已经存在,若存在则要求重新输入一个未被占用的学号 while(s) { if(strcmp(s->data.num,num)==0) { flag=1; break; } s=s->next; } if(flag==1)//提示用户是否重新输入 { printf("=====>编号%s已经存在,是否重试?",num); } else {break;} } p=(Node*)malloc(sizeof(Node));//申请内存空间 if(!p) { printf("\n申请内存空间失败");//如没有申请到,打印提示信息 return;//返回主界面 } strcpy(p->data.num,num);//将字符串num拷贝到p->data.num中 stringinput(p->,15,"Name:");stringinput(p->data.phone,12,"Phone:"); stringinput(p->data.address,10,"Address:"); stringinput(p->data.email,20,"email:"); p->next=NULL;//表明这是链表的尾部结点 r->next=p;//将新建的结点加入链表尾部 r=p; save=1; } return;}//查询记录voidFind(Linkl)//按编号或姓名,查询电话记录{ intselect;//1:按编号查,2:按姓名查,3:按地址查找,其他:返回主界面(菜单) charsearchinput[20];//保存用户输入的查询内容 Node*p; if(!l->next)//若链表为空 { printf("\n=====>无!\n"); return; } printf("\n=====>1按编号查询=====>2按姓名查询=====>3按地址查询\n"); printf("请选择[1,2,3]:"); scanf("%d",&select); if(select==1)//按编号查询 { stringinput(searchinput,6,"请输入已存在的编号:"); p=Locate(l,searchinput,"num");//在l中查找学号为searchinput值的节点,并返回节点的指针 if(p)//若p!=NULL { printhead(); printdata(p); printf("按任意键返回"); } else printf("\n=====>找不到此人!\n"); } else if(select==2)//按姓名查询 { stringinput(searchinput,15,"请输入已存在的姓名:"); p=Locate(l,searchinput,"name"); if(p) { printhead(); printdata(p); printf(END); printf("按任意键返回"); } else printf("\n=====>找不到此人!\n"); } if(select==3)//按地址查询 { stringinput(searchinput,15,"请输入已存在的地址:"); p=Locate(l,searchinput,"address"); if(p) { printhead(); printdata(p); printf(END); printf("按任意键返回"); } else printf("\n=====>找不到此人!\n"); }elseprintf("\n**Error:输入错误!按任意键继续**\n");}//按姓名删除学生记录voidDel(Linkl){ Node*p,*r; charfindmess[20]; if(!l->next) { printf("\n=====>找不到此人的记录!\n"); return; } stringinput(findmess,15,"inputtheexistingpersonname"); p=Locate(l,findmess,"name"); if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next; free(p); printf("\n=====>deletesuccess!\n"); save=1; } else printf("\n=====>Notfindthisperson!\n"); }//修改电话记录,编号不能修改.voidModify(Linkl){ Node*p; charfindmess[20]; if(!l->next) { printf("\n=====>Nopersonrecord!\n"); return; }printf("modifypersonrecorder"); Disp(l); stringinput(findmess,6,"inputtheexistingpersonnumber:");//输入并检验该学号 p=Locate(l,findmess,"num");//查询到该节点 if(p) { printf("Number:%s,\n",p->data.num); printf("Name:%s,",p->); stringinput(p->,15,"inputnewname:"); stringinput(p->data.phone,12,"inputnewphonenumber:"); stringinput(p->data.address,10,"inputnewaddress:"); stringinput(p->data.email,20,"Email:"); printf("\n=====>modifysuccess!\n"); Disp(l); save=1; } else printf("\n=====>Notfindthisperson!\n"); }//数据存盘voidSave(Linkl){ FILE*fp; Node*p; fp=fopen("D:\\Contactbook","wb");//以只写方式打开二进制文件 if(fp==NULL)//打开文件失败 { printf("\n=====>openfileerror!\n"); return; } p=l->next; while(p) { if(fwrite(p,sizeof(Node),1,fp)==1)//每次写一条记录或一个节点信息至文件 { p=p->next; } else {break;} } save=0; fclose(fp);//关闭此文件}//主函数voidmain(){ Linkk;//定义链表FILE*fp1; intselect1;charch1;Node*p1,*r1;//定义记录指针变量k=(Node*)malloc(sizeof(Node)); if(!k) { printf("\napplyformemoryfailure");//如没有申请到,打印提示信息 return;//返回主界面 } k->next=NULL;r1=k; //以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件 fp1=fopen("D:\\Contactbook","ab+");if(fp1==NULL) { printf("\n=====>cannotopenfile!\n"); exit(0); } while(!feof(fp1)) { p1=(Node*)malloc(s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论