当前位置:文档之家› 学生通讯录管理系统

学生通讯录管理系统

数据结构课程设计报告项目名称:学生通讯录管理系统学号:班级:姓名:指导老师:计算机科学与技术2014年12月19日1.问题描述:通讯录管理系统一般包括通讯者的各种信息,这些信息应该包括学号,姓名,性别,电话,QQ,住址等。

而对其一般进行的操作有插入、删除、查询、修改、输出等操作功能,可以将输入的数据保存在文本文件中,并可以将其调出使用。

2.设计思路:通讯录管理系统所要进行的插入、删除、查询、修改、输出这五种功能会牵扯到数据的移动,所以应选择链式存储结构比较简单。

采用链表对其进行操作,至少需要6个子函数,及链表的建立、插入、删除、查询、修改、输出。

另外为了系统的美观简单,还应该设置一个主控菜单,所以程序需要7个子函数。

由于通讯录中涉及到的信息量较大,输入时较繁琐,所以需要加入文件的操作。

3.数据结构定义:采用了结构体数据类型,定义了7个字符型数组。

struct record {char numb[11];char name[9];char sex[3];char phone[12];char addr[31];char postcode[6];char qq[12];}student[500];4.系统功能模块介绍:(1)顶层主控菜单设计:①设计菜单内容程序运行后,给出八个菜单项的内容和输入提示。

0.通讯录表的记录输入;1.通讯录链表的建立;2.通讯录链表的插入;3.通讯录链表的删除;4.通讯录链表的查询;5.通讯录链表的修改;6.通讯录链表的输出;7.通讯录链表的保存;8.退出管理系统;请选择0—8;②实现循环和功能选择假设输入选择用变量sn存储,它作为menu_select函数的返回值提供给switch语句,使用for循环实现重复选择,并在主函数main()中实现。

实际使用时,只有选择大于8或小于0,程序才能运行结束,这就要使用循环控制,这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用return语句即可,也可以使用exit(0);语句。

③得到sn的合理值如前所示,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便提供给switch语句使用。

对于sn输入值,在switch中case语句0-8,对于不符合要求的输入,提示输入错误并要求重新输入。

该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。

(2)功能模块函数设计这里的设计是以前面设计的菜单为基础,增加菜单项的处理功能。

该系统用下面八个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。

下面八个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。

记录输入:adduser();使用其他函数调用此函数,已实现通讯录链表中记录的输入和插入。

创建:creat();用fopen()建立一个文本文件,然后在for 循环用fwrite ()向其中写入数据(例如,向文件中输入“姓名”,“学号”等),并对文件进行命名,再调用adduser()函数对其进行记录的输入。

插入:可以添加通讯录记录,利用C语言文件,向文件中按顺序输入学号、姓名、性别、电话、地址、邮编、QQ,再用fclose()函数关闭并保存文件。

删除:输入你要删除的人的电话后,系统会自动删除他(她)的记录,在删除通过for语句满足提示你确认删除的功能,只有等你确认删除后才会删除。

查找:这里提供了三种查询方式,按姓名、电话、地址查找,分别按提示输入1、2、3,以选择要查询的方式。

这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。

修改:输入你要修改的那个人的学号后,这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到个人的记录后,会显示他(她)的记录,然后通过调用devise()函数来依次输入他(她)的相关信息来替代以前的记录。

输出:也是用通过循环依次输出文件中的数据,第一次输出一个记录,按任意键继续输出,直到所有记录输出完毕后,按任意键返回上级菜单。

保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。

5.运行与调试分析:第一次运行程序时出现了很多错误,根据提示及时修改了语法错误,再次运行程序时,程序的查询函数产生了错误,无法正常查询文件中的记录信息,经过反复琢磨,翻阅相关书籍,这个问题得到了解决,但仍有不足之处。

输入0:输入1:输入2:输入3:输入“n”输入4:①输入1:②输入2:输入3:输入5:输入6:6.体会:这个课题是设计一个学生通讯录管理系统,该通讯系统能够较好的管理好我们的通讯录记录,也拥有比较完善的功能,但是该系统依旧有漏洞,比如无法对输入字符的正确性进行判断,如:地址输入123456也不会提示输入错误。

