C语言之通讯录的实现

news2025/2/27 22:22:05

在这里插入图片描述

通讯录实现所需头文件和源文件

Contact.h的功能

声明函数和创建结构体变量

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_PHONE 12
#define MAX_ADDRESS 30
#define DEFAULT_SZ 3
#define INTC_SZ 2
typedef struct PeoInform
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char phone[MAX_PHONE];
    char address[MAX_ADDRESS];
}PeoInform;


//静态
//typedef struct Contact
//{
//    PeoInform data[MAX];
//    int size;
//    
//}Contact;


typedef struct Contact
{
	PeoInform* data;
	int size;
    int capacity;
}Contact;


void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact(const Contact* pc);
void MoidfyContact(Contact* pc);
void SortContact(Contact* pc);
void  DerstoryContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadCntact(Contact* pc);

Contact.c

设定通讯录所需的功能和函数的定义

void InitContact(Contact* pc);//初始化函数
void AddContact(Contact* pc);//增加用户
void ShowContact(const Contact* pc);//显示通讯录信息·
void DelContact(Contact* pc);//删除用户信息
void SearchContact(const Contact* pc);//搜索通讯录
void MoidfyContact(Contact* pc);//修改用户信息
void SortContact(Contact* pc);//排序通讯录
void DerstoryContact(Contact* pc);//因动态申请内存所以释放内存
void SaveContact(Contact* pc);//通讯录信息保存到文件
void LoadCntact(Contact* pc);//把文件保存到通讯录中

void InitContact(Contact* pc);

void InitContact(Contact* pc)
{
	//动态版
	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
	pc->size = 0;
	pc->capacity = DEFAULT_SZ;
	PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	//加载文件信息到通讯录
	//LoadContact(pc);
}

void AddContact(Contact* pc);

void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		pc->size++;
		printf("添加成功\n");
}

``

void ShowContact(const Contact* pc);

	void ShowContact(const Contact * pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录为空\n");
		}

		else
		{
			int i = 0;
			
			printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
			
			for (i = 0; i < pc->size; i++)
			{
				printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
					pc->data[i].name,
					pc->data[i].age,
					pc->data[i].sex,
					pc->data[i].phone,
					pc->data[i].address);
			}
		}

	}

void DelContact(Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除人的名字>");
	scanf("%s", name);

	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("查询不到联系人\n");
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->size; j++);
	}
}

void SearchContact(const Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入查找人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找人不存在\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].phone,
			pc->data[pos].address);
		
	}
}

void MoidfyContact(Contact* pc);

void MoidfyContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入修改联系人的名字>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改人的名字");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		printf("修改完成\n");
	}
}

void SortContact(Contact* pc);

	void SortContact(Contact* pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录没有联系人,请添加\n");
		}

		for (int i = 0; i < pc->size-1; i++)
		{
			for (int j = 0; j < pc->size - 1 - i; j++)
			{
				if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0)
				{
					    PeoInform tmp;
					    tmp = pc->data[j];
						pc -> data[j] = pc->data[j+1];
						pc->data[j+1] = tmp;
				}
			
			}
			printf("排序成功\n");
		}
	}

void DerstoryContact(Contact* pc);

void  DerstoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->size = 0;
	pc = NULL;
}

void SaveContact(Contact* pc);

void SaveContact(Contact* pc)//保存文件信息
	{
	    FILE * pf = fopen("contact.txt", "wb");// 为了输出数据,打开一个二进制文件
		if (NULL == pf)
		{
			perror("SaveContact");//打开失败就不用关闭文件了
		}
		else
		{
			int i = 0;
			for (i = 0; i < pc->size; i++)
			{/
				fwrite(pc->data + i, sizeof(PeoInform), 1, pf);//1.结构体地址,一个元素占多少字节,多少个元素,写到pf这个文件
			}//一次写一个到pf所指文件
			fclose(pf);
			pf = NULL;
			printf("保存成功\n");
		}

	}

