为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

(简易手机通讯录管理系统)

2017-09-19 21页 doc 215KB 35阅读

用户头像

is_594886

暂无简介

举报
(简易手机通讯录管理系统)一、课题名称 简易手机通讯录管理系统(线性表、查找、排序) 二、主要内容 简易手机通讯录管理系统的设计主要是实现对手机通讯录的管理和相关操作。基本功能如下: (1)联系人信息录入、添加功能:包括手机号(此处用短号,5位,不能重复)、姓名、家庭住址的录入和添加。 (2)联系人信息查询功能:能①按手机号进行查询。②按联系人姓名进行查询。 (3)排序:①能按手机号升序进行排序;②能按姓名进行升序排序,姓名相同时按手机号从小到大进行排序 (4)联系人信息的修改、删除功能:①按手机号进行联系人信息的修改和删除。 ②按姓名进行联系人信息的...
(简易手机通讯录管理系统)
一、课题名称 简易手机通讯录管理系统(线性、查找、排序) 二、主要内容 简易手机通讯录管理系统的主要是实现对手机通讯录的管理和相关操作。基本功能如下: (1)联系人信息录入、添加功能:包括手机号(此处用短号,5位,不能重复)、姓名、家庭住址的录入和添加。 (2)联系人信息查询功能:能①按手机号进行查询。②按联系人姓名进行查询。 (3)排序:①能按手机号升序进行排序;②能按姓名进行升序排序,姓名相同时按手机号从小到大进行排序 (4)联系人信息的修改、删除功能:①按手机号进行联系人信息的修改和删除。 ②按姓名进行联系人信息的修改和删除,多个姓名时,再指定具体的号码。 (5)统计功能:统计自己的联系人有多少个。 三、课题设计的基本思想,原理和算法描述 (1)本次课程设计题目为简易手机通讯录管理系统,主要运用到线性表中顺序表的相关知识,以及顺序查找的思想和冒泡排序算法。 (2)界面设计 //菜单函数 int menu() {     int c;     printf("\n\n\t☆☆☆☆☆☆☆手机通讯录信息管理系统☆☆☆☆☆☆☆☆\n\n");     printf("**********************************************************************\n");     printf("            1.添加联系人信息\n");     printf("            2.查询联系人信息\n");     printf("            3.对联系人信息进行排序\n");     printf("            4.修改联系人信息\n");     printf("            5.删除联系人信息\n");     printf("            6.统计联系人个数\n");     printf("            0.退出信息管理系统\n");     printf("**********************************************************************\n\n");     printf("★请输入您的选择(0-6):");     while(1)     {         scanf("%d",&c);         if(c<0||c>6)             printf("\n▲输入错误!请重新选择:");         else             break;     }     return c; } //主函数 void main() {     SqList * L;     InitList(L);     system("color 3f");     while(1)     {         switch(menu())         {         case 1:system("cls");printf("\n\t\t\t信息的增加\n");ListAdd(L);break;         case 2:system("cls");printf("\n\t\t\t信息的查询\n");Search(L);break;         case 3:system("cls");printf("\n\t\t\t对信息进行排序\n");Paixu(L);break;         case 4:system("cls");printf("\n\t\t\t信息的修改\n");ListModify(L);break;         case 5:system("cls");printf("\n\t\t\t信息的删除\n");Delete(L);break;         case 6:system("cls");printf("\n\t\t\t统计联系人个数\n");ListLength(L);break;         case 0:printf("再见!\n");return;         default:printf("\n▲输入错误!请重新选择:");break;         }     } } (3)功能模块的实现 初始化顺序表 void InitList(SqList *&L)      {     L=(SqList *)malloc(sizeof(SqList));     L->length=0; } 增加信息函数。 定义变量a起标记作用,用于判断输入信息是否与已有信息重复 void ListAdd(SqList *&L)      //增加函数 {     int a=0;//标记     printf("1.号码(五位数字!):");scanf("%s",L->data[L->length].num);     printf("2.姓名:");scanf("%s",L->data[L->length].name);     printf("3.性别:");scanf("%s",L->data[L->length].sex);     printf("4.家庭住址:");scanf("%s",L->data[L->length].add);     for(int i=0;ilength;i++)//判断是否重号     {         if(strcmp(L->data[i].num,L->data[L->length].num)==0)         {             printf("该号码已经存在\n");             a=1;break;         }     }     if(a==0)     L->length++; } 查找符合条件的信息的下标并返回到需要调用的函数体中 int FindNum(SqList *&L) {     printf("★输入需要进行操作的号码:");     char num[10];     scanf("%s",num);     int i=0;     while(ilength&&strcmp(L->data[i].num,num)!=0)i++;     if(i>=L->length)     {         printf("不存在该联系人!\n");     }     return i; } ④查询信息函数 分两种情况:按号码查找与按姓名查找。由于号码唯一所以可以直接调用之前的查找下标函数。按姓名查找时则需要考虑到重名的情况,所以用一个for循环将所有符合条件的信息全部输出。 void Search(SqList *&L)    {     if(L->length==0)     {         printf("通讯录此时为空,无法进行查找!\n");     }     else     {         int m,i;         printf("***************************************************************\n");         printf("\t\t1.按联系人号码进行查询\n");         printf("\t\t2.按联系人姓名进行查询\n");         printf("***************************************************************\n");         int a;         printf("★请输入您的选择(1 or 2):");         scanf("%d",&a);         switch(a)         {         case 1:             m=FindNum(L);             if(mlength)             {                 printf("您查询的信息如下\n");                 printf("号码    姓名    性别    家庭住址\n");                 printf("%s    %s    %s    %s\n",L->data[m].num,L->data[m].name,L->data [m].sex,L->data[m].add);             }             break;         case 2:             printf("★输入需要进行操作的姓名:");             char name[20];             scanf("%s",name);             for( i=0;ilength;i++)             {                 if(strcmp(L->data[i].name,name)==0)                 {                     printf("号码    姓名    性别    家庭住址\n");                     printf("%s    %s    %s    %s\n",L->data[i].num,L->data[i].name,L->data [i].sex,L->data[i].add);                 }                 else                 {                     printf("不存在该联系人\n");                 }             }             break;         default:             printf("输入错误!");             break;         }     } } ⑤修改函数 按号码修改时先调用之前查找下标的函数,找到符合条件的信息后直接输入信息将原有信息覆盖。按姓名修改时当只有一个信息符合条件时与按号码修改算法一样,当出现重名情况时提示用户选择相应的号码再调用按号码修改的算法。每一次修改都进行一次判断,判断修改后的信息是否与表中已有信息重复。 void ListModify(SqList *&L)    {     if(L->length==0)     {         printf("通讯录此时为空,无法进行信息的修改!\n");     }     else     {         int m,n;         int b=0;                 printf("***************************************************************\n");         printf("\t\t1.按联系人号码进行修改\n");         printf("\t\t2.按联系人姓名进行修改\n");         printf("***************************************************************\n");         int a;         printf("★请输入您的选择(1 or 2):");         scanf("%d",&a);         switch(a)         {         case 1:             m=FindNum(L);           if(mlength)           {               Telphone p;               printf("号码    姓名    性别    家庭住址\n");               printf("%s    %s    %s    %s\n",L->data[m].num,L->data[m].name,L->data [m].sex,L->data[m].add);               printf("输入修改后的联系人信息:\n");               printf("号码    姓名    性别    家庭住址\n");               scanf("%s    %s    %s    %s",p.num ,p.name ,p.sex,p.add);               for(int j=0;jlength;j++)//判断是否重号               {                   if(strcmp(L->data[j].num,p.num)==0)                   {                       printf("修改失败!(该号码已经存在)\n");                       printf("重新输入修改后的联系人信息:\n");                       printf("号码    姓名    性别    家庭住址\n");                       scanf("%s    %s    %s    %s",L->data[m].num,L->data[m].name,L->data[m].sex,L->data[m].add);                       printf("\n");                       break;                     }                   else                   {                       L->data[m]=p;                   }               }           }           break;         case 2:             printf("★输入需要进行操作的姓名:");             char name[20];             int i;             scanf("%s",name);             for( i=0;ilength;i++)             {                 if(strcmp(L->data[i].name,name)==0)                 {                     b++;                 }             }             if(b==0)             {                 printf("不存在该联系人!\n");             }             if(b==1)             {                 for(int i=0;ilength;i++)                 {                     if(strcmp(L->data[i].name,name)==0)                     {                         Telphone q;                         printf("再次确认需要修改的信息:\n");                         printf("号码    姓名    性别    家庭住址\n");                         printf("%s    %s    %s    %s\n\n",L->data[i].num,L->data[i].name,L->data [i].sex,L->data[i].add);                         printf("★输入修改后的联系人信息:\n");                         printf("号码    姓名    性别    家庭住址\n");                         scanf("%s    %s    %s    %s",q.num ,q.name ,q.sex,q.add);                         for(int j=0;jlength;j++)//判断是否重号                         {                             if(strcmp(L->data[j].num,q.num)==0)                             {                                 printf("修改失败!(该号码已经存在)\n");                                 printf("重新输入修改后的联系人信息:\n");                                 printf("号码    姓名    性别    家庭住址\n");                                 scanf("%s    %s    %s    %s",L->data[i].num,L->data[i].name,L->data[i].sex,L->data[i].add);                                 printf("\n");                                   break;                             }                             else                             {                                 L->data[i]=q;                             }                         }                     }                 }             }             if(b>1)             {                 printf("符合条件的联系人有%d个!详细信息如下:\n",b);                 for(int i=0;ilength;i++)                 {                     if(strcmp(L->data[i].name,name)==0)                     {                         printf("号码    姓名    性别    家庭住址\n");                         printf("%s    %s    %s    %s\n",L->data[i].num,L->data[i].name,L->data [i].sex,L->data[i].add);                     }                 }                 printf("请根据以上显示出的信息选择对应的号码进行修改!\n");                 n=FindNum(L);                 if(nlength)                 {                     Telphone t;                     printf("号码    姓名    性别    家庭住址\n");                     printf("%s    %s    %s    %s\n",L->data[n].num,L->data[n].name,L->data [n].sex,L->data[n].add);                     printf("输入修改后的联系人信息:\n");                     printf("号码    姓名    性别    家庭住址\n");                     scanf("%s    %s    %s    %s",t.num ,t.name ,t.sex,t.add);                     for(int i=0;ilength;i++)//判断是否重号                     {                         if(strcmp(L->data[i].num,t.num)==0)                         {                             printf("修改失败!(该号码已经存在)\n");                             printf("重新输入修改后的联系人信息:\n");                             printf("号码    姓名    性别    家庭住址\n");                             scanf("%s    %s    %s    %s",L->data[n].num,L->data[n].name,L->data[n].sex,L->data[n].add);                             printf("\n");                             break;                         }                         else                         {                             L->data[n]=t;                         }                     }                 }             }             break;         default:             printf("输入错误!");             break;         }     } } ⑥删除函数 按号码删除时先查找到符合条件的信息,再用for循环将该信息后面的信息依次向前覆盖达到删除功能。按姓名删除信息时当出现重名情况时提示用户选择相应的号码再调用按号码删除的算法。 void Delete(SqList *&L)    //删除函数 {     if(L->length==0)     {         printf("通讯录此时为空,无法进行信息的删除!\n");     }     else     {         int m,n;         printf("***************************************************************\n");         printf("\t\t1.按联系人号码进行删除\n");         printf("\t\t2.按联系人姓名进行删除\n");         printf("***************************************************************\n");         int a;int b=0;         printf("★请输入您的选择(1 or 2):");         scanf("%d",&a);         switch(a)         {         case 1:             m=FindNum(L);             if(mlength)             {                 for(int j=m;jlength-1;j++)                 {                     L->data[j]=L->data[j+1];                 }                 printf("信息已删除\n");                 L->length --;             }             break;         case 2:             printf("★输入需要进行操作的姓名:");             char name[20];             int i;             scanf("%s",name);             for( i=0;ilength;i++)             {                 if(strcmp(L->data[i].name,name)==0)                 {                     b++;                 }             }             if(b==0)             {                 printf("不存在该联系人!\n");             }             if(b==1)             {                 for( i=0;ilength;i++)                 {                     if(strcmp(L->data[i].name,name)==0)                     {                         printf("号码    姓名    性别    家庭住址\n");                         printf("%s    %s    %s    %s\n",L->data[i].num,L->data[i].name,L->data [i].sex,L->data[i].add);                         if(ilength)                         {                             for(int j=i;jlength-1;j++)                             {                                 L->data[j]=L->data[j+1];                             }                             printf("信息已删除\n");                             L->length --;                         }                     }                 }             }             if(b>1)             {                 printf("符合条件的联系人有%d个!详细信息如下:\n",b);                 for( i=0;ilength;i++)                 {                     if(strcmp(L->data[i].name,name)==0)                     {                         printf("号码    姓名    性别    家庭住址\n");                         printf("%s    %s    %s    %s\n",L->data[i].num,L->data[i].name,L->data [i].sex,L->data[i].add);                     }                            }                 printf("请根据以上显示出的信息选择对应的号码进行删除!\n");                 n=FindNum(L);                 if(nlength)                 {                     for(int j=n;jlength-1;j++)                     {                         L->data[j]=L->data[j+1];                     }                     printf("信息已删除\n");                     L->length --;                 }             }             break;         default:             printf("输入错误!");             break;         }     } } ⑦排序函数 采用冒泡排序的思想对号码进行排序。按姓名排序时若出现重名则按号码排序,算法体现在PaixuName函数中,先进行号码排序再进行姓名排序。 void PaixuNum(SqList *&L) {     if(L->length ==0)     {         printf("通讯录为空\n");     }     else     {         int i,j;         Telphone t;         for(i=0;ilength-1;i++)            {             for(j=L->length-1;j>i;j--)             {                 if(strcmp(L->data[j].num,L->data[j-1].num)<0)                 {                     t=L->data[j];                     L->data[j]=L->data[j-1];                     L->data[j-1]=t;                 }             }         }         printf("按号码排序为:\n");         printf("号码\t姓名\t性别\t家庭住址\n");         for(i=0;ilength;i++)         {             printf("%s\t%s\t%s\t%s\n",L->data[i].num,L->data[i].name,L->data[i].sex,L->data[i].add);         }     } } void PaixuName(SqList *&L) {     if(L->length ==0)         printf("通讯录为空\n");     else     {         int i,j;         Telphone t;                 for(i=0;ilength-1;i++)            {             for(j=L->length-1;j>i;j--)             {                 if(strcmp(L->data[j].num,L->data[j-1].num)<0)                 {                     t=L->data[j];                     L->data[j]=L->data[j-1];                     L->data[j-1]=t;                 }             }         }         for(i=0;ilength-1;i++)            {             for(j=L->length-1;j>i;j--)             {                 if(strcmp(L->data[j].name,L->data[j-1].name)<0)                 {                     t=L->data[j];                     L->data[j]=L->data[j-1];                     L->data[j-1]=t;                 }             }         }         printf("按联系人姓名排序为:\n");         printf("姓名\t号码\t性别\t家庭地址\n");       for(i=0;ilength;i++)       {           printf("%s\t%s\t%s\t%s\n",L->data[i].name,L->data[i].num,L->data[i].sex,L->data[i].add);       }     } } void Paixu(SqList *&L) {     if(L->length==0)     {         printf("通讯录此时为空,无法进行信息的排序!\n");     }     else     {         int a;         printf("***************************************************************\n");         printf("\t\t1.按联系人号码进行排序\n");         printf("\t\t2.按联系人姓名进行排序\n");         printf("***************************************************************\n");         printf("★请输入您的选择(1 or 2):");         scanf("%d",&a);         switch(a)         {         case 1:PaixuNum(L);break;         case 2:PaixuName(L);break;         default:printf("输入错误!");break;         }     } } ⑧统计函数 直接返回顺序表的长度 void ListLength(SqList *&L) {     printf("联系人总数为:%d\n",L->length ); } (4)流程图 初始化顺序表 添加信息 按姓名查询 按姓名删除 按姓名修改 按号码删除 按号码修改 按姓名排序 按号码排序 按号码查询 统计信息 删除信息 修改信息 信息排序 查询信息 图1 设计框架图 四、运行示例及结果 图2 主界面 图3 增加信息界面 图4 姓名不唯一出现错误提示 图5 按号码查询界面 图6 重名查询界面 图7 按姓名查询界面 图8 按号码进行排序界面 图9 按姓名进行排序界面 图10 按号码进行修改界面 图11 按姓名进行修改界面 图12 修改时出现重名情况再选择号码修改 图13 修改出现错误时的界面 图14 按号码进行删除界面 图15 按号码进行删除界面 图16 出现重名选择号码进行删除界面 图17 统计联系人个数界面 五、调试和运行程序过程中产生的问题及采取的措施 问题1:查找不能运行 解决:查找函数体没有出错,而是定义变量num时所给的空间过小,以为输入5个数字则定义为num[5],忽略数组本身自带’\0’占据一个位置,将数组大小改为10问题就解决了。 问题2:出现重名情况时不能输出所有符合条件的信息 解决:开始时和按号码查找一样是先定义一个函数查找符合条件的信息并返回该信息的下标。但这样只能返回一个符合条件的信息,当出现重名情况时不能全部输出,所以我改在查询函数中用一个for循环将所有符合条件的全部输出。 问题3:对于按姓名进行联系人信息的修改和删除,多个姓名时,再指定具体的号码这一要求存在不解且不知该如何解决。 解决:刚开始的想法是将所有符合条件的信息全部存储到一个栈内,然后通过进栈出栈实现该功能,但是最终没有能够实现。所以我换了一个思路,运用一个for循环先计算出顺序表中所有符合条件的信息的个数,用变量bl来计数标志。当b为0或1时则按照最原始的进行修改,当b大于1时首先显示出符合条件的所有信息,并提示用户选择显示出的号码,接着直接调用按号码进行修改的算法。 问题4:修改信息后的信息如果与已有信息重复给出错误提示 解决:开始用一个for循环把刚修改过的信息的号码与线性表中的所有信息进行比较,若存在重复则提示错误,但运行后发现无论输入的修改信息是什么都会显示错误提示,后明白修改后的信息已存储到顺序表中,所以在进行信息比较时总会出现重名的情况。后在请教同学的基础上对这一部分代码进行了改动,新定义了一个结构体对象,先将修改的信息存储到该变量中,再用该变量的信息与顺序表中的信息进行比较,如果有重复则显示错误提示,否则将该变量的信息重新复制给需要修改信息的变量。 问题5:按姓名进行升序排序,姓名相同时按手机号从小到大进行排序 解决:用的是冒泡法排序的算法,开始理所当然的先进行姓名排序再进行号码排序,但运行结果并不是想象中那样,之后自己举了几个简单的例子在草稿纸上进行算法的演示,渐渐的明白出现错误的原因,也找到了解决方法,即先进行号码排序在再进行姓名排序。 六、总结   本次课程设计的题目是简易手机通讯录管理系统,其基本思想与算法框架和第一次上机作业的学生信息管理系统基本一致,所以我开始时就直接套用当时作业的程序,只是修改了其中一些相关变量的定义。不过虽然有这样一个相对比较好的基础还是在实现过程中遇到了不少困难,主要有五个方面的问题,问题以及我采取的解决措施在的第五项中已经详细写出。时间方面由于中间有一个元旦长假所以大部分内容都得靠自己去想去写,不像平日可以很方便的向老师同学请教,但同时又很庆幸有这样一个机会可以让自己好好总结自己所学的知识。这次课程设计主要是完成了老师给出的任务,自己新添的不是很多,主要体现在修改信息时对修改后的信息进行重复判断以及界面的设计上,此外当出现重名情况时再根据号码修改这一块我并不是按照固有的思维去执行,即将所有符合条件的信息存储到一个地方再调用,而是相当于偷了个懒将问题抛给用户,给出提示让用户自己输入已经显示出的信息中的号码进行二次修改。但自己明白是因为自己对那一方面的知识不够熟悉所以才不能完全掌握运用。这次课程设计与平日作业的不同主要在于需要考虑的细节比较多,所以这也锻炼了自己做事的谨慎程度以及想问题的全面性。当然程序中仍存在不少不足之处,这就警示自己需要学习的还有很多很多。 七、参考文献 [1] 李春葆等著.数据结构教程(第三版).清华大学出版社,2009 [2] 滕国文著.数据结构课程设计.清华大学出版社,2010.9
/
本文档为【(简易手机通讯录管理系统)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索