姓名输入11111也不会提示输入错误,所以在程序中还是有缺陷的。

在编写过程中,我逐步的了解了程序模块化设计的思想含义。

在整个程序设计的过程中语法的错误还是比较容易检查的,但是对于那些逻辑思维的问题方面的缺陷不易查出,因此常常出现系统提示没有错误但是仍然不能够正常运行的境况,尽管有很多不足之处,但我在整个系统程序设计的过程中,回顾复习了以前所学的知识,对数据结构中的链表操作和C程序较之以前有了能更多地了解和掌握。

此外编程是一项高精度的工作,所以我们要有规范化,标准化的代码编写习惯,良好的编写习惯,不但有助于代码的纠错,也有助于不同人员之间的协作。

我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大的避免重复性的工作。

另外我们要重视程序的算法,在程序中,算法是灵魂,我们要努力学习各种先进的算法,提高自己的编程能力。

主程序系统:#include<stdio.h>#include<string.h>#include<stdlib.h>#include <conio.h>#include<windows.h>#define null 0struct record {char numb[11];char name[9];char sex[3];char phone[12];char addr[31];char postcode[6];char qq[12];}student[500];int num=0;FILE *fp;//函数说明int menu_select();//菜单选择int creat();//链表创建int insert();//插入int del();//删除int search();//查询int change();//修改int devise();//选择修改int list();//显示int save();//文件保存//主函数void main(){system("color 9E");for(;;){switch(menu_select()){case 0:adduser();break; case 1:creat();break; case 2:insert();break; case 3:del();break;case 4:search();break;case 5:change();break; case 6:list();break;case 7:save();break;case 8:exit(0);}}}/********************//*菜单选择函数程序*/int menu_select(){int a;system("cls");printf("\t\t 通讯录管理系统\n");printf("\t\t====================================\n"); printf("\t\t 0.通讯录记录的输入\n");printf("\t\t 1.通讯录链表的建立\n");printf("\t\t 2.通讯录链表的插入\n");printf("\t\t 3.通讯录链表的删除\n");printf("\t\t 4.通讯录链表的查询\n");printf("\t\t 5.通讯录链表的修改\n");printf("\t\t 6.通讯录链表的输出\n");printf("\t\t 7.通讯录链表的保存\n");printf("\t\t 8.退出管理系统\n");printf("\t\t====================================\n"); printf("\t\t 请选择0-8:\n");for(;;){scanf("%d",&a);if(a<0||a>8)printf("\n\t输入错误,重选0-8");elsebreak;}return a;}/********************//********************//*通讯录表的记录输入*/adduser(){printf("\n\t\t**************** 请输入用户信息****************\n");printf("\n\t\t输入学号:");scanf("%s",&student[num].numb);printf("\n\t\t输入姓名:");scanf("%s",&student[num].name);printf("\n\t\t输入性别:");scanf("%s",&student[num].sex);printf("\n\t\t输入电话号码:");scanf("%s",&student[num].phone);printf("\n\t\t输入地址:");scanf("%s",&student[num].addr);printf("\n\t\t输入邮编:");scanf("%s",&student[num].postcode);printf("\n\t\t输入qq:");scanf("%s",&student[num].qq);num++;printf("\n\t\t是否继续添加?(Y/N):");if (getch()=='y')adduser();return(0);}/********************//********************//*通讯录链表的建立*/creat(){int i;if ((fp=fopen("student.txt","wb"))==NULL){printf("\n\t\t文件打开失败");}for (i=0;i<num;i++){if (fwrite(&student[i],sizeof(struct record),1,fp)!=1){printf("\n\t\t写入文件错误!\n");}printf("\n\t\t**************** 请输入用户信息****************\n");printf("\n\t\t输入学号:");scanf("%s",&student[num].numb);printf("\n\t\t输入姓名:");scanf("%s",&student[num].name);printf("\n\t\t输入性别:");scanf("%s",&student[num].sex);printf("\n\t\t输入电话号码:");scanf("%s",&student[num].phone);printf("\n\t\t输入地址:");scanf("%s",&student[num].addr);printf("\n\t\t输入邮编:");scanf("%s",&student[num].postcode);printf("\n\t\t输入qq:");scanf("%s",&student[num].qq);num++;printf("\n\t\t是否继续添加?(Y/N):");if (getch()=='y')adduser();return(0);}fclose(fp);printf("\n\t\t通讯录文件已保存");printf("\n\t\t按任意键退出程序\n\t\t"); exit(0);return(0);}/********************//********************//*通讯录链表的插入*/insert(){int i;if ((fp=fopen("1.txt","wb"))==NULL){printf("\n\t\t文件打开失败");}for (i=0;i<num;i++){if (fwrite(&student[i],sizeof(struct record),1,fp)!=1) {printf("\n\t\t写入文件错误!\n");}printf("\n\t\t**************** 请输入用户信息****************\n");printf("\n\t\t输入学号:");scanf("%s",&student[num].numb);printf("\n\t\t输入姓名:");scanf("%s",&student[num].name);printf("\n\t\t输入性别:");scanf("%s",&student[num].sex);printf("\n\t\t输入电话号码:");scanf("%s",&student[num].phone);printf("\n\t\t输入地址:");scanf("%s",&student[num].addr);printf("\n\t\t输入邮编:");scanf("%s",&student[num].postcode);printf("\n\t\t输入qq:");scanf("%s",&student[num].qq);num++;printf("\n\t\t是否继续添加?(Y/N):");if (getch()=='y')adduser();return(0);}fclose(fp);printf("\n\t\t通讯录文件已保存");printf("\n\t\t按任意键退出程序\n\t\t"); exit(0);return(0);}/********************//********************//*通讯录链表的删除*/del(){int i,j;int deletemark=0;char phone[12];printf("\n\t\t请输入要删除用户电话号码:"); scanf("%s",phone);if(num==0){printf("\n\t\t对不起,文件中无任何纪录"); printf("\n\t\t按任意键返回主菜单");getch();return;}for (i=0;i<num;i++){if (strcmp(student[i].phone,phone)==0){printf("\n\t\t以下是您要删除的用户纪录:");printf("\n\t\t学号: %s",student[i].numb);printf("\n\t\t姓名: %s",student[i].name);printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\tqq: %s",student[i].qq);printf("\n\t\t是否删除?(y/n)");if (getch()=='y'){for (j=i;j<num-1;j++)student[j]=student[j+1];num--;deletemark++;printf("\n\t\t删除成功");printf("\n\t\t是否继续删除?(y/n)");if (getch()=='y')del();return;}elsereturn;}continue;}if (deletemark==0){printf("\n\t\t没有该用户的纪录"); printf("\n\t\t是否继续删除?(y/n)"); if (getch()=='y')del();return;}}/********************//********************//*通讯录链表的查询*/search(){int m;printf("\t\n请选择查询方式:\n");printf("\t┌──────┐\n");printf("\t│1------姓名│\n");printf("\t│2------电话│\n");printf("\t│3------地址│\n");printf("\t│4------返回│\n");printf("\t└──────┘\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3&&m!=4){printf("输入错误,请重新选择:");scanf("%d",&m);}if(m==1){int i,j;int deletemark=0;char name[12];printf("\n\t\t请输入要查询的姓名:");scanf("%s",name);if(num==0){printf("\n\t\t对不起,文件中无任何纪录"); printf("\n\t\t按任意键返回主菜单");getch();return;}for (i=0;i<num;i++){if (strcmp(student[i].name,name)==0){printf("\n\t\t以下是您要查询的用户纪录:");printf("\n\t\t学号: %s",student[i].numb);printf("\n\t\t姓名: %s",student[i].name);printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\tqq: %s",student[i].qq);}if (deletemark==0){printf("\n\t\t是否继续查询?(y/n)");if (getch()=='y')search();return;}}}if(m==2){int i,j;int deletemark=0;char phone[12];printf("\n\t\t请输入要查询的电话:");scanf("%s",phone);if(num==0){printf("\n\t\t对不起,文件中无任何纪录"); printf("\n\t\t按任意键返回主菜单");getch();return;}for (i=0;i<num;i++){if (strcmp(student[i].phone,phone)==0){printf("\n\t\t以下是您要查询的用户纪录:"); printf("\n\t\t学号: %s",student[i].numb); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\tqq: %s",student[i].qq);}if (deletemark==0){printf("\n\t\t是否继续查询?(y/n)");if (getch()=='y')search();return;}}}if(m==3){int i,j;int deletemark=0;char addr[12];printf("\n\t\t请输入要查询的地址:");scanf("%s",addr);if(num==0){printf("\n\t\t对不起,文件中无任何纪录");printf("\n\t\t按任意键返回主菜单");getch();return;}for (i=0;i<num;i++){if (strcmp(student[i].addr,addr)==0){printf("\n\t\t以下是您要查询的用户纪录:");printf("\n\t\t学号: %s",student[i].numb);printf("\n\t\t姓名: %s",student[i].name);printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\tqq: %s",student[i].qq);}if (deletemark==0){printf("\n\t\t是否继续查询?(y/n)"); if (getch()=='y')search();return;}}}}/********************//********************//*通讯录链表的修改*/change(){int i,j;int numble=0;char numb[11];printf("\n\t\t请输入要修改的学号:");scanf("%s",numb);if(num==0){printf("\n\t\t对不起,文件中无任何纪录"); printf("\n\t\t按任意键返回主菜单");getch();return;}for (i=0;i<num;i++){if (strcmp(student[i].numb,numb)==0){printf("\n\t\t以下是您要修改的用户纪录:"); printf("\n\t\t学号: %s",student[i].numb); printf("\n\t\t姓名: %s",student[i].name); printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode); printf("\n\t\tqq: %s",student[i].qq);printf("\n\t\t是否修改?(y/n)");if (getch()=='y'){devise ();return;}elsereturn;}continue;}if (numble==0){printf("\n\t\t没有该用户的纪录");printf("\n\t\t是否继续修改?(y/n)");if (getch()=='y')change();return;}}devise (){int choice;choice = -1;do{printf("请选择您要修改的学生的信息内容:\n"); printf("+----------------------+\n"); printf("| 学号请按 1 |\n");printf("| 姓名请按 2 |\n");printf("| 性别请按 3 |\n");printf("| 电话请按 4 |\n");printf("| 地址请按 5 |\n");printf("| 邮编请按 6 |\n");printf("| qq 请按 7 |\n");printf("| 取消请按 0 |\n"); printf("+----------------------|\n");printf("请输入您的选择:");scanf("%d", &choice);switch (choice){case 0:return;case 1:printf("请输入学号:");scanf("%s", &student[num].numb);break;case 2:printf("请输入姓名:");scanf("%d", &student[num].name);break;case 3:printf("请输入性别:");scanf("%s", &student[num].sex);break;case 4:printf("请输入电话:"); scanf("%s", &student[num].phone);break;case 5:printf("请输入地址:"); scanf("%s", &student[num].addr);break;case 6:printf("请输入邮编:"); scanf("%lf", &student[num].postcode); break;case 7:printf("请输入qq:");scanf("%s",&student[num].qq );break;default:printf("\n无效选项!");break;}}while(choice != 0);}/********************//********************//*通讯录链表的输出*/list(){int i;system("cls");if(num!=0){printf("\n\t\t*************** 以下为通讯录所有信息************");for (i=0;i<num;i++){printf("\n\t\t学号: %s",student[i].numb);printf("\n\t\t姓名: %s",student[i].name);printf("\n\t\t性别: %s",student[i].sex);printf("\n\t\t电话: %s",student[i].phone);printf("\n\t\t地址: %s",student[i].addr);printf("\n\t\t邮编: %s",student[i].postcode);printf("\n\t\tqq: %s",student[i].qq);printf("\t\t");if (i+1<num){printf("\n\t\t__________________________");system("pause");}}printf("\n\t\t***************************************** *******");}elseprintf("\n\t\t通讯录中无任何纪录");printf("\n\t\t按任意键返回主菜单:");getch();return(0);}/********************//********************//*通讯录链表的保存*/save(){int j;FILE *fp;fp=fopen("student.txt","w");if (fp==NULL)printf("can't open the file.");if(num!=0){for(j=0;j<num;j++){fwrite(student,sizeof(student),1,fp); }}printf("保存成功!"); fclose(fp);return(0);}/********************/。

相关主题