结构体写通讯录

本文介绍了一个基于C语言实现的简易通讯录管理系统,该系统具备添加、删除、查找、修改、显示和保存联系人等功能。通过结构体组织联系人信息,并使用文件操作实现数据持久化。
    <pre name="code" class="cpp">#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);//清空函数  

void save(Pcon pcon);
void init(Pcon pcon);
#endif
#include <stdio.h>  
#include <stdlib.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 init(Pcon pcon)
{
	int i=0;
	FILE*pfread=fopen("contact.txt","r");
	if(pfread==NULL)
	{
		perror("contact.txt");
		exit(EXIT_FAILURE);
	}
	while(fread(&(pcon->dhb[i]),sizeof(PER),1,pfread)==1)
	{
		i++;
	}
	pcon->count=i;
	fclose(pfread);
}

void save(Pcon pcon)
{
	int i=0;
	FILE*pfwrite=fopen("contact.txt","w");
	if(pfwrite==NULL)
	{
		perror("contact.txt");
		exit(EXIT_FAILURE);
	}
	for(i=0;i<pcon->count;i++)
	{
		fwrite(&(pcon->dhb[i]),sizeof(PER),1,pfwrite);
	}
	fclose(pfwrite);
}

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("***     7>save          ***\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;  
		case 7:
			save(&con);
			break;
	
        default:  
            break;  
        }  
    }  
  
    return 0;  
}  



                
乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值