通讯录C语言程序设计.docx

上传人:b****8 文档编号:10500883 上传时间:2023-02-14 格式:DOCX 页数:18 大小:20.37KB
下载 相关 举报
通讯录C语言程序设计.docx_第1页
第1页 / 共18页
通讯录C语言程序设计.docx_第2页
第2页 / 共18页
通讯录C语言程序设计.docx_第3页
第3页 / 共18页
通讯录C语言程序设计.docx_第4页
第4页 / 共18页
通讯录C语言程序设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

通讯录C语言程序设计.docx

《通讯录C语言程序设计.docx》由会员分享,可在线阅读,更多相关《通讯录C语言程序设计.docx(18页珍藏版)》请在冰豆网上搜索。

通讯录C语言程序设计.docx

通讯录C语言程序设计

实验五:

通讯录

第一部分本次上机目标

编写程序实现对通讯录的管理,应实现以下功能:

1)通讯录编辑(添加、删除);

2)按不同的项进行查找;

3)对已存在的通讯录按不同的项排序;

4)将通讯录写入文件;

5)从文件读入通讯录。

任务1:

数据类型的创建和变量的准备

typedefstruct/*定义数据结构*/

{

charname[20];/*姓名*/

charunits[30];/*单位*/

chartele[10];/*电话*/

}ADDRESS;

任务2:

各模块函数的设计

intenter(ADDRESSt[]);/*输入记录*/

voidlist(ADDRESSt[],intn);/*显示记录*/

voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/

intdelete(ADDRESSt[],intn);/*删除记录*/

intadd(ADDRESSt[],intn);/*插入记录*/

voidsave(ADDRESSt[],intn);/*记录保存为文件*/

intload(ADDRESSt[]);/*从文件中读记录*/

voiddisplay(ADDRESSt[]);/*按序号查找显示记录*/

voidsort(ADDRESSt[],intn);/*按姓名排序*/

voidqseek(ADDRESSt[],intn);/*快速查找记录*/

voidcopy();/*文件复制*/

voidprint(ADDRESStemp);/*显示单条记录*/

intfind(ADDRESSt[],intn,char*s);/*查找函数*/

intmenu_select();/*主菜单函数*/

任务3:

主函数的设计

用于预期功能的测试。

设计要求

通过用所学的C语言知识设计出一个尽量接近实际的通讯录管理程序。

1、设计思路

(1)分析总结通讯录中数据的构成,并抽象成数据类型;

(2)分析通讯录管理中应该具备的功能:

输入、输出、查询、修改、显示等;并设计相应的函数以实现该功能;

(3)完成对数据的存盘和调取,用函数的形式来确立数据保存与读取的任务;

(4)设计并模拟菜单功能,单独设计实现具有菜单功能的函数,并有足够的提示信息;

(5)设计主函数用以测试所有功能。

2、重点难点

重点是对结构体类型的定义和对结构体数组的定义和使用,以及用结构体的指针做函数参数。

难点是对文件进行读写操作对于学生来说是比较难的。

第二部分上机任务

分阶段完成如下任务

阶段1:

指导

加强对函数分块概念的指导,要求学生尽量保持清晰的思路

1、训练要点

对结构体的运用

2、需求说明

需要全面仔细的分析通讯录管理系统应该具备的功能,通讯录数据应该具有的形式,以及函数间对于通讯录数据的传递方式。

3、实现思路

以结构体类型为单个通讯录信息实现方式,并采用结构体数组为存储多个通讯录信息的载体,并以函数为单位来实现各个功能。

4、程序设计图

(1)框图

5、评分标准

评分重点放在面向过程设计方法和实际编写代码能力这两个方面。

凡是能够基本完成程序设计,画出合理的设计框图,建立基本的代码框架,均视为及格。

能够以清晰的思路设计出较为详细的程序流程图,并编写代码实现大部分功能,没有重大语法错误的可以视为良好。

如果程序功能完备,运行无误,并在设计上有一定的独到之处,或者编写的代码具有良好的设计风格,规范易读,此类设计视为优秀。

6、参考代码

/******头文件(.h)***********/

#include"stdio.h"/*I/O函数*/

#include"stdlib.h"/*标准库函数*/

#include"string.h"/*字符串函数*/

#include"ctype.h"/*字符操作函数*/

#defineM50/*定义常数表示记录数-宏定义*/

typedefstruct/*定义数据结构*/

{

charname[20];/*姓名*/

charunits[30];/*单位*/

chartele[10];/*电话*/

}ADDRESS;

/******以下是函数原型*******/

intenter(ADDRESSt[]);/*输入记录*/

voidlist(ADDRESSt[],intn);/*显示记录*/

voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/

intdelete(ADDRESSt[],intn);/*删除记录*/

intadd(ADDRESSt[],intn);/*插入记录*/

voidsave(ADDRESSt[],intn);/*记录保存为文件*/

intload(ADDRESSt[]);/*从文件中读记录*/

voiddisplay(ADDRESSt[]);/*按序号查找显示记录*/

voidsort(ADDRESSt[],intn);/*按姓名排序*/

