c语言通 讯 录管理系统课程设计.doc_第1页
c语言通 讯 录管理系统课程设计.doc_第2页
c语言通 讯 录管理系统课程设计.doc_第3页
c语言通 讯 录管理系统课程设计.doc_第4页
c语言通 讯 录管理系统课程设计.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

课程名称:数据结构课程设计一、基本要求1、设计合适的数据结构存储朋友、分组信息,将friend.txt与group.txt中的内容导入其 中。记录包括:编号,姓名,性别,生日,电话号码1,电话号码2,电话号码3,住址与分组。2、能实现插入、删除、修改和查询操作。其中查询可按姓名,拼音或电话查询。3、能实现多条件查询。4、最后把系统中的数据保存回相应的文件中。2、 解题思路 根据题目要求,1、 键盘式选择菜单实现功能选择。2、 通讯录数据以文本文件存储,故应提供文件的输入输出等操作。将保存在txt文件中的数据读取出来并设计合适的链表(有头结点的单链表)用来存储数据。3、 利用链表进行通讯录记录的插入,查找,修改,删除等操作。4、 查找可通过姓名,拼音电话号码进行查找。5、 修改和删除均建立在查找的基础之上。6、 实现多条件查找。7、 通讯录分组信息同理。利用单链表存储,从而进行显示、查找、删除等操作。8、 退出:即将通讯录及分组信息保存到文件之后,再退出到管理系统。3、 算法描述1、 建表:通讯录成员信息表及分组信息表尾插法建带头结点的通讯录链表createF();根据文本文件中数据的存储结构用fscanf()一条一条的读取数据;并将读取出来的数据赋给链表的结点;使Flag=1,即表示通讯录已经建立;通讯录成员分组信息表createG()同理;2、 显示通讯录已有成员信息从链表中读取并按照一定结构输出outputF( );3、 添加通讯录成员信息向通讯录中添加某人通讯信息的子函数insertF( );链表结点的插入,按编号次序有序插入使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。4、 查找通讯录成员信息查找模块search( ):在通讯录中查找某人通讯信息的子函数输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。如果查找成功,则输出查找到的通讯者信息,返回p。若查找失败,则输出查找失败,返回p。5、 修改通讯录成员信息利用查找函数查找到需要修改的结点,进行修改。6、 删除通讯录成员信息利用查找函数查找到需要修改的结点,进行删除。7、 多条件查询通讯录成员信息关键词类型分为:姓名,性别,地址,分组四种;选择第一个关键词类型之后,进行相关查询;之后第二个关键词,不需要输入相应类型,而是根据输入数据之间的差别进行匹配,从而进行相关的查询操作;8、 显示已有通讯录成员分组信息原理同outputF( );9、 添加通讯录成员分组信息原理同insertF( );10、 删除通讯录成员分组信息原理同DeleteF( );11、退出通讯录管理系统4、 程序设计1、 本程序中所有用到的数据结构定义/ Group的单链表存储结构struct GroupInfo int Gnum; char Gname20; ; struct Group struct GroupInfo GInfo; Group *next; ; typedef Group *GInfoList; / Friend的单链表存储结构 struct FriendInfo char Fnum5; char Fname8; char sex3; char birthday11; char telephone112; char telephone212; char telephone39; char addr20; struct GroupInfo FGInfo; ; struct Friend struct FriendInfo FInfo; Friend *next; ;typedef Friend *FInfoList; 2、 基本操作建表:通讯录成员信息表及分组信息表/*尾插法建带头结点的通讯录链表createF()*/FInfoList createF()FILE *pRead,*pWrite;int nCount=0;FInfoList head=(Friend *)malloc(sizeof(Friend); /*申请头结点*/Friend *p,*rear;rear=head;pRead=fopen(Ffilename,r);if(NULL=pRead)exit(0);pWrite=fopen(friend_bin.txt,wb);if(NULL = pWrite)fclose(pRead);exit(0);while(!feof(pRead)p=(Friend *)malloc(sizeof(Friend);fscanf(pRead,%s %s %s %s %s %s %s %s %dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,&p-FInfo.FGInfo.Gnum);fwrite(p,sizeof(struct Friend),1,pWrite);/printf(%st%st%st%st%st%snn%st%st%dnn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.groupnum);rear-next=p;rear=p;fclose(pRead);fclose(pWrite);Fflag=1;rear-next=NULL;return head;/*尾插法建带头结点的通讯录成员分组信息表链表createG()*/GInfoList createG()FILE *gRead,*gWrite;int gCount=0;GInfoList head=(Group *)malloc(sizeof(Group); /*申请头结点*/Group *p,*rear;rear=head;gRead=fopen(Gfilename,r);if(NULL=gRead)exit(0);gWrite=fopen(group_bin.txt,wb);if(NULL = gWrite)fclose(gRead);exit(0);while(!feof(gRead)p=(Group *)malloc(sizeof(Group);fscanf(gRead,%d %sn,&p-GInfo.Gnum,p-GInfo.Gname);fwrite(p,sizeof(struct Group),1,gWrite);rear-next=p;rear=p;fclose(gRead);fclose(gWrite);Gflag=1;rear-next=NULL;return head;显示通讯录已有成员信息/*输出模块outputF( ):输出通讯录中联系人通讯信息的子函数*/void outputF(FInfoList Fhead)Friend *p;p=Fhead-next;printf(nn%20sn,通 讯 录);printf(n编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p!=NULL)printf(%st%st%st%st%st%snn%st%st%dnn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); p=p-next;添加通讯录成员信息/*添加模块insertF( ):向通讯录中添加某人通讯信息的子函数*/链表结点的插入,按编号次序有序插入/使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。/循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。void insertF(FInfoList Fhead,Friend *Fp)Friend *p1,*p2;p1=Fhead;p2=p1-next;while(p2!=NULL&strcmp(p2-FInfo.Fnum,Fp-FInfo.Fnum)next; /p2指向下一个结点p1-next=Fp; /插入p所指向的结点Fp-next=p2; 查找通讯录成员信息/*查找模块search( ):在通讯录中查找某人通讯信息的子函数*/输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。/如果查找成功,则输出查找到的通讯者信息,返回p。/若查找失败,则输出查找失败,返回p。/把汉字转化为拼音缩写的函数,如李勇-lybool In(wchar_t start, wchar_t end, wchar_t code)if (code = start & code = end)return true;return false;char convert(wchar_t n)if (In(0xB0A1,0xB0C4,n) return a;if (In(0XB0C5,0XB2C0,n) return b;if (In(0xB2C1,0xB4ED,n) return c;if (In(0xB4EE,0xB6E9,n) return d;if (In(0xB6EA,0xB7A1,n) return e;if (In(0xB7A2,0xB8c0,n) return f;if (In(0xB8C1,0xB9FD,n) return g;if (In(0xB9FE,0xBBF6,n) return h;if (In(0xBBF7,0xBFA5,n) return j;if (In(0xBFA6,0xC0AB,n) return k;if (In(0xC0AC,0xC2E7,n) return l;if (In(0xC2E8,0xC4C2,n) return m;if (In(0xC4C3,0xC5B5,n) return n;if (In(0xC5B6,0xC5BD,n) return o;if (In(0xC5BE,0xC6D9,n) return p;if (In(0xC6DA,0xC8BA,n) return q;if (In(0xC8BB,0xC8F5,n) return r;if (In(0xC8F6,0xCBF0,n) return s;if (In(0xCBFA,0xCDD9,n) return t;if (In(0xCDDA,0xCEF3,n) return w;if (In(0xCEF4,0xD188,n) return x;if (In(0xD1B9,0xD4D0,n) return y;if (In(0xD4D1,0xD7F9,n) return z;return 0;char* TransformToSpell(char name)char chr3;wchar_t wchr = 0;char* Spell = new charstrlen(name)/2;memset(Spell, 0x00, sizeof(char)*strlen(name)/2+1);for (unsigned int i = 0, j = 0; i (strlen(name)/2); +i)memset(chr, 0x00, sizeof(chr);chr0 = namej+;chr1 = namej+;chr2 = 0;wchr = 0;wchr = (chr0 & 0xff) next;scanf(%d,&m);if(m=1)printf(n请输入要查找的姓名:); scanf(%s,namekey);int flag=0; /判断是否找到 int i=0,count=0;char num205;while(p)if(strcmp(namekey,p-FInfo.Fname)=0) flag=1; strcpy(numi,p-FInfo.Fnum); i+; count+;p=p-next;if(flag=0) printf(n对不起,通讯簿中没有此人的记录。n);if(flag=1) printf(n已查到%d条记录,分别为:nn,count);p=Fhead-next;i=0;printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p)if(strcmp(numi,p-FInfo.Fnum)=0) printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); i+; p=p-next;else if(m=3)printf(n请输入要查找的电话号码:); scanf(%s,telephonekey);if(strlen(telephonekey)=11) while(p&strcmp(telephonekey,p-FInfo.telephone1)!=0&strcmp(telephonekey,p-FInfo.telephone2)!=0)p=p-next;if(strlen(telephonekey)=8) while(p&strcmp(telephonekey,p-FInfo.telephone3)!=0)p=p-next;if(p=NULL) printf(n对不起,通讯簿中没有此人的记录。n);if(p!=NULL) printf(n已查到,记录为:nn); printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn); printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum);else if(m=2) printf(n输入要查找联系人的姓名缩写:); scanf(%s,namespell);int flag=0; /判断是否找到 int i=0,count=0;char num205;while(p)if(strcmp(namespell,TransformToSpell(p-FInfo.Fname)=0) flag=1; strcpy(numi,p-FInfo.Fnum); i+; count+;p=p-next;if(flag=0) printf(n对不起,通讯簿中没有此人的记录。n);if(flag=1) printf(n已查到%d条记录,分别为:nn,count);p=Fhead-next;i=0;printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p)if(strcmp(numi,p-FInfo.Fnum)=0) printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); i+; p=p-next;修改通讯录成员信息/*修改模块modify( ):在通讯录中修改某人通讯信息的子函数*/void modify(FInfoList Fhead)char ch;char kind10,NewInfo15;Friend *p;char namekey8;char telephonekey12;char namespell5;int m;printf(n请选择(1:按姓名查找 2:按姓名首字母拼音查找 3:按电话查找):);p=Fhead-next;scanf(%d,&m);if(m=1)printf(n请输入要查找的姓名:); scanf(%s,namekey);int flag=0; /判断是否找到 int i=0,count=0;char num205;while(p)if(strcmp(namekey,p-FInfo.Fname)=0) flag=1; strcpy(numi,p-FInfo.Fnum); i+; count+;p=p-next;if(flag=0) printf(n没有找到要修改的通讯者!n);if(flag=1) printf(n已查到%d条记录,分别为:nn,count);p=Fhead-next;i=0;printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p)if(strcmp(numi,p-FInfo.Fnum)=0) printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); i+; p=p-next; char num25;p=Fhead-next;printf(n请输入所要修改的通讯者的编号:);scanf(%s,num2);while(p)if(strcmp(num2,p-FInfo.Fnum)=0) printf(n真的要修改该结点吗?(是:y 否:n):);scanf(%s,&ch);while(ch=y)int i=0,n;int flag=0;printf(n请输入所需修改的信息类别:);scanf(%s,kind);if(strcmp(kind,编号)=0) printf(n请输入所需修改的通讯信息:); /杨颖 性别 男scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); while(NewInfoi!=0) if(NewInfoi=0&NewInfoiFInfo.Fnum,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,姓名)=0)printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); if(n8) printf(输入的姓名格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.Fname,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,性别)=0)printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); if(n2) printf(输入的性别格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.sex,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,生日)=0) printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); while(NewInfoi!=0) if(NewInfoi=0&NewInfoiFInfo.birthday,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,电话号码1)=0) printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); if(n1) printf(n输入的电话号码尾数不足或者格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.telephone1,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,电话号码2)=0)printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo);if(n1) printf(输入的电话号码尾数不足或者格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.telephone2,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,电话号码3)=0)printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); if(n1) printf(输入的电话号码尾数不足或者格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.telephone3,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,住址)=0) printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);strcpy(p-FInfo.addr,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,分组)=0) printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);p-FInfo.FGInfo.Gnum=atoi(NewInfo);printf(修改成功!n);return;elseprintf(输入有误!是否重新输入?(是:y 否:n):n);scanf(%s,&ch); p=p-next;else if(m=3)printf(n请输入要查找的电话号码:); scanf(%s,telephonekey);if(strlen(telephonekey)=11) while(p&strcmp(telephonekey,p-FInfo.telephone1)!=0&strcmp(telephonekey,p-FInfo.telephone2)!=0)p=p-next;if(strlen(telephonekey)=8) while(p&strcmp(telephonekey,p-FInfo.telephone3)!=0)p=p-next;if(p=NULL) printf(n对不起,通讯簿中没有此人的记录。n);if(p!=NULL) printf(n已查到,记录为:nn); printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn); printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum);else if(m=2) printf(n输入要查找联系人的姓名缩写:); scanf(%s,namespell);int flag=0; /判断是否找到 int i=0,count=0;char num205;while(p)if(strcmp(namespell,TransformToSpell(p-FInfo.Fname)=0) flag=1; strcpy(numi,p-FInfo.Fnum); i+; count+;p=p-next;if(flag=0) printf(n对不起,通讯簿中没有此人的记录。n);if(flag=1) printf(n已查到%d条记录,分别为:nn,count);p=Fhead-next;i=0;printf(编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p)if(strcmp(numi,p-FInfo.Fnum)=0) printf(%st%st%st%st%st%snn%st%st%dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); i+; p=p-next;char num25;p=Fhead-next;printf(n请输入所要修改的通讯者的编号:);scanf(%s,num2);while(p)if(strcmp(num2,p-FInfo.Fnum)=0) printf(n真的要修改该结点吗?(是:y 否:n):);scanf(%s,&ch);while(ch=y)int i=0,n;int flag=0;printf(n请输入所需修改的信息类别:);scanf(%s,kind);if(strcmp(kind,编号)=0) printf(n请输入所需修改的通讯信息:); /杨颖 性别 男scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); while(NewInfoi!=0) if(NewInfoi=0&NewInfoiFInfo.Fnum,NewInfo);printf(修改成功!n);return;else if(strcmp(kind,姓名)=0)printf(n请输入所需修改的通讯信息:);scanf(%s,NewInfo);while(flag=0)n=strlen(NewInfo); if(n8) printf(输入的姓名格式错误!n); printf(请重新输入:); scanf(%s,NewInfo);else flag=1;strcpy(p-FInfo.Fname,NewI

温馨提示

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

评论

0/150

提交评论