大实验报告之通讯录.docx

上传人:b****5 文档编号:4946012 上传时间:2022-12-12 格式:DOCX 页数:24 大小:200.38KB
下载 相关 举报
大实验报告之通讯录.docx_第1页
第1页 / 共24页
大实验报告之通讯录.docx_第2页
第2页 / 共24页
大实验报告之通讯录.docx_第3页
第3页 / 共24页
大实验报告之通讯录.docx_第4页
第4页 / 共24页
大实验报告之通讯录.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

大实验报告之通讯录.docx

《大实验报告之通讯录.docx》由会员分享,可在线阅读,更多相关《大实验报告之通讯录.docx(24页珍藏版)》请在冰豆网上搜索。

大实验报告之通讯录.docx

大实验报告之通讯录

高级语言程序设计实验报告

实验项目名称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(nummax)

{

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1