voidqseek(ADDRESSt[],intn);/*快速查找记录*/

voidcopy();/*文件复制*/

voidprint(ADDRESStemp);/*显示单条记录*/

intfind(ADDRESSt[],intn,char*s);/*查找函数*/

intmenu_select();/*主菜单函数*/

/******主函数开始*******/

main()

{

inti;

ADDRESSadr[M];/*定义结构体数组*/

intlength;/*保存记录长度*/

clrscr();/*清屏*/

for(;;)/*无限循环*/

{

switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/

{

case0:

length=enter(adr);break;/*输入记录*/

case1:

list(adr,length);break;/*显示全部记录*/

case2:

search(adr,length);break;/*查找记录*/

case3:

length=delete(adr,length);break;/*删除记录*/

case4:

length=add(adr,length);break;/*插入记录*/

case5:

save(adr,length);break;/*保存文件*/

case6:

length=load(adr);break;/*读文件*/

case7:

display(adr);break;/*按序号显示记录*/

case8:

sort(adr,length);break;/*按姓名排序*/

case9:

qseek(adr,length);break;/*快速查找记录*/

case10:

copy();break;/*复制文件*/

case11:

exit(0);/*如返回值为11则程序结束*/

}

}

}

/*菜单函数,函数返回值为整数,代表所选的菜单项*/

menu_select()

{

chars[80];

intc;

gotoxy(1,25);/*将光标定为在第25行,第1列*/

printf("pressanykeyentermenu......\n");/*提示压任意键继续*/

getch();/*读入任意字符*/

clrscr();/*清屏*/

gotoxy(1,1);

printf("********************MENU菜单*********************\n\n");

printf("0.Enterrecord\n");

printf("1.Listthefile\n");

printf("2.Searchrecordonname\n");

printf("3.Deletearecord\n");

printf("4.addrecord\n");

printf("5.Savethefile\n");

printf("6.Loadthefile\n");

printf("7.displayrecordonorder\n");

printf("8.sorttomakenewfile\n");

printf("9.Quickseekrecord\n");

printf("10.copythefiletonewfile\n");

printf("11.Quit\n");

printf("***********************************************\n");

do{

printf("\nEnteryouchoice(0~11):

");/*提示输入选项*/

scanf("%s",s);/*输入选择项*/

c=atoi(s);/*将输入的字符串转化为整型数*/

}while(c<0||c>11);/*选择项不在0~11之间重输*/

returnc;/*返回选择项,主程序根据该数调用相应的函数*/

}

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/

intenter(ADDRESSt[])

{

inti,n;

char*s;

clrscr();/*清屏*/

printf("\npleaseinputnum\n");/*提示信息*/

scanf("%d",&n);/*输入记录数*/

printf("pleaseinputrecord\n");/*提示输入记录*/

printf("nameunittelephone\n");

printf("------------------------------------------------\n");

for(i=0;i

{

scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);/*输入记录*/

printf("----------------------------------------------\n");

}

returnn;/*返回记录条数*/

}

/*显示记录,参数为记录数组和记录条数*/

voidlist(ADDRESSt[],intn)

{

inti;

clrscr();

printf("\n\n*******************ADDRESS******************\n");

printf("nameunittelephone\n");

printf("------------------------------------------------\n");

for(i=0;i

printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);

if((i+1)%10==0)/*判断输出是否达到10条记录*/

{

printf("Pressanykeycontinue...\n");/*提示信息*/

getch();/*压任意键继续*/

}

printf("************************end*******************\n");

}

/*查找记录*/

voidsearch(ADDRESSt[],intn)

{

chars[20];/*保存待查找姓名字符串*/

inti;/*保存查找到结点的序号*/

clrscr();/*清屏*/

printf("pleasesearchname\n");

scanf("%s",s);/*输入待查找姓名*/

i=find(t,n,s);/*调用find函数,得到一个整数*/

if(i>n-1)/*如果整数i值大于n-1,说明没找到*/

printf("notfound\n");

else

print(t[i]);/*找到,调用显示函数显示记录*/

}

/*显示指定的一条记录*/

voidprint(ADDRESStemp)

{

clrscr();

printf("\n\n********************************************\n");

printf("nameunittelephone\n");

printf("------------------------------------------------\n");

printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);

printf("**********************end***********************\n");

}

/*查找函数,参数为记录数组和记录条数以及姓名s*/

intfind(ADDRESSt[],intn,char*s)

{

inti;

for(i=0;i

{

if(strcmp(s,t[i].name)==0)/*记录中的姓名和待比较的姓名是否相等*/

returni;/*相等,则返回该记录的下标号,程序提前结结束*/

}

returni;/*返回i值*/

}

/*删除函数,参数为记录数组和记录条数*/

intdelete(ADDRESSt[],intn)

{

chars[20];/*要删除记录的姓名*/

intch=0;

inti,j;

printf("pleasedeletedname\n");/*提示信息*/

scanf("%s",s);/*输入姓名*/

i=find(t,n,s);/*调用find函数*/

if(i>n-1)/*如果i>n-1超过了数组的长度*/

printf("nofoundnotdeleted\n");/*显示没找到要删除的记录*/

else

{

print(t[i]);/*调用输出函数显示该条记录信息*/

printf("Areyousuredeleteit(1/0)\n");/*确认是否要删除*/

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].units,t[j].units);/*将后一条记录的单位拷贝到前一条*/

strcpy(t[j-1].tele,t[j].tele);/*将后一条记录的电话拷贝到前一条*/

}