void LoadCntact(Contact* pc);

	void LoadContact(Contact* pc)
	{
		//把文件的内容放在通讯录中
		FILE* pf = fopen("contact.txt","rb"); //为了输入数据,打开一个二进制文件
		if (pf == NULL)
		{
			perror("LoadContact");
		}
		else//读数据
		{
			PeoInform tmp = { 0 };
			int i = 0;
			//正常读到1返回1 没读到返0
			while (fread(&tmp, sizeof(PeoInform), 1, pf))//
			{
				check_capacity(pc);
				pc->data[i] = tmp;
				pc->size++;
				i++;
			}
		}
		fclose(pf);
		pf = NULL;
	}

contact.c的综合实现

#include "Contact.h"
void check_capacity(Contact* pc)
{
	if (pc->size = pc->capacity)
	{
		PeoInform* str = (PeoInform*)realloc(pc->data, (pc->capacity + INTC_SZ) * sizeof(PeoInform));

		if (str == NULL)
		{
			perror("check_capacity::realloc");
			return;
		}
		pc->data = str;
		pc->capacity += INTC_SZ;
		printf("增容成功");
	}
}


//静态
//void InitContact(Contact* pc)
//{
//	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
//	pc->size = 0;
//}


//动态
void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
	pc->size = 0;
	pc->capacity = DEFAULT_SZ;
	PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	


	//加载文件信息到通讯录
	//LoadContact(pc);
}



void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		pc->size++;
		printf("添加成功\n");
}




static int FindByName(const Contact* pc, char name[MAX_NAME])
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}




void DelContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除人的名字>");
	scanf("%s", name);

	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("查询不到联系人\n");
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->size; j++);
	}
}



void SearchContact(const Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入查找人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找人不存在\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].phone,
			pc->data[pos].address);
		
	}
}




void MoidfyContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入修改联系人的名字>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改人的名字");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		printf("修改完成\n");
	}
}
	void ShowContact(const Contact * pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录为空\n");
		}

		else
		{
			int i = 0;
			
			printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
			
			for (i = 0; i < pc->size; i++)
			{
				printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
					pc->data[i].name,
					pc->data[i].age,
					pc->data[i].sex,
					pc->data[i].phone,
					pc->data[i].address);
			}
		}

	}

	void SortContact(Contact* pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录没有联系人,请添加\n");
		}

		for (int i = 0; i < pc->size-1; i++)
		{
			for (int j = 0; j < pc->size - 1 - i; j++)
			{
				if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0)
				{
					    PeoInform tmp;
					    tmp = pc->data[j];
						pc -> data[j] = pc->data[j+1];
						pc->data[j+1] = tmp;
				}
			
			}
			printf("排序成功\n");
		}
	}

	void  DerstoryContact(Contact* pc)
	{
		free(pc->data);
		pc->data = NULL;
		pc->capacity = 0;
		pc->size = 0;
		pc = NULL;
	}




	void SaveContact(Contact* pc)
	{
		
		FILE * pf = fopen("contact.txt", "wb");
		if (NULL == pf)
		{
			perror("SaveContact");
		}
		else
		{
			int i = 0;
			for (i = 0; i < pc->size; i++)
			{
				fwrite(pc->data + i, sizeof(PeoInform), 1, pf);
			}
			fclose(pf);
			pf = NULL;
			printf("保存成功\n");
		}

	}



	void LoadContact(Contact* pc)
	{
		
		FILE* pf = fopen("contact.txt","rb"); 
		if (pf == NULL)
		{
			perror("LoadContact");
		}
		else
		{
			PeoInform tmp = { 0 };
			int i = 0;
			
			while (fread(&tmp, sizeof(PeoInform), 1, pf))
			{
				check_capacity(pc);
				pc->data[i] = tmp;
				pc->size++;
				i++;
			}
		}
		fclose(pf);
		pf = NULL;
	}

test.h

#include "Contact.h"


