一、课题名称简易手机通讯录管理系统(线性表、查找、排序)二、主要内容简易手机通讯录管理系统的设计主要是实现对手机通讯录的管理和相关操作。
基本功能如下:(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▲输入错误!请重新选择:");elsebreak;}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;i<L->length;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(i<L->length&&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(m<L->length){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;i<L->length;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") ;i nt a;printf("★请输入您的选择(1 or 2):");scanf("%d",&a);switch(a){case 1:m=FindNum(L);if(m<L->length){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.sex,p.add);for(int j=0;j<L->length;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;i<L->length;i++){if(strcmp(L->data[i].name,name)==0){b++;}}if(b==0){printf("不存在该联系人!\n");}if(b==1){for(int i=0;i<L->length;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.sex,q.add);for(int j=0;j<L->length;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;i<L->length;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(n<L->length){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.sex,t.add);for(int i=0;i<L->length;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循环将该信息后面的信息依次向前覆盖达到删除功能。