c语言程序设计实践报告.docx
- 文档编号:25651783
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:13
- 大小:18.25KB
c语言程序设计实践报告.docx
《c语言程序设计实践报告.docx》由会员分享,可在线阅读,更多相关《c语言程序设计实践报告.docx(13页珍藏版)》请在冰豆网上搜索。
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"/*字符操作函数*/
#defineM50/*定义常数表示记录数*/
typedefstruct/*定义数据结构*/
{
charNAME[20];/*姓名*/
charEMAIL[30];/*邮箱*/
charTELE1[10];/*电话*/
charTELE2[10];/*电话*/
charHOMETOWN[30];/*籍贯*/
}DATA;
/******以下是函数原型*******/
intenter(DATAt[]);/*输入记录*/
intadd(DATAt[],intn);/*添加记录*/
intchange(DATAt[],intn);/*修改记录*/
intdeleter(DATAt[],intn);/*删除记录*/
voidlist(DATAt[],intn);/*显示记录*/
voidsearch(DATAt[],intn);/*按姓名查找显示记录*/
voidqseek(DATAt[],intn);/*快速查找记录*/
voidprint(DATAtemp);/*显示单条记录*/
intfind(DATAt[],intn,char*s);/*查找函数*/
intmenu_select();/*主菜单函数*/
/******主函数开始*******/
main()
{
inti;
DATAd[M];/*定义结构体数组*/
intlength;/*保存记录长度*/
system("cls");
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case1:
length=enter(d);break;/*输入记录*/
case2:
length=add(d,length);break;/*添加记录*/
case3:
length=deleter(d,length);break;/*删除记录*/
case4:
list(d,length);break;/*显示全部记录*/
case5:
search(d,length);break;/*查找记录*/
case6:
qseek(d,length);break;/*快速查找记录*/
case7:
length=change(d,length);break;
case8:
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之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
intenter(DATAt[])
{
inti,n;
system("cls");
printf("\n请输入需录入数据的个数:
");/*提示信息*/
scanf("%d",&n);/*输入记录数*/
printf("\n请输入数据:
\n");/*提示输入记录*/
printf("\n姓名邮箱电话号码1电话号码2籍贯\n");
printf("*-------*----------------*---------------*----------------*---------------*\n");
for(i=0;i { scanf("%s%s%s%s%s",t[i].NAME,t[i].EMAIL,t[i].TELE1,t[i].TELE2,t[i].HOMETOWN);/*输入记录*/ printf("*-------------------------------------------------------------------------*\n"); } returnn;/*返回记录条数*/ } /*显示记录,参数为记录数组和记录条数*/ voidlist(DATAt[],intn) { inti; system("cls"); printf("\n\n*****************************DATA************************************\n"); printf("姓名邮箱电话号码1电话号码2籍贯\n"); printf("---------------------------------------------------------------------\n"); for(i=0;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"); } /*查找记录*/ voidsearch(DATAt[],intn) { chars[20];/*保存待查找姓名字符串*/ inti;/*保存查找到结点的序号*/ system("cls"); printf("请输入姓名"); scanf("%s",s);/*输入待查找姓名*/ i=find(t,n,s);/*调用find函数,得到一个整数*/ if(i>n-1)/*如果整数i值大于n-1,说明没找到*/ printf("\n未查找到该记录! \n"); else print(t[i]);/*找到,调用显示函数显示记录*/ } /*显示指定的一条记录*/ voidprint(DATAtemp) { system("cls"); printf("********************************************************************\n"); printf("姓名邮箱电话号码1电话号码2籍贯\n"); printf("---------------------------------------------------------------------\n"); printf("%-20s%-30s%-10s%-10s%-30s\n",temp.NAME,temp.EMAIL,temp.TELE1,temp.TELE2,temp.HOMETOWN); printf("**********************end***********************\n"); } /*查找函数,参数为记录数组和记录条数以及姓名s*/ intfind(DATAt[],intn,char*s) { inti; for(i=0;i { if(strcmp(s,t[i].NAME)==0)/*记录中的姓名和待比较的姓名是否相等*/ returni;/*相等,则返回该记录的下标号,程序提前结结束*/ } returni;/*返回i值*/ } /*修改函数*/ intchange(DATAt[],intn) { DATAstu; chars[20]; inti,c; printf("请输入修改联系人的姓名: \n"); scanf("%s",s); i=find(t,n,s); if(i>n-1)/*如果整数i值大于n-1,说明没找到*/ printf("\n未查找到该记录! \n"); else print(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(stu.NAME,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之间重输*/ returnn; } /*删除函数,参数为记录数组和记录条数*/ intdeleter(DATAt[],intn) { chars[20];/*要删除记录的姓名*/ intch=0; inti,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 { 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"); } } returnn;/*返回记录数*/ } /*添加记录函数,参数为结构体数组和记录数*/ intadd(DATAt[],intn)/*添加函数,参数为结构体数组和记录数*/ { DATAtemp;/*新插入记录信息*/ inti,j; chars[20];/*确定插入在哪个记录之前*/ printf("请输入新插入联系人数据: \n"); printf("***********************************************************************\n"); printf("姓名邮箱电话号码1电话号码2籍贯\n"); printf("-----------------------------------------------------------------------\n"); scanf("%s%s%s%s",temp.NAME,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,temp.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*/ returnn;/*返回记录数*/ } /*快速查找,参数为结构体数组和记录数*/ voidqseek(DATAt[],intn) { chars[20]; intl,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;/*修改左边界*/ else r=m-1;/*否则,中间结点大,修改右边界*/ } if(l>r)/*如果左边界大于右边界时*/ printf("未查找到该联系人的相关记录! \n");/*显示没找到*/ } 四、运行结果 五、总结 (一)设计过程中遇到的问题 对数组的调用: c语言规定只能逐个引用数组元素,而不能一次引用一个数组。 自定义函数时需要有函数声明等问题。 (二)、解决问题的过程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实践 报告