1程序设计报告(2012/2013学年第二学期)题目:手机通讯录专业通信录管理系统学生姓名班级学号指导教师指导单位计算机学院信息安全系日期2评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:年月日评分等级3备注评分等级有五种:优秀、良好、中等、及格、不及格通信录管理系统一、课题内容和要求用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。(一)功能要求(1)查看功能:选择此功能时,列出下列三类选择。A办公类B个人类C商务类,当选中某类时,显示出此类所有数据中的姓名和电话号码)(2)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A办公类B个人类C商务类)、电子邮件)。例如杨春13589664454商务类chuny@126.com当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。(3)拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拔号声音。(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。4(二)其它要求:(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)(3)建议使用结构和链表等数据结构(4)学生可自动增加新功能模块(视情况可另外加分)(5)写出课程设计报告,具体要求见相关说明文档二、需求分析(在该部分中叙述每个模块的功能要求)1、创建:在程序运行初期,需要先创建一个通讯录,以确保后续功能的使用;2、显示:将通讯录中的内容显示在屏幕上;3、查询:查找通讯录中的条目,包括学号、姓名、电话等;4、修改:修改通讯录中的条目,包括学号、姓名、电话等;5、添加:在通讯录中添加条目;6、删除:删除一个或多个条目;7、排序:将通讯录中的条目按学号或者姓名的顺序进行排序。8、退出三、功能函数及设计说明功能功能函数设计说明创建voidmycreat创建一个新通讯录,保证后续功能的有效实施:以写入的方式逐条将五条记录添加到D盘文件jilu.dat中。显示voidmydisplay将该文件中的记录以只读的方式逐条在屏幕上展示出来。查询voidmysearch通过用户选择的方式(按学号h或者按姓名m)将存储的记录对应找出并输出,如若输入错误则显示“wrong...”。修改voidmymodify通过charnam[10]=语句强制要求用户输入需要修改的记5录的正确姓名,并将修改后的记录写入目标文件。添加voidmyadd使用文件指针,在文件中增添一条记录,并且保存,同时将记录数M增加1。删除voidmydelete通过用户选择的方式(按学号h或者按姓名m)在所有记录中找到对应的待删除记录,将其后面的各项覆盖掉前一项,便等同于将该条记录删除了。排序voidmysort排序方式按用户需求,有按学号进行升、降序排序和按姓名进行升、降序排序四种,其原理为进行多次for循环,每次将其中的最值项(例如:按学号进行升序排序时,学号的最小值为一最值)“取出”,放在第一位,然后再次进行该循环,直到每项都已被取出并排好顺序。四、源程序代码#includestdio.h//通讯录,函数头。#includeconio.h#includestring.h#includestdlib.h#defineN100intM=5;//此处的M为初始时,通讯录中的条目数。与后面的n相对应,数目可增减。structstudent//定义名为student的结构体,包括num(学号)、name(姓名)、tel(电话)三项。{charnum[10];charname[10];chartel[10];};voidmyprint()//在屏幕上显示初始功能。{system(cls);printf(|-----------------------------------------------|\n);printf(|:-)请输入选项编号(0-7):|\n);printf(|-----------------------------------------------|\n);printf(|--------------1--创建通讯录--------------------|\n);printf(|--------------2--显示通讯录--------------------|\n);printf(|--------------3--查询通讯录--------------------|\n);printf(|--------------4--修改通讯录--------------------|\n);printf(|--------------5--添加通讯录--------------------|\n);printf(|--------------6--删除通讯录--------------------|\n);printf(|--------------7--排序通讯录--------------------|\n);printf(|--------------0--退出--------------------------|\n);6printf(|-----------------------------------------------|\n);}voidmycreat(structstudent*p,intn)//第一模块,创建通讯录。{structstudent*q=p;FILE*fp=NULL;//定义一个空的文件指针,本程序多处使用。fp=fopen(d:\\jilu.dat,w);//以写入的方式打开文件d:\\jilu.dat。if(fp==NULL){printf(error);return;}//保证正确打开了文件for(p=q;p-qn;p++)//开始输入记录{printf(\n);printf(第%d条记录:\n,p-q+1);printf(学号:);do{gets(p-num);}while(strcmp(p-num,)==0);printf(姓名:);gets(p-name);printf(电话:);gets(p-tel);fprintf(fp,%23s%15s%15s\n,p-num,p-name,p-tel);}}voidmydisplay(structstudent*p,intn)//第二模块,显示通讯录{FILE*fp=NULL;fp=fopen(d:\\jilu.dat,r);//以只读的方式打开文件if(fp==NULL){printf(error);return;}system(cls);printf(学号姓名电话\n);//输入提示while(n0){fscanf(fp,%23s%15s%15s,p-num,p-name,p-tel);//这两行表示在文件中读入数据并在屏幕上显示出来printf(%23s%15s%15s\n,p-num,p-name,p-tel);p++;n--;}}7voidmysearch(structstudent*p,intn)//第三模块,查询功能{structstudent*q=p;intflag=0;charc='\0',nm[10]=,nam[10]=;//定义空字符(choose选择)和空数组(number学号、name姓名)printf(\n按照学号查询(h)或姓名查询(m):\n);c=getche();if(c=='h'||c=='H')//以学号查找方式查找{printf(请输入要查询记录的学号:);gets(nm);for(p=q;p-qn;p++)//通过此for循环,找到目标记录if(strcmp(nm,p-num)==0){printf(学号姓名电话\n);printf(%23s%15s%15s\n,p-num,p-name,p-tel);flag=1;}if(flag==0)printf(wrong...\n);//通过flag为1或0表示是否能正确找到目标记录}elseif(c=='m'||c=='M')//以姓名查找的方式查找{printf(请输入要查询记录的姓名:);gets(nam);for(p=q;p-qn;p++)if(strcmp(nam,p-name)==0){printf(学号姓名电话\n);printf(%23s%15s%15s\n,p-num,p-name,p-tel);flag=1;}if(flag==0)printf(wrong...\n);}elseprintf(wrong...\n);}voidmymodify(structstudent*p,intn)//第四模块,修改记录,方式为将需要修改的记录找到,并输入新纪录以覆盖原纪录,从而达到修改记录的目的{structstudent*q=p;FILE*fp=NULL;charnam[10]=;mydisplay(p,n);printf(请输入您想要修改记录的姓名:\n);gets(nam);8for(p=q;p-qn;p++)if(strcmp(nam,p-name)==0)break;if(p-q==n)printf(wrong...);else{printf(请输入正确的学号:);dogets(p-num);while(strcmp(p-num,)==0);printf(请输入正确的姓名:);gets(p-name);printf(请输入正确的电话:);gets(p-tel);}fp=fopen(d:\\jilu.dat,w);if(fp==NULL){printf(error);exit(0);}for(p=q;p-qn;p++)fprintf(fp,%23s%15s%15s\n,p-num,p-name,p-tel);fclose(fp);}voidmyadd(structstudent*p,intn)//第五模块,添加记录,比较简单,方式为定义一指针p,将需要添加的记录内容(学号、姓名、电话)输入,并将该记录写入目标文件{FILE*fp=NULL;structstudent*q=p;charc='\n',tempnum[10]=,tempname[10]=,temptel[10]=;printf(\n);while(strcmp(p-num,)!=0){printf(%23s%15s%15s\n,p-num,p-name,p-tel);p++;}n=p-q;do{printf(请输入新纪录的学号:);dogets(tempnum);while(strcmp(tempnum,)==0);printf(请输入新纪录的姓名:);9gets(tempname);printf(请输入新纪录的电话:);gets(temptel);for(p=q;p-qn;p++)if(strcmp(tempnum,p-num)==0||strcmp(temptel,p-tel)==0){printf(学号或电话号码需要重新输入吗(Y/N)?);c=getche();putchar('\n');break;}if(p-q==n){strcpy(p-num,tempnum);strcpy(p-name,tempname);strcpy(p-tel,temptel);break;}}while(c=='y'||c=='Y');fp=fop