当前位置:文档之家› c语言程序设计实践报告

c语言程序设计实践报告

中南大学C语言程序设计实践报告题目通讯录程序设计学生姓名指导教师学院专业班级完成时间一、任务描述通讯录程序设计设计一个实用的小型通讯录程序,具有添加,查询和删除功能。

由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码。

电话号码可由字符和数字组成。

实现功能:(1)系统以菜单方式工作(2)信息录入功能(3)信息浏览功能(4)信息查询功能(5)信息修改功能(6)系统退出功能二、算法描述设计一个实用的的小型通讯录程序必须具备系统以菜单方式工作、信息录入、信息浏览、信息查询、信息修改、系统退出功能,那么就需要这样的函数来实现。

因此,我需要自定义这样的函数来解决问题,当然还会调用库函数。

在定义函数的过程中会用到选择结构、循环结构等基本语句,以及对结构体数组的定义等。

三、程序设计/******头文件(.h)***********/#include "stdio.h" /*I/O函数*/#include "stdlib.h" /*标准库函数*/#include "string.h"/*字符串函数*/#include "ctype.h" /*字符操作函数*/#define M 50 /*定义常数表示记录数*/typedef struct /*定义数据结构*/{char NAME[20]; /*姓名*/char EMAIL[30]; /*邮箱*/char TELE1[10]; /*电话*/char TELE2[10]; /*电话*/char HOMETOWN[30]; /*籍贯*/}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 t[],int n); /*快速查找记录*/void print(DATA temp); /*显示单条记录*/int find(DATA t[],int n,char *s) ; /*查找函数*/int menu_select(); /*主菜单函数*//******主函数开始*******/main(){int i;DATA d[M]; /*定义结构体数组*/int length; /*保存记录长度*/system("cls");for(;;)/*无限循环*/{switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ {case 1:length=enter(d);break;/*输入记录*/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则程序结束*/}}}/*菜单函数,函数返回值为整数,代表所选的菜单项*/* *\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 请输入您的选项(1~8):"); /*提示输入选项*/scanf("%s",s); /*输入选择项*/c=atoi(s); /*将输入的字符串转化为整型数*/}while(c<1||c>8); /*选择项不在1~7之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数*/}/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/int enter(DATA t[]){int i,n;system("cls");printf("\n 请输入需录入数据的个数: "); /*提示信息*/scanf("%d",&n); /*输入记录数*/printf("\n 请输入数据:\n"); /*提示输入记录*/printf("\n 姓名邮箱电话号码 1 电话号码 2 籍贯 \n");printf("*-------*----------------*---------------*----------------*---------------*\n");for(i=0;i<n;i++){scanf("%s%s%s%s%s",t[i].NAME,t[i].EMAIL,t[i].TELE1,t[i].TELE2,t[i].HOMETOWN);/*输入记录*/printf("*-------------------------------------------------------------------------*\n");}return n; /*返回记录条数*/}/*显示记录,参数为记录数组和记录条数*/void list(DATA t[],int n){int i;system("cls");printf("\n\n*****************************DATA************************************\n");printf(" 姓名邮箱电话号码 1 电话号码 2 籍贯\n");printf("---------------------------------------------------------------------\n");for(i=0;i<n;i++)printf("%-20s%-30s%-10s%-10s%-30s\n",t[i].NAME,t[i].EMAIL,t[i].TELE1,t[i].TELE2,t[i].HOMETOWN);if((i+1)%10==0) /*判断输出是否达到10条记录*/{printf(" 请输入任意键继续...\n"); /*提示信息*/system ("pause");}printf("**********************************end**********************************\n");}/*查找记录*/void search(DATA t[],int n){char s[20]; /*保存待查找姓名字符串*/int i; /*保存查找到结点的序号*/system("cls");printf(" 请输入姓名 ");scanf("%s",s); /*输入待查找姓名*/i=find(t,n,s); /*调用find函数,得到一个整数*/if(i>n-1) /*如果整数i值大于n-1,说明没找到*/printf("\n 未查找到该记录! \n");elseprint(t[i]); /*找到,调用显示函数显示记录*/}/*显示指定的一条记录*/void print(DATA temp){system("cls");printf("********************************************************************\n" );printf("姓名邮箱电话号码 1 电话号码 2 籍贯\n");printf("---------------------------------------------------------------------\n ");printf("%-20s%-30s%-10s%-10s%-30s\n",,temp.EMAIL,temp.TELE1,temp.TELE2 ,temp.HOMETOWN);printf("**********************end***********************\n");}/*查找函数,参数为记录数组和记录条数以及姓名s */int find(DATA t[],int n,char *s){int i;for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/{if(strcmp(s,t[i].NAME)==0) /*记录中的姓名和待比较的姓名是否相等*/return i; /*相等,则返回该记录的下标号,程序提前结结束*/}return i; /*返回i值*/}/*修改函数*/int change(DATA t[],int n){DATA stu;char s[20];int i,c;printf("请输入修改联系人的姓名:\n");scanf("%s",s);i=find(t,n,s);if(i>n-1) /*如果整数i值大于n-1,说明没找到*/printf("\n 未查找到该记录! \n");elseprint(t[i]);printf(" @@@@@@@@@@@@@@@@\n");printf(" @ 1代表修改姓名!@\n");printf(" @ 2代表修改邮箱!@\n");printf(" @ 3代表修改电话号码1!@\n");printf(" @ 4代表修改电话号码2!@\n");printf(" @ 5代表修改籍贯!@\n");printf(" @@@@@@@@@@@@@@@@\n");do{printf("\n 请输入您的选项(1~5):"); /*提示输入选项*/ scanf("%d",&c);switch(c){case1:strcpy(,t[i].NAME);scanf("%s",t[i].NAME);printf("修改成功!\n");break; case2:strcpy(stu.EMAIL,t[i].EMAIL);scanf("%s",t[i].EMAIL);printf("修改成功!\n");break;case3:strcpy(stu.TELE1,t[i].TELE1);scanf("%s",t[i].TELE1);printf("修改成功!\n");break;case4:strcpy(stu.TELE2,t[i].TELE2);scanf("%s",t[i].TELE2);printf("修改成功!\n");break;case5:strcpy(stu.HOMETOWN,t[i].HOMETOWN);scanf("%s",&t[i].HOMETOWN);printf("修改成功!\n");break;}}while(c<1||c>5); /*选择项不在1~5之间重输*/return n;}/*删除函数,参数为记录数组和记录条数*/int deleter(DATA t[],int n){char s[20]; /*要删除记录的姓名*/int ch=0;int i,j;printf(" 请输入删除联系人姓名: "); /*提示信息*/scanf("%s",s);/*输入姓名*/i=find(t,n,s); /*调用find函数*/if(i>n-1) /*如果i>n-1超过了数组的长度*/printf(" \n 未找到要删除的记录!\n"); /*显示没找到要删除的记录*/else{print(t[i]); /*调用输出函数显示该条记录信息*/printf(" 确认是否删除该联系人(1~0)<提示:1为删除,0为不删除!>\n"); /*确认是否要删除*/printf(" 请输入你的选项:");scanf("%d",&ch); /*输入一个整数0或1*/if(ch==1) /*如果确认删除整数为1*/{for(j=i+1;j<n;j++) /*删除该记录,实际后续记录前移*/{strcpy(t[j-1].NAME,t[j].NAME); /*将后一条记录的姓名拷贝到前一条*/strcpy(t[j-1].EMAIL,t[j].EMAIL); /*将后一条记录的单位拷贝到前一条*/strcpy(t[j-1].TELE1,t[j].TELE1); /*将后一条记录的电话拷贝到前一条*/strcpy(t[j-1].TELE2,t[j].TELE2); /*将后一条记录的电话拷贝到前一条*/strcpy(t[j-1].HOMETOWN,t[j].HOMETOWN); /*将后一条记录的籍贯拷贝到前一条*/}n--; /*记录数减1*/printf("删除成功!!!\n");}}return n; /*返回记录数*/}/*添加记录函数,参数为结构体数组和记录数*/int add(DATA t[],int n)/*添加函数,参数为结构体数组和记录数*/{DATA temp; /*新插入记录信息*/int i,j;char s[20]; /*确定插入在哪个记录之前*/printf("请输入新插入联系人数据:\n");printf("***********************************************************************\n");printf(" 姓名邮箱电话号码 1 电话号码 2 籍贯\n");printf("-----------------------------------------------------------------------\n");scanf("%s%s%s%s",,temp.EMAIL,temp.TELE1,temp.TELE2,temp.HOMETOWN);/*输入插入信息*/printf("-----------------------------------------------------------------------\n");i=find(t,n,s); /*调用find,确定插入位置*/for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/{strcpy(t[j+1].NAME,t[j].NAME); /*将前记录的姓名复制到后一条*/strcpy(t[j+1].EMAIL,t[j].EMAIL); /*将前记录的邮箱复制到后一条*/strcpy(t[j+1].TELE1,t[j].TELE1); /*将前记录的电话复制到后一条*/strcpy(t[j+1].TELE2,t[j].TELE2); /*将前记录的电话复制到后一条*/ strcpy(t[j+1].HOMETOWN,t[j].HOMETOWN); /*将前记录的籍贯复制到后一条*/}strcpy(t[i].NAME,); /*将新插入记录的姓名复制到第i个位置*/strcpy(t[i].EMAIL,temp.EMAIL); /*将新插入记录的邮箱复制到第i个位置*/strcpy(t[i].TELE1,temp.TELE1); /*将新插入记录的电话复制到第i个位置*/strcpy(t[i].TELE1,temp.TELE2); /*将新插入记录的电话复制到第i个位置*/strcpy(t[i].HOMETOWN,temp.HOMETOWN); /*将新插记录的籍贯复制到第i个位置*/n++; /*记录数加1*/return n; /*返回记录数*/}/*快速查找,参数为结构体数组和记录数*/void qseek(DATA t[],int n){char s[20];int l,r,m;printf(" 请输入需快速查找的联系人姓名:"); /*提示输入*/scanf("%s",s); /*输入待查找的姓名*/l=0;r=n-1; /*设置左边界与右边界的初值*/while(l<=r) /*当左边界<=右边界时*/{m=(l+r)/2; /*计算中间位置*/if(strcmp(t[m].NAME,s)==0) /*与中间结点姓名字段做比较判是否相等*/ {print(t[m]); /*如果相等,则调用print函数显示记录信息*/return ; /*返回*/}if(strcmp(t[m].NAME,s)<0) /*如果中间结点小*/l=m+1; /*修改左边界*/elser=m-1; /*否则,中间结点大,修改右边界*/}if(l>r) /*如果左边界大于右边界时*/printf(" 未查找到该联系人的相关记录!\n"); /*显示没找到*/}四、运行结果五、总结(一)设计过程中遇到的问题对数组的调用:c语言规定只能逐个引用数组元素,而不能一次引用一个数组。

相关主题