用结构体数组编写电话通讯录,必须得知道结构体的形式,那先把结构体定义回顾一下:
一般形式为:(1)struct 结构体名称
{成员表列} 数组名 [数组长度]
如:struct Person leader[3]
(2)对结构体数组初始化的形式是在定义定义数组的后面:={初值列表};
如struct Person leader [3]={"li",0,"zhang",0,"sun",0};
结构体指针:
比如:struct Student *pt;//pt 可以指向struct Student 类型的变量或数组元素
在结构体中,可以用typedef声明新类型名,如:
typedef struct per{
int a:
char b;
}PER;
此时PER就是per的新名称
通讯录必须的有联系人的信息:姓名,年龄,性别, 电话,地址
然后分别用添加函数,删除函数,查找函数,修改函数,显示函数,清空函数来实现通讯录
void add(Pcon pcon);//添加函数
void del(Pcon pcon);//删除函数
void search(Pcon pcon);//查找函数
void modify(Pcon pcon);//修改函数
void show(Pcon pcon);//显示函数
void clear(Pcon pcon);//清空函数
最后用contact.h contact.c 分别编写存储函数
contact.h
<span style="font-size:18px;">#ifndef _CONTACT_H_//宏定义通讯录
#define _CONTACT_H_ //宏定义通讯录
#define NAME_LEN 30//全局变量
#define SEX_LEN 5//全局变量
#define TELP_LEN 12//全局变量
#define GRO_LEN 15//全局变量
#define MAX_PER 1000//全局变量
typedef struct per{
char name[NAME_LEN];
char sex[SEX_LEN];
int age;
char telp[TELP_LEN];
char gro[GRO_LEN];
}PER,*PPER;
typedef struct Contact{
PER dhb[MAX_PER];
int count;
}PCON,*Pcon;
void add(Pcon pcon);//添加函数
void del(Pcon pcon);//删除函数
void search(Pcon pcon);//查找函数
void modify(Pcon pcon);//修改函数
void show(Pcon pcon);//显示函数
void clear(Pcon pcon);//清空函数
#endif</span>
contact.c
<span style="font-size:18px;">#include <stdio.h>
#include "contact.h"
#include <string.h>
int find(char *p,Pcon pcon)//在这封装一个find函数,在以后的函数里直接调用
{
int i=0;
for(i=0;i<pcon->count;i++)
{
if(strcmp(p,pcon->dhb[i].name)==0)//strcmp为字符串比较函数
{
return i;
}
}
return -1;
}
void add(Pcon pcon)
{
if(pcon->count<MAX_PER)
{
printf("请输入联系人名字:");
scanf("%s",(pcon->dhb[pcon->count]).name);//结构体中变量间接访问成员
printf("请输入年龄:");
scanf("%d",&(pcon->dhb[pcon->count].age));
printf("请输入性别:");
scanf("%s",pcon->dhb[pcon->count].sex);
printf("请输入电话:");
scanf("%s",pcon->dhb[pcon->count].telp);
printf("请输入地址:");
scanf("%s",pcon->dhb[pcon->count].gro);
pcon->count++;
printf("ok!添加成功!\n");
}
else
{
printf("电话本已满!退出\n");
return ;
}
}
void del(Pcon pcon)
{
char name[NAME_LEN];
int k=0;
int ret=0;
printf("请输入你要删除的人的名字:");
scanf("%s",name);
ret=find(name,pcon);//调用find函数
if(ret==-1)
{
printf("no exit\n");
}
else
{
for(k=ret;k<pcon->count-1;k++)
{
pcon->dhb[k-1]=pcon->dhb[k];
}
}
pcon->count --;//删除一个成员后,计数器自减1
printf("删除成功");
}
void search(Pcon pcon)
{
char name[NAME_LEN];
int ret = 0;
if(ret == -1)
{
printf("no exit\n");
}
else
{
printf("请输入要查找的联系人的名字:");
scanf("%s",name);
ret = find(name,pcon);
printf("%12s",(pcon->dhb[ret]).name);
printf("%12d",(pcon->dhb[ret]).age);
printf("%12s",pcon->dhb[ret].sex);
printf("%12s",pcon->dhb[ret].telp);
printf("%12s\n",pcon->dhb[ret].gro);
}
}
void modify(Pcon pcon)
{
char name[NAME_LEN];
int ret=0;
printf("请输入你要修改人的名字:");
scanf("%s",name);
ret=find(name,pcon);
if(ret=-1)
{
printf("no exit\n");
}
else
{
printf("请输入修改的联系人的姓名:\n");
scanf("%s",pcon->dhb[ret].name);
printf("请输入修改的联系人的性别:\n");
scanf("%s",pcon->dhb[ret].sex);
printf("请输入修改的联系人的年龄:\n");
scanf("%d",&pcon->dhb[ret].age);
printf("请输入修改的联系人的电话:\n");
scanf("%s",pcon->dhb[ret].telp);
printf("请输入修改的联系人的住址:\n");
scanf("%s",pcon->dhb[ret].gro);
printf("修改成功\n");
}
}
void show(Pcon pcon)
{
int j;
for(j=0;j<pcon->count;j++)
{
printf("%s\n",pcon->dhb[j].name);
printf("%s\n",pcon->dhb[j].sex);
printf("%d\n",pcon->dhb[j].age);
printf("%s\n",pcon->dhb[j].telp);
printf("%s\n",pcon->dhb[j].gro);
}
}
void clear(Pcon pcon)
{
pcon->count=0;//只要设定的电话本里的计数器count归零就达到了清空的作用
}
void menu()//菜单选择函数
{
printf("*****************************\n");
printf("*** 1>add ***\n");
printf("*** 2>del ***\n");
printf("*** 3>search ***\n");
printf("*** 4>modify ***\n");
printf("*** 5>show ***\n");
printf("*** 6>clear ***\n");
printf("*****************************\n");
}
int main()//主函数中定义选择语句
{
PCON con;//此时PCON为类型
int input = 1;
con.count = 0;//对count初始化为0,说明此时电话本为空
while(input)
{
menu();
printf("请输入你的选择>:");
scanf("%d",&input);
switch(input)
{
case 1:
add(&con);
break;
case 2:
del(&con);
break;
case 3:
search(&con);
break;
case 4:
modify(&con);
break;
case 5:
show(&con);
break;
case 6:
clear(&con);
break;
default:
break;
}
}
return 0;
}
</span>
运行结果:
在我们学了文件的读写后,那自然可以给这个电话本添加一个新的功能:保存
在此,我们会用到fread,fwrite函数
它们用来读写一个数据块。
1一般调用的方式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
2 说明:
(1buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
注意:1 完成次写操(fwrite())作后必须关闭流(fclose());
2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
下面是部分代码:
<span style="font-size:18px;">void init(Pcon pcon)
{
int i;
FILE *fp=fopen("contact.txt","w");
if(fp==NULL)
{
perror("contact.txt:");
exit(EXIT_FAILURE);
}
while(fread(&(pcon->dhb[i]),sizeof(PER),1,fp)==1)
{
i++;
}
pcon->count=i;
fclose(fp);
}
void save(Pcon pcon)
{
int j;
FILE *fpwrite;
fpwrite=fopen("contact.txt","w");
if (fpwrite==NULL)
{
perror("contact.txt:");
exit(EXIT_FAILURE);
}
for(j= 0;j<pcon->count;j++)
{
fwrite(&(pcon->dhb[j]),sizeof(PER),1,fpwrite);
}
fclose(fpwrite);
}</span>
只要在头文件里加上这两个函数的一些声明就可执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)