大实验报告之通讯录.docx
- 文档编号:4946012
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:24
- 大小:200.38KB
大实验报告之通讯录.docx
《大实验报告之通讯录.docx》由会员分享,可在线阅读,更多相关《大实验报告之通讯录.docx(24页珍藏版)》请在冰豆网上搜索。
大实验报告之通讯录
高级语言程序设计实验报告
实验项目名称C语言通讯录成绩评定
实验项目类型:
综合设计型实验时间:
学生姓名:
汪思航班级:
11602007学号:
1160200719
学院:
能源学院专业:
任课教师:
袁永峰
(一)实验目的
熟悉一维、二维数组做函数参数,排序、查找、统计分析等常用算法,自顶向下、逐步求精的模块化设计以及增量测试方法
(二)实验内容和要求
实验内容:
实验1:
c语言通讯录
最多不超过1000人的通讯录管理:
1、增加联系人
2、删除联系人
3、修改联系人
4、显示所有联系人
5、搜索联系人
6、将所得数据写入文件中
实验要求:
输入格式:
(1)录入联系人姓名:
**输入数据格式:
"%s"
**提示信息:
"请输入联系人姓名:
(注意联系人姓名中间不能有空格)\n"
(2)录入联系人电话:
**输入数据格式:
"%s"
**提示信息:
"请输入联系人电话:
(注意联系人电话号码中间不能有空格)\n"
输出格式:
菜单项的输出显示:
****************************
******欢迎使用通讯录******
******1、添加联系人******
******2、删除联系人******
******3、修改联系人******
******4、查看所有联系人***
******5、搜索联系人******
******6、退出系统******
****************************
(三)实验环境
Windows、Codeblocks13.12
(四)系统设计
系统功能模块结构图:
算法设计:
交换法排序,遍历算法。
数据结构设计:
(请说明采用数组、结构体还是链表存储学生个人信息,并列出所定义的数据各种信息,如:
)
序号
字段名
字段含义
1
Name
联系人姓名
2
Tel
联系人电话
各模块(函数)的功能和接口设计:
主函数:
编写循环控制程序
显示操作界面
根据编号执行不同的函数
intvalidateInput(intnum,intmin,intmax)//检验数据是否合法
voidinit();//初始化
voiddoAdd();//增加联系人
voiddoDelete();//删除联系人
voiddoUpdate();//修改联系人
voiddoList();//显示所有联系人
voiddoSearchByName();//搜索联系人
voidwriteFile();//将所得数据写入文件中
(我负责增加,搜索和修改的函数)
(五)系统实现
主要模块的程序流程图:
1.输出通讯录的信息
2.添加信息
3.查找
4.修改
5.删除
6.退出
源程序的全部代码:
#include
#include
#include
//进行宏定义
#defineN1000//定义通讯录的容量
#defineNAMELEN22//名字长度上限
#defineNUMLEN12//电话号码长度上限
//定义部分
//定义联系人的结构体
typedefstructperson
{
charname[NAMELEN];//联系人
chartelNum[NUMLEN];//电话号码
}Person;
//存储所有的联系人,联系人的数组
Personcontacts[N];//能够存储100个联系人的结构体数组定义
//下面开始定义外部变量,省去每次定义变量的麻烦
inti=0;
intnum=0;
//定义联系人的个数
inttotalContactCount=0;
//接收用户输入的编号
intfno;
//定义数据文件保存的位置
char*filePath="telbook.data";
//函数声明
intvalidateInput(intnum,intmin,intmax);//检验数据是否合法
voidinit();//初始化
voiddoAdd();//增加联系人
voiddoDelete();//删除联系人
voiddoUpdate();//修改联系人
voiddoList();//显示所有联系人
voiddoSearchByName();//搜索联系人
voidwriteFile();//将所得数据写入文件中
/*
主程序功能:
编写循环控制程序
显示操作界面
根据编号执行不同的函数
*/
intmain(intargc,constchar*argv[])//用intargc记录输入的字符串个数;用*argv[]指针数组存放输入在命令行上的命令(字符串)。
{
init();
printf("通讯录初始化完成!
\n");
while
(1)
{
printf("\n");
//软件界面的显示
printf("****************************\n");
printf("******欢迎使用通讯录******\n");
printf("******1、添加联系人******\n");
printf("******2、删除联系人******\n");
printf("******3、修改联系人******\n");
printf("******4、查看所有联系人***\n");
printf("******5、搜索联系人******\n");
printf("******6、退出系统******\n");
printf("****************************\n\n");
//提示用户选择一个序号
printf("请选择1-6之间的功能编号:
\n");
scanf("%d",&fno);
//判断编号是否合法
validateInput(fno,1,6);
switch(fno){
case1:
//执行添加
doAdd();
break;
case2:
//执行删除
doDelete();
break;
case3:
//执行修改
doUpdate();
break;
case4:
//执行显示所有联系人
doList();
break;
case5:
//执行查找
doSearchByName();
break;
case6:
//执行退出系统
printf("系统正在退出...\n");
printf("系统已经退出!
\n");
return0;
break;
default:
break;
}
}
return0;
}
//函数部分
/*函数功能:
验证输入是否合法
其中:
num待验证的数
min最小值
max最大值
如果return1非法,0正常
*/
intvalidateInput(intnum,intmin,intmax)
{
if(num
{
printf("非法的输入!
");
return1;
}
return0;
}
/*
函数功能:
添加联系人
思路:
1、提示用户输入联系人姓名
2、接收联系人
3、提示用户输入电话号码
4、接收电话号码
5、确认添加
6、联系人的个数+1
7、把联系人信息写入到文件中
*/
voiddoAdd(){
printf("您选择的是添加联系人,请按提示操作:
\n");
//1、提示用户输入联系人姓名
printf("请输入联系人姓名:
(*注意联系人姓名中间不能有空格)\n");
//2、接收联系人
scanf("%s",contacts[totalContactCount].name);
//3、提示用户输入电话号码
printf("请输入联系人电话:
(*注意联系人电话号码中间不能有空格)\n");
//4、接收电话号码
scanf("%s",contacts[totalContactCount].telNum);
//5,检验其是否合法
num=strlen(contacts[totalContactCount].telNum);
if(validateInput(num,0,NUMLEN))
{
return;
}
//6、确认添加
intflag;
printf("您确认要添加数据吗?
1.确认0.取消\n");
scanf("%d",&flag);
if(flag!
=0)
{
//7、联系人的个数+1
totalContactCount++;
//8、把联系人信息写入到文件中
writeFile();
}
printf("\n\t成功添加了该联系人");
//9,是否继续添加
printf("\n\t是否继续添加联系人(y/n):
");
if(getch()=='y')
{
doAdd();
}
}
/*
函数功能:
删除联系人
思路:
1、提示用户输入一个联系人编号
2、判断编号是否合法编号不能大于联系人个数
3、提示用户再次确认删除
4、开始删除数组元素
1)删除的元素正好是数组的最后一个元素
只需要让联系人个数-1
2)如果删除的元素不是数组的最后一个元素
需要移动元素
联系人数量-1
5、同步更新到文件中
*/
voiddoDelete()
{
printf("您选择的是删除联系人,请按提示操作:
\n");
doList();
//1、提示用户输入一个联系人编号
intno;
printf("请输入要删除的联系人的编号:
\n");
scanf("%d",&no);
//2、判断编号是否合法编号不能大于联系人个数
if(validateInput(no,1,totalContactCount))
{
return;
}
//3、提示用户再次确认删除
intflag;
printf("删除联系人后,数据将无法恢复,您缺人要删除吗?
1.确认0.取消\n");
scanf("%d",&flag);
if(validateInput(flag,0,1))
{
return;
}
if(flag!
=0)
{
//4、开始删除数组元素
//1)删除的元素正好是数组的最后一个元素
if(no==totalContactCount){
totalContactCount--;
}else{
//2)如果删除的元素不是数组的最后一个元素
for(i=no;i contacts[no-1]=contacts[no]; } //-1s totalContactCount--; } //5、同步更新到文件中 writeFile(); } printf("\n\t成功删除了该联系人"); //是否继续删除 printf("\n\t是否继续删除联系人(y/n): "); if(getch()=='y') { doDelete(); } } /* 函数功能: 修改联系人 思路: 1、提示用户输入修改的信息编号 2、验证编号是否合法 3、输入新的用户名和新的电话号码 4、让用户再次确认修改 5、更新数组信息 6、写入到文件中 */ voiddoUpdate() { printf("您选择的是修改联系人,请按提示操作: \n"); doList(); //1、提示用户输入修改的信息编号 intno; printf("请输入要修改的联系人的编号: \n"); scanf("%d",&no); //2、判断编号是否合法编号不能大于联系人个数 if(validateInput(no,1,totalContactCount)) { return; } //3、输入新的用户名和新的电话号码 charname1[NAMELEN]; chartel[NUMLEN]; printf("请输入联系人新的姓名: (*注意联系人姓名中间不能有空格)\n"); scanf("%s",name1); printf("请输入联系人新的电话: (*注意联系人电话中间不能有空格)\n"); scanf("%s",tel); //4,检验其是否合法 num=strlen(tel); if(validateInput(num,0,NUMLEN)) { return; } //5、让用户再次确认修改 intflag; printf("确认后,信息将永久修改,您确认修改吗? 1.确认0.取消\n"); scanf("%d",&flag); if(flag! =0){ //6、更新数组信息 strcpy(contacts[no-1].name,name1); strcpy(contacts[no-1].telNum,tel); //7、写入到文件中 writeFile(); } } /* 函数功能: 显示所有联系人 思路: 前提: 系统已经完成了初始化工作(如果文件存在则读取文件中的所有的数据) 1、首先做一个判断 totalContactCount==0表示没有联系人 2、如果不等于0 开始遍历,并且按照首字母排序输出联系人的信息 */ voiddoList() { printf("显示所有联系人,联系人数据如下: \n"); //1,判断通讯录是否为空 if(totalContactCount==0) { printf("您的通讯录还没有小伙伴~请添加小伙伴! \n"); } else { printf("编号\t姓名\t电话\t\n"); //2,交换法,按照首字母排序 Personcontact[N]; Persont; intj; for(i=0;i contact[i]=contacts[i]; for(i=0;i { for(j=i+1;j { if(strcmp(contact[i].name,contact[j].name)>0) { t=contact[i]; contact[i]=contact[j]; contact[j]=t; } } } for(i=0;i contacts[i]=contact[i]; //3,遍历输出联系人数组 for(i=0;i { printf("%d\t%s\t%s\t\n",i+1,contacts[i].name,contacts[i].telNum); } } } /* 函数功能: 搜索联系人 思路; 1、提示用户输入要搜索的联系人姓名 2、按照姓名或关键字进行查找(遍历) 1)输入的姓名和contacts[i].name比较 2)若搜索不到 进行关键字比较 3)遍历一遍都没有这个名称提示查无此人 */ voiddoSearchByName() { printf("您选择的是搜索联系人,请按提示操作: \n"); //1、提示用户输入要搜索的联系人姓名 charName[NAMELEN]; printf("请输入要查找的联系人姓名或关键字: \n"); scanf("%s",Name); //2、按照姓名进行查找(遍历) intk=0,check=0; for(i=0;i { if(strcmp(Name,contacts[i].name)==0) //1)输入的姓名和contacts[i].name比较 { printf("您搜索的联系人%s的电话号码是: %s\n",Name,contacts[i].telNum); check=1; break; } else //2)若搜索不到,则进行关键字比较 { for(k=0;k { if(Name[k]! =contacts[i].name[k]) { break; } printf("您搜索的联系人%s的电话号码是: %s\n",contacts[i].name,contacts[i].telNum); check=1; break; } } } //3)遍历一遍都没有这个名称提示查找不到 if(check==0) { printf("对不起,查无此人! \n"); } } /* 函数功能: 通讯录的初始化 1、尝试读取数据文件 2、如果读取成功,说明文件存在 如果存在,要读取联系人数据,保存到联系人数组contacts 3、如果读取失败,说明我们是第一次使用通讯录 如果是第一次使用 1)创建联系人数据文件 2)把当前联系人的个数写入到文件中totalContactCount=0 */ voidinit(){ //1,定义文件指针,并且打开文件 FILE*fp=fopen(filePath,"r"); if(fp! =NULL) { //2,读取联系人的个数 fread(&totalContactCount,sizeof(totalContactCount),1,fp); /*运用fread函数: intfread(pt,size,n,fp)返回所读的数据项个数,若文件出错则返回0; 用于接收数据的地址(指针)(buffer) 单个元素的大小(size): 单位是字节而不是位,例如读取一个int型数据就是4个字节 元素个数(count) 提供数据的文件指针(stream)*/ //3,读取每一个联系人34 for(i=0;i { fread(&contacts[i],sizeof(Person),1,fp); } } else { //创建文件 fp=fopen(filePath,"wb"); //写入联系人的个数 fwrite(&totalContactCount,sizeof(totalContactCount),1,fp); printf("通讯录文件创建成功~! \n"); } //关闭文件指针 fclose(fp); } /* 函数功能: 写数据到文件中 思路: 1、以wb方式打开文件 2、先写联系人个数 3、写每个联系人数据 */ voidwriteFile(){ //1、以wb方式打开文件 FILE*fp=fopen(filePath,"wb"); if(fp! =NULL) { //2、先写联系人个数 fwrite(&totalContactCount,sizeof(totalContactCount),1,fp); //3、写每个联系人数据 for(i=0;i { fwrite(&contacts[i],sizeof(Person),1,fp); } printf("写文件数据更新成功! \n"); } //4、关闭文件指针 fclose(fp); } (请注明代码所在的文件及文件名,如有多个文件,请一一注明) (六)实验步骤及调试过程 问题如下: 1.在进行首字母排序的时候,把排序的代码和原来子函数中显示信息的代码顺序弄反,导致不显示;而且再排序是引入新变量contact,并把原结构体赋值给它,但排序后忘记将contact赋值回原结构体 2.关键字查找的代码无法避免“查无此人”的输出,最后引入新变量标记check解决 (七)实验结果 (请以截图的方式把实验运行结果粘贴在下方,并注明程序中各个功能的显示结果) 1.初始化 2.添加 3.删除 4.查看 5.搜索 (八)分析总结 思路: 1、引入头文件 2、进行必要的宏定义 3、定义文件名称变量、联系人数组、联系人结构体 4、定义函数,并进行函数声明 5、编写循环控制程序 6、显示操作界面 7、根据编号执行不同的函数 体会: 1.在进行首字母排序的时候,把排序的代码和原来子函数中显示信息的代码顺序弄反,导致不显示;而且再排序是引入新变量contact,并把原结构体赋值给它,但排序后忘记将contact赋值回原结构体 2.关键字查找的代码无法避免“查无此人”的输出,最后引入新变量标记check解决 参考文献 [1] 苏小红,王宇颖,孙志岗.C语言程序设计(第3版)[M].北京: 高等教育出版社.2015 [2]苏小红,王宇颖,孙志岗.C语言程序设计学习指导(第3版)[M].北京: 高等教育出版社.2015
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 通讯录