1、C语言实训通讯录设计实训报告题 目: 通讯录院 系: 专 业: 姓 名: 学 号: 指导教师: 日 期: 2009-09-18桂林电子科技大学信息科技学院目 录1 问题定义 .32 系统设计 321 总体设计322 详细设计42.2.1 主控流程 42.2.2 数据结构设计 52.2.3 输入记录模块 52.2.4 查询记录模块 52.2.5 删除记录模块 52.2.6 显示所有记录模块 .63 系统实现 63.1 编码 63.1.1 程序源代码 .63.1.2 主函数main() .103.1.3 主菜单界面 . 143.1.4 读取文件中的记录.143.1.5 排序后显示所有记录 153.
2、1.6 删除学生记录.153.1.7 查找学生记录 . 153.1.8 插入记录.163.1.9 写入记录到文件中. 163.2 测试与调试 173.2.1 概述 .173.2.2 程序测试 .184 系统维护 205 归纳总结 205.1 开发经验 205.2 实训中遇到的问题及解决方法 205.3 设计中的不足之处 205.4 感想和心得体会 216 参考资料 21通讯录本题目设计目的是训练学生的基本编程能力,了解通讯录的开发流程,熟悉C语言的文件的各种基本操作。本程序中涉及结构体、各种语句的运用如for();switch();if.else等方面的知识。通过本程序的训练,使学生能对C语言
3、的文件操作有一个更深刻的了解,初步掌握链表的一些结构及构成。掌握利用结构体实现对通讯录的原理,为进一步开发出高质量的通讯录打下坚实的基础。1、问题定义创建一个通讯录。假设系统中每个学生记录包括姓名、性别、联系地址、联系电话,生日信息的修改、删除和查询等程序的运行效果如下图所示,选择任意菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2、系统设计21 总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化
4、层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。图2.1 通讯录系统功能模块图本通讯录由实现,如图2.1所示,它由如下四大功能模块组成: 输入记录模块。完成将数据存入结构体的工作。记录可以从文件中读入,也可从键盘逐个输入朋友信息。朋友信息由朋友的姓名、性别、联系地址、联系电话构成。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中。 查询记录模块。完成在结构体中查找满足相关条件的学生记录。在此通讯录中,用户可以按照姓名在中进行查找。若找到该学生的记录,则返回指向该学生的记录的指针。否则返回一个值为NULL的空指
5、针,并打印出未找到该学生记录的提示信息。 插入记录模块。完成对朋友信息的更新。在此通讯录中,它实现了对好友记录的增加和排序操作,并将追加后的数据存入源数据文件。 输出记录模块。实现对朋友信息的存盘,即将记录写入数据文件中; 22 详细设计2.2.1主控main()函数执行流程2.2.2数据结构设计 结构体s struct addr /*通讯地址结构定义*/ char post_num10; /*邮编*/ char addr40; /*家庭地址*/;struct birth /*出生年月结构定义*/ int year; /*年份*/ int month; /*月份*/ int day; /*日期
6、*/;struct friend1 /*电子通讯录结构定义*/ int number; /*序号*/ char name20; /*姓名*/ char sex; /*性别*/ struct birth birth; /*出生年月*/ struct addr addr; /*通信地址*/ char telephone13; /*联系电话*/friends50;FILE *fp;int i;图2.2 主控函数执行流程图2.2.3输入记录模块输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu ()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。
7、2.2.4查询记录模块2.2.4查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。2.2.5删除记录模块该操作完成删除指定姓名的记录, 输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。2.2.6显示所有记录模块该操作完成显示所有记录信息,它分两步完成。第一步,按照数组中序号进行排序。第二步,逐条显示出来。3、系统实现31 编码3.1.1 程序源代码#include#include#include#include#includestruct addr /*通讯地址结构定义*/ char post
8、_num10; /*邮编*/ char addr40; /*家庭地址*/;struct birth /*出生年月结构定义*/ int year; /*年份*/ int month; /*月份*/ int day; /*日期*/;struct friend1 /*电子通讯录结构定义*/ int number; /*序号*/ char name20; /*姓名*/ char sex; /*性别*/ struct birth birth; /*出生年月*/ struct addr addr; /*通信地址*/ char telephone13; /*联系电话*/friends50;FILE *fp;
9、int i;void Data_Load() int j; long k; fp=fopen(friend.txt,r+t); /*打开文件friend.txt*/ if(fp!=NULL) for(i=1;i50;i+) j=fgetc(fp); if(j=EOF) /*判断是否到了文件尾*/ return; k=i-1; fseek(fp,k*sizeof(struct friend1),SEEK_SET); fread(&friendsi,sizeof(struct friend1),1,fp);/*从文件中读取一条记录*/ else fp=fopen(friend.txt,w); i=
10、1; void Data_Show(int j) /*打印记录的详细资料*/ printf(nntNo:%3dn,friendsj.number); printf(ntBirthday(y/m/d):%4d%2d%2d,friendsj.birth.year,friendsj.birth.month,friendsj.birth.day); printf(ntPostnum:%-10s,friendsj.addr.post_num); printf(ntaddress:%-40s,friendsj.addr.addr); printf(ntTele%-13s,friendsj.telephon
11、e);void Data_Input(int j) /*记录插入函数*/ fflush(stdin); friendsj.number=j; printf(nnntNo %d record,j); printf(nntName:); /*读入姓名*/ scanf(%s,friendsj.name); fflush(stdin); printf(ntSex(m/f):); /*读入性别*/ scanf(%c,&friendsj.sex); printf(nt-birthday-); /*读入出生年月*/ printf(ntyear:); scanf(%d,&friendsj.birth.year
12、); printf(nttmonth:); scanf(%d,&friendsj.birth.month); printf(nttday:); scanf(%d,&friendsj.birth.day); printf(ntPost_number:); /*读入邮编*/ scanf(%s,friendsj.addr.post_num); printf(ntAddress:); /*读入家庭地址*/ scanf(%s,friendsj.addr.addr); printf(nttelephone:); /*读入联系电话*/ scanf(%s,friendsj.telephone); printf
13、(y/n); if( getch()=n) main();void Data_Save() int j; fp=fopen(friend.txt,w); for(j=1;j=i;j+) fwrite(&friendsj,sizeof(struct friend1),1,fp); void main() int j,k; char ch; char *search_name; clrscr(); Data_Load(); i-; do printf(nnntFunction choose:); printf(nt1.Read); printf(nt2.Append); printf(nt3.De
14、lete); printf(nt4.Search); printf(nt5.Insert); printf(nt6.Save and Exit); printf(nt7.Quit); printf(nn); printf(tChoice:); ch=getche(); switch(ch) case 1: j=1; /*显示通讯录中的所有记录*/ while(getch()!=0x1b&ji) printf(ntEnd of e_noten); break; case 2: /*增加通讯录中的记录*/ while(getch()!=0x1b&i50) i+; Data_Input(i); if
15、(i=50)printf(nte_note is filledn); break; case 3: /*删除通讯录中的记录*/ if(i1) printf(ntNo recordsn); break; printf(ntDelete No:); /*读入删除位置*/ scanf(%d,&k); for(j=k;ji;j+) /*删除位置前的元素顺序前移*/ strcpy(friendsj.name,friendsj+1.name); friendsj.sex=friendsj=1.sex; friendsj.birth.year=friendsj+1.birth.year; friendsj.
16、birth.month=friendsj+1.birth.month; friendsj.birth.day=friendsj+1.birth.day; strcpy(friendsj.addr.post_num,friendsj+1.addr.post_num); strcpy(friendsj.addr.addr,friendsj+1.addr.addr); strcpy(friendsj.telephone,friendsj+1.telephone); i-; /*元素总数减1*/ break; case 4: /*通讯录查询功能*/ printf(ntPlease input name
17、:); gets(search_name); for(j=1;j1) /*查询失败*/ printf(nt No such records) ; break; case 5: printf(ntInsert No:); /*录入插入位置*/ scanf(%d,&k); for(j=i+1;jk;j+) /*插入位置后的元素顺序后移*/ strcpy(friendsj.name,friendsj-1.name); /*交换元素内容*/ friendsj.sex=friendsj-1.sex; friendsj.birth.year=friendsj-1.birth.year; friendsj.
18、birth.month=friendsj-1.birth.month; friendsj.birth.day=friendsj-1.birth.day; strcpy(friendsj.addr.post_num,friendsj-1.addr.post_num); strcpy(friendsj.addr.addr,friendsj-1.addr.addr); strcpy(friendsj.telephone,friendsj-1.telephone); Data_Input(k); i+; break; case 6: Data_Save(); exit(0); break; case
19、7: printf(ntDo you want to save e_note:(y/n); ch=getch(); if(ch=y) Data_Save(); fclose(fp); exit(0); default: printf(Please choose num 1-4n ); while(1);3.1.2 主函数main()main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。void main() int j,k; char ch; char *search_name; clrscr(); Data_Load(); i-; do printf(nnntFunctio
20、n choose:); printf(nt1.Read); printf(nt2.Append); printf(nt3.Delete); printf(nt4.Search); printf(nt5.Insert); printf(nt6.Save and Exit); printf(nt7.Quit); printf(nn); printf(tChoice:); ch=getche(); switch(ch) case 1: j=1; /*显示通讯录中的所有记录*/ while(getch()!=0x1b&ji) printf(ntEnd of e_noten); break; case
21、2: /*增加通讯录中的记录*/ while(getch()!=0x1b&i50) i+; Data_Input(i); if(i=50)printf(nte_note is filledn); break; case 3: /*删除通讯录中的记录*/ if(i1) printf(ntNo recordsn); break; printf(ntDelete No:); /*读入删除位置*/ scanf(%d,&k); for(j=k;ji;j+) /*删除位置前的元素顺序前移*/ strcpy(friendsj.name,friendsj+1.name); friendsj.sex=frien
22、dsj=1.sex; friendsj.birth.year=friendsj+1.birth.year; friendsj.birth.month=friendsj+1.birth.month; friendsj.birth.day=friendsj+1.birth.day; strcpy(friendsj.addr.post_num,friendsj+1.addr.post_num); strcpy(friendsj.addr.addr,friendsj+1.addr.addr); strcpy(friendsj.telephone,friendsj+1.telephone); i-; /
23、*元素总数减1*/ break; case 4: /*通讯录查询功能*/ printf(ntPlease input name:); gets(search_name); for(j=1;j1) /*查询失败*/ printf(nt No such records) ; break; case 5: printf(ntInsert No:); /*录入插入位置*/ scanf(%d,&k); for(j=i+1;jk;j+) /*插入位置后的元素顺序后移*/ strcpy(friendsj.name,friendsj-1.name); /*交换元素内容*/ friendsj.sex=frien
24、dsj-1.sex; friendsj.birth.year=friendsj-1.birth.year; friendsj.birth.month=friendsj-1.birth.month; friendsj.birth.day=friendsj-1.birth.day; strcpy(friendsj.addr.post_num,friendsj-1.addr.post_num); strcpy(friendsj.addr.addr,friendsj-1.addr.addr); strcpy(friendsj.telephone,friendsj-1.telephone); Data_Input(k); i+; break; case 6: Data_Save(); exit(0); break; case 7: printf(ntDo you want to save e_note:(y/n); ch=getch(); if(ch=y) Data_Save(); fclose(fp); exit(0); default: printf(Please choose num 1-4n ); while(1);3.1.3 主菜单界面用户进入通讯录系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。 void mai
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1