n--;/*记录数减1*/

}

}

returnn;/*返回记录数*/

}

/*插入记录函数,参数为结构体数组和记录数*/

intadd(ADDRESSt[],intn)/*插入函数,参数为结构体数组和记录数*/

{

ADDRESStemp;/*新插入记录信息*/

Inti,j;

chars[20];/*确定插入在哪个记录之前-*/

printf("pleaseinputrecord\n");

printf("************************************************\n");

printf("nameunittelephone\n");

printf("--------------------------------------------------\n");

scanf("%s%s%s",temp.name,temp.units,temp.tele);/*输入插入信息*/

printf("------------------------------------------------\n");

printf("pleaseinputlocatename\n");

scanf("%s",s);/*输入插入位置的姓名*/

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].units,t[j].units);/*当前记录的单位拷贝到后一条*/

strcpy(t[j+1].tele,t[j].tele);/*当前记录的电话拷贝到后一条*/

}

strcpy(t[i].name,temp.name);/*将新插入记录的姓名拷贝到第i个位置*/

strcpy(t[i].units,temp.units);/*将新插入记录的单位拷贝到第i个位置*/

strcpy(t[i].tele,temp.tele);/*将新插入记录的电话拷贝到第i个位置*/

n++;/*记录数加1*/

returnn;/*返回记录数*/

}

/*保存函数,参数为结构体数组和记录数*/

voidsave(ADDRESSt[],intn)

{

inti;

FILE*fp;/*指向文件的指针*/

if((fp=fopen("record.txt","wb"))==NULL)/*打开文件,并判断打开是否正常*/

{

printf("cannotopenfile\n");/*没打开*/

exit

(1);/*退出*/

}

printf("\nSavingfile\n");/*输出提示信息*/

fprintf(fp,"%d",n);/*将记录数写入文件*/

fprintf(fp,"\r\n");/*将换行符号写入文件*/

for(i=0;i

{

fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式写入记录*/

fprintf(fp,"\r\n");/*将换行符号写入文件*/

}

fclose(fp);/*关闭文件*/

printf("****savesuccess***\n");/*显示保存成功*/

}

/*读入函数,参数为结构体数组*/

intload(ADDRESSt[])

{

inti,n;

FILE*fp;/*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/

{

printf("cannotopenfile\n");/*不能打开*/

exit

(1);/*退出*/

}

fscanf(fp,"%d",&n);/*读入记录数*/

for(i=0;i

fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele);/*按格式读入记录*/

fclose(fp);/*关闭文件*/

printf("Youhavesuccessreaddatafromfile!

!

!

\n");/*显示保存成功*/

returnn;/*返回记录数*/

}

/*按序号显示记录函数*/

voiddisplay(ADDRESSt[])

{

intid,n;

FILE*fp;/*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/

{

printf("cannotopenfile\n");/*不能打开文件*/

exit

(1);/*退出*/

}

printf("Enterordernumber...\n");/*显示信息*/

scanf("%d",&id);/*输入序号*/

fscanf(fp,"%d",&n);/*从文件读入记录数*/

if(id>=0&&id

{

fseek(fp,(id-1)*sizeof(ADDRESS),1);/*移动文件指针到该记录位置*/

print(t[id]);/*调用输出函数显示该记录*/

printf("\r\n");

}

else

printf("no%dnumberrecord!

!

!

\n",id);/*如果序号不合理显示信息*/

fclose(fp);/*关闭文件*/

}

/*排序函数,参数为结构体数组和记录数—按姓名*/

voidsort(ADDRESSt[],intn)

{

inti,j,flag;

ADDRESStemp;/*临时变量做交换数据用*/

for(i=0;i

{

flag=0;/*设标志判断是否发生过交换*/

for(j=0;j

if((strcmp(t[j].name,t[j+1].name))>0)/*比较大小*/

{

flag=1;

strcpy(temp.name,t[j].name);/*交换记录*/

strcpy(temp.units,t[j].units);

strcpy(temp.tele,t[j].tele);

strcpy(t[j].name,t[j+1].name);

strcpy(t[j].units,t[j+1].units);

strcpy(t[j].tele,t[j+1].tele);

strcpy(t[j+1].name,temp.name);

strcpy(t[j+1].units,temp.units);

strcpy(t[j+1].tele,temp.tele);

}

if(flag==0)break;/*如果标志为0,说明没有发生过交换循环结束*/

}

printf("sortsucess!

!

!

\n");/*显示排序成功*/

}

/*快速查找,参数为结构体数组和记录数*/

voidqseek(ADDRESSt[],intn)

{

chars[20];

intl,r,m;

prin

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

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

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

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