1、通讯录C语言程序设计实验五: 通讯录第一部分 本次上机目标编写程序实现对通讯录的管理,应实现以下功能: 1) 通讯录编辑(添加、删除); 2) 按不同的项进行查找; 3) 对已存在的通讯录按不同的项排序; 4) 将通讯录写入文件; 5) 从文件读入通讯录。任务1:数据类型的创建和变量的准备typedef struct /*定义数据结构*/ char name20; /*姓名*/ char units30; /*单位*/ char tele10; /*电话*/ADDRESS;任务2:各模块函数的设计 int enter(ADDRESS t); /*输入记录*/void list(ADDRESS
2、t,int n); /*显示记录*/void search(ADDRESS t,int n); /*按姓名查找显示记录*/int delete(ADDRESS t,int n); /*删除记录*/int add(ADDRESS t,int n); /*插入记录*/void save(ADDRESS t,int n); /*记录保存为文件*/int load(ADDRESS t); /*从文件中读记录*/void display(ADDRESS t); /*按序号查找显示记录*/void sort(ADDRESS t,int n); /*按姓名排序*/void qseek(ADDRESS t,i
3、nt n); /*快速查找记录*/void copy(); /*文件复制*/void print(ADDRESS temp); /*显示单条记录*/int find(ADDRESS t,int n,char *s) ; /*查找函数*/int menu_select(); /*主菜单函数*/任务3:主函数的设计 用于预期功能的测试。设计要求通过用所学的C语言知识设计出一个尽量接近实际的通讯录管理程序。、1、设计思路(1)分析总结通讯录中数据的构成,并抽象成数据类型;(2)分析通讯录管理中应该具备的功能:输入、输出、查询、修改、显示等;并设计相应的函数以实现该功能;(3)完成对数据的存盘和调取,
4、用函数的形式来确立数据保存与读取的任务;(4)设计并模拟菜单功能,单独设计实现具有菜单功能的函数,并有足够的提示信息;(5)设计主函数用以测试所有功能。2、重点难点重点是对结构体类型的定义和对结构体数组的定义和使用,以及用结构体的指针做函数参数。难点是对文件进行读写操作对于学生来说是比较难的。第二部分 上机任务分阶段完成如下任务阶段1:指导加强对函数分块概念的指导,要求学生尽量保持清晰的思路1、 训练要点对结构体的运用2、需求说明需要全面仔细的分析通讯录管理系统应该具备的功能,通讯录数据应该具有的形式,以及函数间对于通讯录数据的传递方式。3、实现思路以结构体类型为单个通讯录信息实现方式,并采用
5、结构体数组为存储多个通讯录信息的载体,并以函数为单位来实现各个功能。4、程序设计图(1) 框图5、评分标准评分重点放在面向过程设计方法和实际编写代码能力这两个方面。凡是能够基本完成程序设计,画出合理的设计框图,建立基本的代码框架,均视为及格。能够以清晰的思路设计出较为详细的程序流程图,并编写代码实现大部分功能,没有重大语法错误的可以视为良好。如果程序功能完备,运行无误,并在设计上有一定的独到之处,或者编写的代码具有良好的设计风格,规范易读,此类设计视为优秀。6、参考代码/*头文件(.h)*/#include stdio.h /*I/O函数*/#include stdlib.h /*标准库函数*
6、/#include string.h/*字符串函数*/#include ctype.h /*字符操作函数*/#define M 50 /*定义常数表示记录数-宏定义*/typedef struct /*定义数据结构*/ char name20; /*姓名*/ char units30; /*单位*/ char tele10; /*电话*/ADDRESS;/*以下是函数原型*/int enter(ADDRESS t); /*输入记录*/void list(ADDRESS t,int n); /*显示记录*/void search(ADDRESS t,int n); /*按姓名查找显示记录*/in
7、t delete(ADDRESS t,int n); /*删除记录*/int add(ADDRESS t,int n); /*插入记录*/void save(ADDRESS t,int n); /*记录保存为文件*/int load(ADDRESS t); /*从文件中读记录*/void display(ADDRESS t); /*按序号查找显示记录*/void sort(ADDRESS t,int n); /*按姓名排序*/void qseek(ADDRESS t,int n); /*快速查找记录*/void copy(); /*文件复制*/void print(ADDRESS temp);
8、 /*显示单条记录*/int find(ADDRESS t,int n,char *s) ; /*查找函数*/int menu_select(); /*主菜单函数*/*主函数开始*/main() int i; ADDRESS adrM; /*定义结构体数组*/ int length; /*保存记录长度*/ clrscr(); /*清屏*/ for(;)/*无限循环*/ switch(menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ case 0:length=enter(adr);break;/*输入记录*/ case 1:list(adr,length);bre
9、ak; /*显示全部记录*/ case 2:search(adr,length);break; /*查找记录*/ case 3:length=delete(adr,length);break; /*删除记录*/ case 4:length=add(adr,length); break; /*插入记录*/ case 5:save(adr,length);break; /*保存文件*/ case 6:length=load(adr); break; /*读文件*/ case 7:display(adr);break; /*按序号显示记录*/ case 8:sort(adr,length);brea
10、k; /*按姓名排序*/ case 9:qseek(adr,length);break; /*快速查找记录*/ case 10:copy();break; /*复制文件*/ case 11:exit(0); /*如返回值为11则程序结束*/ /*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select() char s80; int c; gotoxy(1,25);/*将光标定为在第25行,第1列*/ printf(press any key enter menu.n);/*提示压任意键继续*/ getch(); /*读入任意字符*/ clrscr(); /*清屏*/ gotox
11、y(1,1); printf(*MENU菜单*nn); printf( 0. Enter recordn); printf( 1. List the filen); printf( 2. Search record on namen); printf( 3. Delete a recordn); printf( 4. add record n); printf( 5. Save the filen); printf( 6. Load the filen); printf( 7. display record on ordern); printf( 8. sort to make new fil
12、en); printf( 9. Quick seek recordn); printf( 10. copy the file to new filen); printf( 11. Quitn); printf(*n); do printf(n Enter you choice(011):); /*提示输入选项*/ scanf(%s,s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整型数*/ while(c11); /*选择项不在011之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/*输入记录,形参为结构体数组,函数值返回类型为整型表示
13、记录长度*/int enter(ADDRESS t) int i,n; char *s; clrscr(); /*清屏*/ printf(nplease input num n); /*提示信息*/ scanf(%d,&n); /*输入记录数*/ printf(please input record n); /*提示输入记录*/ printf(name unit telephonen); printf(-n); for(i=0;in;i+) scanf(%s%s%s,ti.name,ti.units,ti.tele); /*输入记录*/ printf(-n); return n; /*返回记录
14、条数*/*显示记录,参数为记录数组和记录条数*/void list(ADDRESS t,int n) int i; clrscr(); printf(nn*ADDRESS*n); printf(name unit telephonen); printf(-n); for(i=0;in-1) /*如果整数i值大于n-1,说明没找到*/ printf(not foundn); else print(ti); /*找到,调用显示函数显示记录*/*显示指定的一条记录*/void print(ADDRESS temp) clrscr(); printf(nn*n); printf(name unit t
15、elephonen); printf(-n); printf(%-20s%-30s%-10sn,temp.name,temp.units,temp.tele); printf(*end*n);/*查找函数,参数为记录数组和记录条数以及姓名s */int find(ADDRESS t,int n,char *s) int i; for(i=0;in-1) /*如果in-1超过了数组的长度*/ printf(no found not deletedn); /*显示没找到要删除的记录*/ else print(ti); /*调用输出函数显示该条记录信息*/ printf(Are you sure d
16、elete it(1/0)n); /*确认是否要删除*/ scanf(%d,&ch); /*输入一个整数0或1*/ if(ch=1) /*如果确认删除整数为1*/ for(j=i+1;j=i;j-) /*从最后一个结点开始向后移动一条*/ strcpy(tj+1.name,tj.name); /*当前记录的姓名拷贝到后一条*/ strcpy(tj+1.units,tj.units); /*当前记录的单位拷贝到后一条*/ strcpy(tj+1.tele,tj.tele); /*当前记录的电话拷贝到后一条*/ strcpy(ti.name,temp.name); /*将新插入记录的姓名拷贝到第i
17、个位置*/ strcpy(ti.units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/ strcpy(ti.tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/ n+; /*记录数加1*/ return n; /*返回记录数*/*保存函数,参数为结构体数组和记录数*/void save(ADDRESS t,int n) int i; FILE *fp; /*指向文件的指针*/ if(fp=fopen(record.txt,wb)=NULL) /*打开文件,并判断打开是否正常*/ printf(can not open filen);/*没打开*
18、/ exit(1); /*退出*/ printf(nSaving filen); /*输出提示信息*/ fprintf(fp,%d,n); /*将记录数写入文件*/ fprintf(fp,rn); /*将换行符号写入文件*/ for(i=0;in;i+) fprintf(fp,%-20s%-30s%-10s,ti.name,ti.units,ti.tele);/*格式写入记录*/ fprintf(fp,rn); /*将换行符号写入文件*/ fclose(fp);/*关闭文件*/ printf(*save success*n); /*显示保存成功*/*读入函数,参数为结构体数组*/int loa
19、d(ADDRESS t) int i,n; FILE *fp; /*指向文件的指针*/ if(fp=fopen(record.txt,rb)=NULL)/*打开文件*/ printf(can not open filen); /*不能打开*/ exit(1); /*退出*/ fscanf(fp,%d,&n); /*读入记录数*/ for(i=0;i=0&idn) /*判断序号是否在记录范围内*/ fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/ print(tid); /*调用输出函数显示该记录*/ printf(rn); else pr
20、intf(no %d number record!n ,id); /*如果序号不合理显示信息*/ fclose(fp); /*关闭文件*/*排序函数,参数为结构体数组和记录数按姓名*/void sort(ADDRESS t,int n) int i,j,flag; ADDRESS temp; /*临时变量做交换数据用*/ for(i=0;in;i+) flag=0; /*设标志判断是否发生过交换*/ for(j=0;j0) /*比较大小*/ flag=1; strcpy(temp.name,tj.name); /*交换记录*/ strcpy(temp.units,tj.units); strc
21、py(temp.tele,tj.tele); strcpy(tj.name,tj+1.name); strcpy(tj.units,tj+1.units); strcpy(tj.tele,tj+1.tele); strcpy(tj+1.name,temp.name); strcpy(tj+1.units,temp.units); strcpy(tj+1.tele,temp.tele); if(flag=0)break; /*如果标志为0,说明没有发生过交换循环结束*/ printf(sort sucess!n); /*显示排序成功*/*快速查找,参数为结构体数组和记录数*/void qseek(ADDRESS t,int n) char s20; int l,r,m; prin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1