用结构体编写电话通讯录

2023-05-16

用结构体数组编写电话通讯录,必须得知道结构体的形式,那先把结构体定义回顾一下:

一般形式为:(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(使用前将#替换为@)

用结构体编写电话通讯录 的相关文章

  • 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?

    什么是序列化 序列化 xff1a 把对象转换为字节序列的过程称为对象的序列化 反序列化 xff1a 把字节序列恢复为对象的过程称为对象的反序列化 怎么序列化 实现Serializable接口 xff0c 指定serialVersionUID
  • 寻迹小车笔记——红外对管(TCRT5000)原理

    一 概述 深色 xff08 黑色 xff09 的是发射端 xff0c 白色 xff08 透明 xff09 的是接收端 中间蓝色的是可以调节灵敏度的旋钮 TCRT5000光电传感器模块是基于TCRT5000红外光电传感器设计的一款红外反射式光
  • C语言判断一个数是否是水仙花数

    水仙花数是指一个N位正整数 xff08 N 3 xff09 xff0c 它的每个位上的数字的N次幂之和等于它本身 例如 xff1a 153 61 1 3 43 5 3 43 3 3 include lt stdio h gt int nar
  • C语言分类统计字符个数

    题目来源 xff1a 分类统计字符个数 PTA 本题要求实现一个函数 xff0c 统计给定字符串中英文字母 空格或回车 数字字符和其他字符的个数 函数接口定义 xff1a void StringCount char s 其中 char s
  • MIPS单周期CPU的设计——I型指令的设计

    一 一些概念 1 单周期CPU 指令周期 xff1a CPU从内存取出一条指令并执行这条指令的时间总和 CPU周期 xff1a 又称机器周期 xff0c CPU访问一次内存所花的时间较长 xff0c 因此用从内存读取一条指令字的最短时间来定
  • MIPS单周期CPU设计——lw和sw指令的设计

    1 lw xff0c sw指令格式及功能 指令 31 26 25 21 20 16 15 0 意义lw100011rsrtoffset从数存 xff08 数据存储器 xff09 中取数据写进寄存器sw101011rsrtoffset将寄存器
  • 计算机网络传输层概念及其协议

    一 概念 链路层保证的是点到点的可靠传输 xff0c 传输层保证端到端的可靠性 传输层是进程之间的通信 传输实体 xff1a 在收 发两端的传输层实现对等实体通信的硬件或软件 实现TCP协议的用户进程或者硬件称为TCP的传输实体 二 TCP
  • C++big three(构造函数、拷贝构造函数,拷贝赋值函数)

    一个类中只要带有指针类型的成员 xff0c 就必须自己写出big three xff08 构造函数 拷贝构造函数 xff0c 拷贝赋值函数 xff09 xff0c 如果没有指针类型的成员 xff0c 大部分情况下可以用默认的 字符串类是一个
  • 电网中DTU FTU RTU TTU的区别

    FTU xff08 Feeder Terminal Unit xff09 xff1a 馈线开关监控终端是装设在10KV断路器 负荷开关的开关监控装置 主要作用是采集各开关所在线路的电气参数 xff0c 并将这些信息向上级系统传输 xff1b
  • 他山之石可以攻玉

    计算之外的喜欢这一栏创建很久了 xff0c 但是一直没有内容 xff0c 目前勉强能够记录的大概就是我这一年里 xff08 2021 2022 xff09 读的书吧 人的一生很短暂 xff0c 也很宝贵 xff0c 能够在太平时节经历喜怒哀
  • 关于天干地支及其计算

    以天干地支计算日期是我国悠良的传统文化 xff0c 最近在看如何计算人的生辰八字 xff0c 写了个程序 xff0c 但是只能算年的干支 xff0c 月 日的干支计算方法太复杂了 xff0c 望之只能却步 xff0c 还是乖乖去查万年历比较
  • petalinux配置的系统启动出现cannot set terminal process group (-1): Inappropriate ioctl for device的问题解决小记

    配置好的系统在启动的时候出现cannot set terminal process group 1 Inappropriate ioctl for device 随后无法正常启动系统 经过判断后觉得是vivado生成的文件导入到petali
  • VL53L1X移植到STM32实战记录,使用软件IIC(附源代码)

    序言 VL53L1X是一个很小又很优秀的测距传感器 xff0c 它相比于上一代VL53L0X有着不小的提升 xff0c 这次毕业设计打算将这个传感器用起来 xff0c 就来移植了一下 xff0c 遇到的坑怎么说还是有一些 xff0c 故在此
  • 使用ZeroTier搭建虚拟局域网,完成虚拟局域网内直连

    此文章涉及 xff1a Zerotier速度慢的解决办法 Zerotier实际应用展示 Zerotier简单实用教程 技术背景 在经过接近一个学期的互联网安全的学习 xff0c 我接触到了网络的很多种攻击 xff0c 渗透与防守的方式 从这
  • vitis HLS 在进行C simulation时遇到工程csim/build/csim.exe not found 报错的问题排查

    在进行HLS设计学习时 xff0c 想对写好的东西进行C代码模拟 xff0c 但最后提示存在错误 xff0c 如下 xff1a 查看错误信息的话 xff0c 只有抽象的ERROR SIM 211 100 CSim file generati
  • ubuntu20.04 下使用cgroup 限制内存

    本实践的主要操作请参照 参考链接 进行 由于在实践中主要想完成的目标是限制服务器中用户 用户组的内存使用 xff0c 防止某个用户占用过多的cpu 内存导致其他用户无法正常使用甚至服务器宕机 xff0c 因此需要手动加cgexec指令的实验
  • 通过github action完成自动多平台编译和docker推送

    简介 因为一个小项目 xff0c 之前一直是手动制作镜像 xff0c 现在需要用docker部署 xff0c 然后还要基于arm64编译 xff0c 想着不如实践一下 xff0c 学习一下github action和Dockerfile的编
  • 让你的 STM32Cube KEILV5 + HAL库工程支持C++开发

    前言 最近这段时间在弄一个新的STM32F4的项目 xff0c 因为工程比较庞大 xff0c 然后各种类型也比较复杂 xff0c 在封装整理的时候就非常头疼 xff0c 很想通过C 43 43 的类 xff0c 继承 xff0c 多态的方式
  • ESP8266 TCP ERROR CLOSED的常见原因及解决办法

    前言 最近在使用ESP8266的简单AT指令做串口透传 xff0c 本来想着和HC 05的蓝牙串口差不多简单吧 xff0c xff0c 结果发现ESP8266似乎并没有像HC 05那么易用 xff0c 需要配置的东西还挺多的 xff0c 而
  • (二)TCP客户端/服务器通信------select函数

    xff08 一 xff09 select函数 该函数允许进程指示内核等待多个事件中的任何一个发生 xff0c 并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它 也就是说 xff0c 我们调用select告知内核对哪些描述符 xff0

随机推荐

  • QGC参数请求流程(第一集)

    xff31 xff27 xff23 参数请求流程 xff08 第一集 xff09 联系作者 QQ 843230304 如流程图所示 xff1a 对应 xff31 xff27 xff23 的ParameterManager模块 xff0c 这
  • 航模螺旋桨型号

    1 有两个重要的参数 xff0c 桨直径和桨螺距 xff0c 单位均为英寸 比如8060桨 xff0c 就是说这个桨直径是8英寸 即8 2 54 xff1d 20 32厘米 螺距则为6英寸 螺距则代表桨旋转一周前进的距离
  • 用Java代码实现选择排序法

    package com hu controller public class Test public static void main String args 声明一个整形的数组 并手动输入几个数 int arr 61 11 665 985
  • C语言递归的方法实现斐波那契

    int fib int n void main int n 61 10 int result 61 fib n printf 34 d 34 result int fib int n if n gt 61 3 原题目这里是if n gt 6
  • 支持ie7,ie8,ff,不完全支持ie6的js日期控件

    var MonthDNum 61 new Array 0 31 28 31 30 31 30 31 31 30 31 30 31 var MonthText 61 new Array 34 34 34 一月 34 34 二月 34 34 三
  • oracle主键生成方式

    oracle主键 两种方法 自增主键sequence SYS GUID 生成唯一序列 一 自增主键 创建一个表 create table test NID int PRIMARY KEY oracle主键 两种方法 自增主键sequence
  • Vmware vSphere(一)安装vSphere client 以及 ubuntu

    大致流程见附件 VMware Tools 安装 xff0c 使用 xff0c 命令 xff1a vmware toolbox http blog csdn net dzassn article details 1633577 vmware
  • syslog 协议及格式

    官方文档 xff1a http tools ietf org html rfc5424 6 Syslog Message Format 6 2 HEADER 6 2 1 PRI PRI 61 lt Facility 0 23 8 43 Se
  • chm打不开

    chm文件打开看不到右边的内容 1 操作系统为了安全对下载的chm文件进行了锁定 xff0c 只需要在打开前右键单击该chm文件选择 属性 xff0c 然后在 常规 选项卡的下方单击 解除锁定 按钮就可以了 2 如果还是不能看 xff0c
  • 形式语言与自动机笔记

  • 关于Keil开发C51单片机的头文件问题

    我用的德飞莱的资料 在学习STM32中回想起学C51单片机时 xff0c 有个问题一直没解决 xff0c 就是头文件regx52 h和reg52 h的区别 因为在引用regx52 h时 xff0c 可以直接用P1 1 P3 2这些小口 但是
  • JAXB(二)Map属性映射

    JAXB support Collection List Set does not support Map not Collection XmlAdapter lt ValueType BoundType gt use List to im
  • JAXB(三)xsd 验证

    现在只有最简单的关联映射验证 关键点 xff1a jaxbMarshaller setSchema sch 还不会验证集合类型 xff1a List Set Map 以后再把JAXB xff08 二 xff09 的例子加上 xff0c 64
  • jstat

    http blog csdn net swpihchj article details 8197204
  • Effctive Java 笔记

    8 重写equals xff0c 只适合值类 xff08 枚举类除外 xff09 自反性 xff1a x equals x 61 61 true 对称性 x equals y 61 61 true 必然 y equals x 61 61 t
  • maven

    http blog csdn net zjf280441589 article details 53044308 http www infoq com maven Porject groupId 43 artifactId 43 versi
  • Linux第二课:Ubuntu 操作入门(内含:1Ubuntu 下打开终端+2 Linux 文件属性+3 设置屏幕+4 系统关机与重启+5.文件浏览器)

    Ubuntu 操作入门 2 2 1Ubuntu 下打开终端 方法1 点击 Ubuntu 桌面左上角图标进入搜索框 xff0c 输入 term 可以弹出终端 Terminal 程序 方法2 xff1a 桌面或者在文件浏览器的任何目录下右键鼠标
  • 堆中存什么?栈中存什么?

    堆中存的是对象 栈中存的是基本数据类型 和堆中对象的引用 一个对象的大小是不可估计的 xff0c 或者说是可以动态变化的 xff0c 但是在栈中 xff0c 一个对象只对应了一个4btye的引用 xff08 堆栈分离的好处 xff1a xf
  • 计算一个数的N次方

    计算一个数的N次方时 xff0c 我们先设定两个参数n和k xff0c n表示你要输入的数 xff0c k表示这个数的次方 这个时候我们必须对次方数k作出分类 xff1a k 61 0 return 1 其他 xff1a return n
  • 用结构体编写电话通讯录

    用结构体数组编写电话通讯录 xff0c 必须得知道结构体的形式 xff0c 那先把结构体定义回顾一下 xff1a 一般形式为 xff1a xff08 1 xff09 struct 结构体名称 成员表列 数组名 数组长度 如 xff1a st