1、c语言程序设计实践报告中南大学C语言程序设计实践报告题 目 通讯录程序设计 学生姓名 指导教师 学 院 专业班级 完成时间 一、任务描述 通讯录程序设计 设计一个实用的小型通讯录程序,具有添加,查询和删除功能。由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码。电话号码可由字符和数字组成。实现功能: (1)系统以菜单方式工作 (2)信息录入功能 (3)信息浏览功能 (4)信息查询功能 (5)信息修改功能 (6)系统退出功能二、算法描述设计一个实用的的小型通讯录程序必须具备系统以菜单方式工作、信息录入、信息浏览、信息查询、信息修改、系统退出功能,那么就需要这样的函数
2、来实现。因此,我需要自定义这样的函数来解决问题,当然还会调用库函数。在定义函数的过程中会用到选择结构、循环结构等基本语句,以及对结构体数组的定义等。三、程序设计 /*头文件(.h)*/ #include stdio.h /*I/O函数*/ #include stdlib.h /*标准库函数*/ #include string.h/*字符串函数*/ #include ctype.h /*字符操作函数*/ #define M 50 /*定义常数表示记录数*/ typedef struct /*定义数据结构*/ char NAME20; /*姓名*/ char EMAIL30; /*邮箱*/ cha
3、r TELE110; /*电话*/ char TELE210; /*电话*/ char HOMETOWN30; /*籍贯*/ DATA;/*以下是函数原型*/ int enter(DATA t); /*输入记录*/int add(DATA t,int n); /*添加记录*/int change(DATA t,int n); /*修改记录*/ int deleter(DATA t,int n); /*删除记录*/ void list(DATA t,int n); /*显示记录*/ void search(DATA t,int n); /*按姓名查找显示记录*/ void qseek(DATA
4、t,int n); /*快速查找记录*/ void print(DATA temp); /*显示单条记录*/ int find(DATA t,int n,char *s) ; /*查找函数*/ int menu_select(); /*主菜单函数*/ /*主函数开始*/ main() int i; DATA dM; /*定义结构体数组*/ int length; /*保存记录长度*/ system(cls); for(;)/*无限循环*/ switch(menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ case 1:length=enter(d);break;/*
5、输入记录*/ case 2:length=add(d,length); break; /*添加记录*/ case 3:length=deleter(d,length);break; /*删除记录*/ case 4:list(d,length);break; /*显示全部记录*/ case 5:search(d,length);break; /*查找记录*/ case 6:qseek(d,length);break; /*快速查找记录*/ case 7:length=change(d,length);break; case 8:exit(0); /*如返回值为8则程序结束*/ /*菜单函数,函数
6、返回值为整数,代表所选的菜单项*/ * *n); printf( * 1. 录入联系人数据 5.按姓名查找 *n); printf( * *n); printf( * 2. 添加联系人数据 6.快速查找 *n); printf(* *n); printf( * 3. 删除联系人数据 7.修改联系人数据 *n); printf( * *n); printf( * 4. 显示全部联系人 8.退出系统 *n); printf( * *n); printf(* *n); printf( *n); do printf(n 请输入您的选项(18):); /*提示输入选项*/ scanf(%s,s); /*
7、输入选择项*/ c=atoi(s); /*将输入的字符串转化为整型数*/ while(c8); /*选择项不在17之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/ /*输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/ int enter(DATA t) int i,n; system(cls); printf(n 请输入需录入数据的个数: ); /*提示信息*/ scanf(%d,&n); /*输入记录数*/ printf(n 请输入数据:n); /*提示输入记录*/ printf(n 姓名 邮箱 电话号码1 电话号码2 籍贯 n); prin
8、tf(*-*-*-*-*-*n); for(i=0;in;i+) scanf(%s%s%s%s%s,ti.NAME,ti.EMAIL,ti.TELE1,ti.TELE2,ti.HOMETOWN); /*输入记录*/ printf(*-*n); return n; /*返回记录条数*/ /*显示记录,参数为记录数组和记录条数*/ void list(DATA t,int n) int i; system(cls); printf(nn *DATA*n); printf( 姓名 邮箱 电话号码1 电话号码2 籍贯n); printf( -n); for(i=0;in-1) /*如果整数i值大于n-
9、1,说明没找到*/ printf(n 未查找到该记录! n); else print(ti); /*找到,调用显示函数显示记录*/ /*显示指定的一条记录*/ void print(DATA temp) system(cls); printf(*n); printf(姓名 邮箱 电话号码1 电话号码2 籍贯 n); printf(-n); printf(%-20s%-30s%-10s%-10s%-30sn,temp.NAME,temp.EMAIL,temp.TELE1,temp.TELE2,temp.HOMETOWN); printf(*end*n); /*查找函数,参数为记录数组和记录条数以
10、及姓名s */ int find(DATA t,int n,char *s) int i; for(i=0;in-1) /*如果整数i值大于n-1,说明没找到*/ printf(n 未查找到该记录! n); else print(ti); printf( n); printf( 1代表修改姓名!n); printf( 2代表修改邮箱! n); printf( 3代表修改电话号码1! n); printf( 4代表修改电话号码2! n); printf( 5代表修改籍贯! n); printf( n); do printf(n 请输入您的选项(15):); /*提示输入选项*/ scanf(%d
11、,&c); switch(c) case 1:strcpy(stu.NAME,ti.NAME);scanf(%s,ti.NAME);printf(修改成功!n);break; case 2:strcpy(stu.EMAIL,ti.EMAIL);scanf(%s,ti.EMAIL);printf(修改成功!n);break; case 3:strcpy(stu.TELE1,ti.TELE1);scanf(%s,ti.TELE1);printf(修改成功! n);break; case 4:strcpy(stu.TELE2,ti.TELE2);scanf(%s,ti.TELE2);printf(修
12、改成功!n);break; case 5:strcpy(stu.HOMETOWN,ti.HOMETOWN);scanf(%s,&ti.HOMETOWN);printf(修改成功!n);break; while(c5); /*选择项不在15之间重输*/ return n;/*删除函数,参数为记录数组和记录条数*/ int deleter(DATA t,int n) char s20; /*要删除记录的姓名*/ int ch=0; int i,j; printf( 请输入删除联系人姓名: ); /*提示信息*/ scanf(%s,s);/*输入姓名*/ i=find(t,n,s); /*调用fin
13、d函数*/ if(in-1) /*如果in-1超过了数组的长度*/ printf( n 未找到要删除的记录!n); /*显示没找到要删除的记录*/ else print(ti); /*调用输出函数显示该条记录信息*/ printf( 确认是否删除该联系人(10)n); /*确认是否要删除*/ printf( 请输入你的选项:); scanf(%d,&ch); /*输入一个整数0或1*/ if(ch=1) /*如果确认删除整数为1*/ for(j=i+1;j=i;j-) /*从最后一个结点开始向后移动一条*/ strcpy(tj+1.NAME,tj.NAME); /*将前记录的姓名复制到后一条*
14、/ strcpy(tj+1.EMAIL,tj.EMAIL); /*将前记录的邮箱复制到后一条*/ strcpy(tj+1.TELE1,tj.TELE1); /*将前记录的电话复制到后一条*/ strcpy(tj+1.TELE2,tj.TELE2); /*将前记录的电话复制到后一条*/ strcpy(tj+1.HOMETOWN,tj.HOMETOWN); /*将前记录的籍贯复制到后一条*/ strcpy(ti.NAME,temp.NAME); /*将新插入记录的姓名复制到第i个位置*/ strcpy(ti.EMAIL,temp.EMAIL); /*将新插入记录的邮箱复制到第i个位置*/ strc
15、py(ti.TELE1,temp.TELE1); /*将新插入记录的电话复制到第i个位置*/ strcpy(ti.TELE1,temp.TELE2); /*将新插入记录的电话复制到第i个位置*/ strcpy(ti.HOMETOWN,temp.HOMETOWN); /*将新插记录的籍贯复制到第i个位置*/ n+; /*记录数加1*/ return n; /*返回记录数*/ /*快速查找,参数为结构体数组和记录数*/ void qseek(DATA t,int n) char s20; int l,r,m; printf( 请输入需快速查找的联系人姓名:); /*提示输入*/ scanf(%s,
16、s); /*输入待查找的姓名*/ l=0;r=n-1; /*设置左边界与右边界的初值*/ while(l=r) /*当左边界=右边界时*/ m=(l+r)/2; /*计算中间位置*/ if(strcmp(tm.NAME,s)=0) /*与中间结点姓名字段做比较判是否相等*/ print(tm); /*如果相等,则调用print函数显示记录信息*/ return ; /*返回*/ if(strcmp(tm.NAME,s)r) /*如果左边界大于右边界时*/ printf( 未查找到该联系人的相关记录!n); /*显示没找到*/ 四、运行结果五、总结 (一)设计过程中遇到的问题 对数组的调用:c语言规定只能逐个引用数组元素,而不能一次引用一个数组。自定义函数时需要有函数声明等问题。(二)、解决问题的过程