题目:学生通讯录管理系统任务说明:主要利用c语言的文件操作能力设计开发一个小型的通讯录管理系统,至少具有如下功能:①记录通讯录内的人员的学号、姓名、地址、电话号码。②显示所有人员的信息。③通过输入姓名查找人员信息。④通过输入姓名查找到要删除的人员信息,然后可以进行删除。⑤通过输入姓名查找到要修改的人员信息,然后可以进行修改。⑥添加人员信息。系统功能描述:本程序的功能是为用户提供简单的通讯录进行管理,通过该程序存储联系人信息,提供关键字(只能是英文关键字进行查找)查找功能,可以对数据进行修改、删除、添加等操作。各按钮的功能如下:查找记录:以姓名为关键字,查找并显示该记录。若查找不到,则显示“好象没有”;添加记录:将当前记录按姓名序加入通讯录,然后显示第一条记录;修改记录:修改当前记录,显示当前记录。姓名为关键字,不允许修改;删除记录:删除当前记录,然后显示第一条记录;第一条记录:将当前记录指针移动至首节点,若已为首节点,则不移动;前一条记录:将当前记录指针向前移动一个节点,若已为首节点,则不移动;后一条记录:将当前记录指针向后移动一个节点,若已为尾节点,则不移动;最后一条记录:将当前记录指针移动至尾节点,若已为尾节点,则不移动;加载:从文件中掉入已保存的通讯录数据;保存:保存通讯录数据;退出:退出系统;设计思路:根据要求,电话录数据以文本文件存放在文件中,故需要提供文件的输入、输出等操作;还需要保存记录以进行修改,删除,查找等操作;另外还应提供键盘式选择菜单实现功能选择。图1系统功能模块图软件中使用的结构体和结构体数组,如:structcallmember{charname[20];charaddress[20];charcode[20];charcallnumber[20];};对用户的信息进行保存,他们都以二进制的形式读写。其中:通讯录管理系统数据输入数据修改删除数据添加查找浏览charname[20];charaddress[20];charcode[20];charcallnumber[20]分别对姓名、地址、邮编、电话号码进行储存在子函数中还使用了结构体数组:structcallmemberone[100];还使用了exit()、fclose()等库函数。还运用了头文件:#includestdafx.h#includestring.h#includestdio.h#includestdlib.h其中还使用大量的子函数,例如:voidoutput();voiddel();voidfound();voidmodify();voidinsert();部分子函数的详细代码:voidoutput(){intb=0,i=0;intj;structcallmemberone[100];FILE*fp;if((fp=fopen(e:\\通讯录.txt,r))==NULL){printf(无法从已有通讯录输入!\n可能是因为原通讯录不存在或为空!\n建议你检查你的通讯录文挡!\n);exit(1);}while(fscanf(fp,%s%s%s%s,one[i].name,one[i].address,one[i].code,one[i].callnumber)!=EOF)i++;j=i;for(i=0;ij;i++){printf(%s%s%s%s\n,one[i].name,one[i].address,one[i].code,one[i].callnumber);}fclose(fp);}voidinsert(){FILE*fp;structcallmember*p;if((fp=fopen(e:\\通讯录.txt,a+))==NULL){printf(操作失败.);exit(1);}p=(structcallmember*)malloc(sizeof(structcallmember));printf(************************\n);printf(姓名:);scanf(%s,p-name);printf(地址:);scanf(%s,p-address);printf(邮编:);scanf(%s,p-code);printf(电话:);scanf(%s,p-callnumber);printf(************************\n);fprintf(fp,%s%s%s%s,p-name,p-address,p-code,p-callnumber);fclose(fp);free(p);}通过对这些资源的合理利用使系统初步实现了通讯录管理系统的基本功能。程序流程图:开始执行printf()函数选择(a)调用output()函数调用del()函数调用found()函数调用modify()函数调用insert()函数执行printf()退出系统elseprintf(\n对不起,通讯录中没有此人的记录。);fclose(fp);}结果分析:1运行进入程序主菜单主选单具有所有函数的功能实现的选择功能,通过主选单的操作进入各个功能。主选单主要由主函数提供,其功能由子函数实现。2查看所有人员信息界面可以显示全部的人员的信息。可在3.3参看流程图。3删除模块删除功能界面4查找模块进入查找记录界面5修改模块进入修改界面6添加模块进入添加界面可以根据要求添加用户想添加的人员信息。7.退出进入退出界面:当出现没有查找人员信息时会自动返回主选单总结1本程序的局限性及改进方法:本程序中包含的信息不够全面,比如年龄,性别,通讯地址,电子邮箱等,都没有包含。改进方法就是在设计程序时把这些内容都加进去,电子邮箱还可以建立链接。2运用本程序还可以编写比如对学生信息的管理系统,商店、超市里面对商品的管理,仓库里面对货物的查询等等。3在课程设计过程中遇到的问题,解决的办法1、从文本中写入数据时可能指针指错位置,导致不能正常进行。解决的办法是对指针进行必要跟踪,把该函数写入独立的cpp文件中,单个进行检查。2、从文本文件中载入数据时,当记录数为1的时,出现内存不能读的情况,当记录数为0时,当前记录数和总记录数以及用户信息显示的情况比较特殊,解决的办法是分三种情况,写段程序分别进行处理。4心得体会与收获:通过这次课程设计,我对很多的函数有了新的认识,我对C语言有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,写软件的过程中我又学到啦曾经自己不知道的函数或是自己不会的函数的用法。特别是文件的开启和关闭,读与写。这次课程设计课总的来说让我受益匪浅。虽然在调试程序遇到了很多的困难,但是都一一去把它解决了。从中也让我知道了要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。程序清单:#includestdio.h/*标准输入输出函数库*/#includestring.hstructstudent{charname[8];chartel[15];charaddr[50];};charfilename[20];FILE*fp;voidcreat();voidoutput();voidsearch();voidappend();voidmodify();voidremove();main(){intm;creat();while(1){printf(\n\n添加,请按1);printf(\n查找,请按2);printf(\n修改,请按3);printf(\n删除,请按4);printf(\n输出,请按5);printf(\n退出,请按0\n);scanf(%d,&m);if(m=0&&m=5){switch(m){case1:append();break;case2:search();break;case3:modify();break;case4:remove();break;case5:output();break;case0:break;}printf(\n\n操作完毕,请再次选择!);}elseprintf(\n\n选择错误,请再次选择!);}}voidcreat(){structstudentone;longs1;printf(\n请输入通讯录名:);scanf(%s,filename);if((fp=fopen(filename,w))==NULL){printf(\n不能建立通讯录!);exit();}fprintf(fp,%-10s%-20s%-50s\n,姓名,电话号码,住址);printf(\n请输入姓名、电话号码及住址(以0结束)\n);scanf(%s,one.name);while(strcmp(one.name,0)){scanf(%s%s,one.tel,one.addr);fprintf(fp,%-10s%-20s%-50s\n,one.name,one.tel,one.addr);scanf(%s,one.name);}fclose(fp);}voidoutput(){structstudentone;if((fp=fopen(filename,r))==NULL){printf(\n不能打开通讯录!);exit();}printf(\n\n%20s\n,通讯录);while(!feof(fp)){fscanf(fp,%s%s%s\n,one.name,one.tel,one.addr);printf(%-10s%-20s%-50s,one.name,one.tel,one.addr);}fclose(fp);}voidappend(){structstudentone;if((fp=fopen(filename,a))==NULL){printf(\n不能打开通讯录!);exit();}printf(\n请输入添加的姓名、电话号码及住址\n);scanf(%s%s%s,one.name,one.tel,one.addr);fprintf(fp,%-10s%-20s%-50s\n,one.name,one.tel,one.addr);fclose(fp);}voidsearch(){intk=0;charnamekey[8];structstudentone;printf(\n请输入姓名:);scanf(%s,namekey);if((fp=fopen(filename,rb))==NULL){printf(\n不能打开通讯录!);exit();}while(!feof(fp)){fscanf(fp,%s%s%s\n,one.name,one.tel,one.addr);if(!strcmp(namekey,one.name)){printf(\n\n已查到,记录为:);printf(\n%-10s%-18s%-50s,one.name,one.tel,one.addr);k=1;}}if(!k)printf(\n\n对不起,通讯录中没有此人的记录。);fclose(fp);}voidmodify(){intm,k=0;longoffset;charnamekey[8];structstudentone;printf(\n请输入姓名:);scanf(%s,namekey);if((fp=fopen(filename,r+))==NULL){printf(\n不能打开通讯录!);exit();}while(!feof(fp)){offset=ftell(fp);fscanf(fp,%s%s%s\n,one.name,one.tel,one.addr);if(!strcmp(namekey,one.name)){k=1;break;}}if(k){printf(\n已查到,记录为:);printf(\n%-10s%-18s%-50s,one.name,one.tel,one.addr);printf(\n请输入新姓名、电话号码及住址:);scanf(%s