void menu()
{
    printf("*********************************\n");
    printf("**      1. 添加联系人          **\n");
    printf("**      2. 删除联系人          **\n");
    printf("**      3. 查找联系人          **\n");
    printf("**      4. 修改联系人          **\n");
    printf("**      5. 显示所有联系人      **\n");
    printf("**      6. 按姓名排序联系人    **\n");
    printf("**      0. exit                **\n");
    printf("*********************************\n");
}
void test()
{

    int input = 0;
      
    Contact con;
    InitContact(&con);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            AddContact(&con);
            break;
        case 2: 
            DelContact(&con);
            break;
        case 3:
            SearchContact(&con);
            break;
        case 4:
            MoidfyContact(&con);
            break;
        case 5:
            ShowContact(&con);
            break;
        case 6:
            SortContact(&con);
            break;
        case 0:
            DerstoryContact(&con);
            printf("退出通讯录\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}
int main()
{
    test();
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm 上传自己的包

mkdir demo 创建一个新的文件夹 npm init 初始化项目 生成一个package.json文件 name version description等等touch index.js 创建一个node 可执行脚本新的js 文件 #!/usr/bin/env node // 必须在文件头加如上内容指定运行环境为node console.log(hello cli)在package.json 中…

Zookeeper框架

Zookeeper框架概述 1.Zookeeper介绍 Zookeeper&#xff08;以下简称ZK&#xff09;是用来管理和协调其他框架的&#xff0c;很多框架需要依赖ZK&#xff08;例如Hadoop-HA&#xff0c;Kafka&#xff0c;HBase等&#xff09;ZK本身也是一个集群ZK本身也可以存数据(一般保存配置…

手撸一个Switch开关组件

一、前言 手撸系列又来了&#xff0c;这次咱们来撸一个Switch开关组件&#xff0c;废话不多说&#xff0c;咱们立刻发车。 二、使用效果 三、实现分析 首先我们先不想它的这个交互效果&#xff0c;我们就实现“不合格”时的一个静态页面&#xff0c;静态页面大致如下&#x…

GeoServer如何发布PostgreSQL里的数据?

GIS服务端避免不了将数据存储在pg库里。本篇我们来说如何将其发布在geoserver上。 我们讲的全面一点,尽量从0开始,让小白都能看得懂。 首先假设你有一份shape数据,你可以同过postgis插件导入到pg数据库中。 这里要注意:导入的shape文件和路径都不能含有中文! 导入之前…

嵌入式linux驱动学习-用cdev代替register_chrdev()

​上回说到字符设备驱动程序的注册与销毁register_chrdev()和unregister_chrdev()这是有缺陷的。 嵌入式lnux驱动学习-2.一个驱动程序的流程 现在用另外一个更好的方法代替&#xff0c;我们先来看看register_chrdev()实际上是调用了 __register_chrdev(major, 0, 256, name,…

【Mysql系列】Mysql之ACID实现原理

ACID 原子性 事务不可分割&#xff0c;要么全部执行&#xff0c;要么都不执行。原理是使用undo log。undo log&#xff0c;当事务对数据库进行修改的时候&#xff0c;会生成对应的undo log。 持久性 事务提交后&#xff0c;对于数据库的改变是永久性的。实现原理通过redo l…

leaflet 清除底图以外的所有图层(两种方法)

第084个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet项目中清除除了底图以外的其他图层,这里有两种方法,详情请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共140行)相关API专栏目标…

C++调用Python脚本进行18次循环操作后,脚本不执行

C调用Python脚本进行18次循环操作后&#xff0c;脚本不执行 现象&#xff1a; 发送端接收端 从第二张图中可以看出&#xff0c;python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试&#xff0c;均在第18次循环执行时&#xff0c;出现上述问…

java TCP/UDP、Socket、URL网络编程详解

文章目录网络通信协议通信双方地址端口号IP地址InetAddress类Socket 网路编程Socket类的常用构造器Socket类的常用方法UDP协议什么是UDP协议UDP网络编程DatagramSocket 构造方法DatagramSocket 常用方法DatagramPacket常用方法实现步骤单向数据发收的UDP程序双向数据发收的UDP程…

社团结构的划分及实现过程

社团结构的划分及实现过程 022036930019 张志龙 2022.11.18 题目 什么是网络社团结构&#xff0c;介绍给出社团结构划分几种常见算法&#xff0c;并且给出你实现的过程。同时对一些真实网络进行划分与真实情况进行比较&#xff0c;并且给出你的解释。 文章目录社团结构的划分…

整个寒假挑灯夜读用学习压抑悲伤之情(寒假总结)

目录 前言 一、回顾这一个多月&#xff08;学习阶段&#xff09; 二、意外经历——青训营 三、下学期规划 四、其他 前言 这几年过年越来越没有年味了&#xff0c;所以对过年并没有多大的期待&#xff0c;当别人都在朋友圈发新年快乐的时候&#xff0c;我应该在原神过海灯…

华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 组成最大数 小组中…

maven-surefire-plugin,用于自动化测试和单元测试的

如果你执行过mvn test或者执行其他maven命令时跑了测试用例&#xff0c;你就已经用过maven-surefire-plugin了。 maven-surefire-plugin是maven里执行测试用例的插件&#xff0c;不显示配置就会用默认配置。这个插件的surefire:test命令会默认绑定maven执行的test阶段。 2.ma…

同城小程序应该怎么做?

同城小程序应该怎么做?同城小程序开发&#xff0c;微信同城小程序&#xff0c;同城生活小程序&#xff0c;同城信息发布小程序#同城小程序开发#微信同城小程序#同城生活小程序#同城信息发布小程序百收网 同城信息发布的小程序怎么做&#xff1f; 实际上跟 58 同城类似的&…

SpringBoot整合Dubbo和Zookeeper

安装Zookeeper 下载地址&#xff1a;https://zookeeper.apache.org/releases.html#download 解压&#xff0c;然后运行bin目录里的zkService.cmd 将conf文件夹的zoo_sample.cfg复制一份改名为zoo.cfg 修改zoo.cfg配置&#xff0c;dataDir临时数据存储的位置&#xff0c;client…

5.11 BGP属性-Preferred-Value

5.4.5配置Preferred-Value属性控制选路 1. 实验目的 熟悉Preferred-Value属性控制选路的应用场景掌握Preferred-Value属性控制选路的配置方法2. 实验拓扑 实验拓扑如图5-11所示: 图5-11:配置Preferred-Value属性控制选路 3. 实验步骤…

Python|每日一练|数组|回溯|栈|树|双指针|单选记录:N 皇后|二叉树的前序遍历|四数之和

1、N 皇后&#xff08;数组&#xff0c;回溯&#xff09; n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 …

如何选择靠谱的插画培训课程

如何选择靠谱的插画培训课程&#xff0c;今天教你3个维度选择一个靠谱的插画培训班&#xff01; 插画培训机构课程&#xff1a; 1.选择插画培训班时&#xff0c;要先考察课程&#xff0c;看看课程内容是否符合自己的需求&#xff0c;是否有助于提高插画技术。课程设置应该灵活…

GPT系列详解:初代GPT

本文详细解读了OpenAI公司在2018年6月发布的论文《Improving Language Understanding by Generative Pre-Training》&#xff0c;它其中介绍的算法也就是后来人们说的GPT。本文借鉴了李沐的这个视频&#xff0c;感兴趣的同学可以移步观看大神的讲解。 目录引言GPT方法无监督预训…

拒绝背锅:测试项目中的风险管理一定要知道

测试经理除了要管理产品线的质量保障和日常部门事务工作外&#xff0c;另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展&#xff0c;而是想聊一聊在同行中比较高频出现的一个字眼&#xff1a;风险管理。 什么是风险管理 引用百度上的解释&a…