C语言--通信录

C语言的学习中,对于知识运用非常灵活,今天我们来使用C语言实现一个简易通信录。

首先对于一个通讯录,我们需要认识到它的功能,通信录能够实现的功能最基础的应该有:增加联系人,删除联系人,查找联系人,修改联系人信息等等。

 所以接下来我们就来实现通信录的这些功能。

目录

一、功能

二、实现功能

文件操作

三、代码实现

1.菜单

2.主函数代码实现

3.通信录的初始化

4.添加功能

5.查找功能

6.删除功能

7.修改功能

8.显示功能

9.排序功能

三、总代码

1.contact.h(头文件)

2.contac.c 

3.test.c 


一、功能

1.增加联系人

2.删除联系人

3.查找联系人

4.修改联系人信息

5.显示联系人信息

6.排序

二、实现功能

文件操作

这里我们采用的环境是Visual Studio 2019,为了方便我们的代码管理,我们可以创建2个源文件和一个头文件。

将通信录的主要文件放在contact.c中。

三、代码实现

1.菜单

菜单主要可以显示我们的功能,可以方便我们进行选择。

这里我们定义了一个名为 Option 的枚举类型,其枚举成员包括 EXITADDDELSEARCHMODIFYSHOWSORT,后面选择时使用可以在程序中的不同操作选项。

2.主函数代码实现

主函数中放置我们的菜单,输入选择我们的需要的功能进入,这里使用到我们Switch case语句;Switch 用于多分支选择,根据表达式的值匹配 case。使用时注意break的使用。

int main()
{
	int input;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请输入要功能:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			printf("请添加:>\n");
			break;
		case DEL:
			printf("请删除:>\n");
			break;
		case SEARCH:
			printf("请查找:>\n");
			break;
		case MODIFY:
			printf("请修改:>\n");
			break;
		case SHOW:
			printf("请打印\n");
			break;
		case SORT:
			printf("请排序\n");
			break;
		case EXIT:
			printf("结束\n");
			break;
		default:
			break;
		}
		
	} while (input);
}

3.通信录的初始化

首先我们需要一个来存放通讯人信息的结构,在这里使用我们的结构体来存放。

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 30
typedef struct PeoIno
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoIno;

这里有我们使用多个 #define 宏定义,定义了各种常量,用来规定数组长度。定义了 PeoIno 结构体,包含姓名、年龄、性别、电话、地址这些信息。注意:我们还使用了typedef对名字进行了重命名。

typedef struct Contact
{
	PeoIno data[MAX];
	int sz;
}Contact;

这个结构体用来存放我们通信录的信息已经通信录的大小。

对于我们通信录的初始化: 

void InitContact(Contact* p)
{
	p->sz = 0;
	memset(p->data, 0, sizeof(p->data));
}
  • p->sz = 0: 将通讯录当前存储的联系人数量初始化为 0
  • memset(p->data, 0, sizeof(p->data))对通讯录存储联系人数据的数组 data 进行内存初始化,填充为 0

4.添加功能

首先我们需要对通信录进行判断,,如果通信录满了,那我们就没办法进行添加,只能退出,通信录没满,则可进行添加。

未达上限时,依次提示输入联系人的姓名、年龄、性别、电话、地址,通过 scanf 读取输入数据,存入 Contact 结构体指针 p 指向的 data 数组(当前下标为 p->sz

void AddContact(Contact* p)
{

	if (p->sz == MAX)
	{
		printf("通讯录已满\n");
		return;
	}

		printf("请输入要添加人的姓名:>\n");
		scanf("%s", p->data[p->sz].name);
		printf("请输入要添加人的年龄:>\n");
		scanf("%d", &(p->data[p->sz].age));
		printf("请输入要添加人的性别:>\n");
		scanf("%s", p->data[p->sz].sex);
		printf("请输入要添加人的电话:>\n");
		scanf("%s", p->data[p->sz].tele);
		printf("请输入要添加人的地址:>\n");
		scanf("%s", p->data[p->sz].addr);
		p->sz++;
		printf("添加成功\n");
}

5.查找功能

由于我们删除功能,修改功能等都需要先对通信录进行搜索查找,所以我们在这里先实现查找功能。

static int Find(Contact* p,char name[])
{

	int i;
	for (i = 0; i<p->sz; i++)
	{
		if (strcmp(p->data[i].name, name)==0)
		{
			return i;
		}
	}
	return -1;
}

这里我们把查找功能独立成一个函数,方便后续我们的使用调用。

  • 实现逻辑
    1. 遍历 p->data 数组(通过 p->sz 确定数据量);
    2. 用 strcmp 比较当前联系人姓名 p->data[i].name 与目标 name,若匹配成功,返回该联系人在数组中的下标 i
    3. 遍历结束未找到匹配项,返回 -1

将我们的返回值传给我们的查找函数,pos里面存放我们查找函数返回的值,如果pos==-1,则说明通信录无该人信息,反之即找到了。这里也主要我们需要对通信录进行判断,如果为空,则说明通信录无信息。

void SearchContact(Contact* p)
{
	
	char name[MAX_NAME];
	printf("请输入要查找人的姓名:>\n");
	scanf("%s", name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	int pos = Find(p,name);
	if (pos == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了\n");
	}
}

6.删除功能

  1. 输入待删除联系人姓名:提示用户输入要删除的联系人姓名,并将其存储在name数组中。
  2. 查找联系人:调用Find函数查找该联系人在通讯录中的位置。
  3. 检查通讯录是否为空:如果通讯录为空,提示用户并返回。
  4. 检查是否找到联系人:如果Find函数返回-1,表示未找到该联系人,提示用户。
  5. 删除联系人:如果找到联系人,从该位置开始,将后面的元素依次前移,覆盖掉要删除的元素。最后将通讯录的有效元素数量减 1。
  6. 提示删除成功:删除操作完成后,提示用户删除成功。

void DelContact(Contact* p)
{
	char name[MAX_NAME];
	printf("请输入要删除人的姓名:>\n");;
	scanf("%s", name);
	int pos = Find(p, name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	if (pos==-1)
	{
		printf("找不到\n");
	}
	
	else
	{
		for (int i = pos; i < p->sz; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->sz--;
		printf("删除成功\n");
	}
}

7.修改功能

修改功能和我们的删除功能其实很像,都需要先找到目标通信人,在进行操作,这里我们进行的就是修改工作。

  1. 输入想修稿联系人姓名
  2. 查找联系人:调用Find函数查找
  3. 检查通讯录是否为空:如果通讯录为空,提示用户并返回。
  4. 检查是否找到联系人:如果Find函数返回-1,表示未找到该联系人。
  5. 修改联系人:如果找到联系人,对其进行修改,而修改其实对于我们值需要重新录入信息,所以这里和我们的添加功能的代码是一样的。
void ModifyContact(Contact* p)
{
	char name[MAX_NAME];
	printf("请输入要修改人的姓名:>\n");
	scanf("%s", name);
	int pos = Find(p, name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	if (pos == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("请输入要修改人的姓名:>\n");
		scanf("%s", p->data[pos].name);
		printf("请输入要修改人的年龄:>\n");
		scanf("%d", &(p->data[pos].age));
		printf("请输入要修改人的性别:>\n");
		scanf("%s", p->data[pos].sex);
		printf("请输入要修改人的电话:>\n");
		scanf("%s", p->data[pos].tele);
		printf("请输入要修改人的地址:>\n");
		scanf("%s", p->data[pos].addr);
		printf("修改成功\n");
	}

8.显示功能

显示功能这里只需要将我们的内容进行打印,调用我们的for循环函数。

  1. 先打印表头(姓名、年龄、性别、电话、地址),通过 printf 格式化输出固定列宽(%-5是向左对齐,不加负号会向右对齐);
  2. 遍历 Contact 结构体指针 p 指向的通讯录数据(通过 p->sz 确定数据量)打印。

注意:我们的整型打印的符号是“%d”,这一块容易忽略!

9.排序功能

排序我们这里可以采用qsort 进行快排,重点主要快排的参数。cmp 函数问题对我们的通信录进行比较,这里我们比较名字大小。

int cmp(const void* p1, const void*p2)
{
	return strcmp((PeoIno*)p1, (PeoIno*)p2);
}
void SortContact(Contact* p)
{
	qsort(p->data,p->sz, sizeof(PeoIno), cmp);
	printf("排序成功\n");
}

三、总代码

1.contact.h(头文件)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<errno.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 30

typedef struct PeoIno
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoIno;
typedef struct Contact
{
	PeoIno data[MAX];
	int sz;
}Contact;

void InitContact(Contact* p);
void AddContact(Contact* p);
void ShowContact(Contact* p);
void DelContact(Contact* p);
void SearchContact(Contact* p);
void ModifyContact(Contact* p);
void SortContact(Contact* p);

2.contac.c 

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* p)
{
	p->sz = 0;
	memset(p->data, 0, sizeof(p->data));
}



void AddContact(Contact* p)
{

if (p->sz == MAX)
	{
		printf("通讯录已满\n");
		return;
	}

		printf("请输入要添加人的姓名:>\n");
		scanf("%s", p->data[p->sz].name);
		printf("请输入要添加人的年龄:>\n");
		scanf("%d", &(p->data[p->sz].age));
		printf("请输入要添加人的性别:>\n");
		scanf("%s", p->data[p->sz].sex);
		printf("请输入要添加人的电话:>\n");
		scanf("%s", p->data[p->sz].tele);
		printf("请输入要添加人的地址:>\n");
		scanf("%s", p->data[p->sz].addr);
		p->sz++;
		printf("添加成功\n");
}
void ShowContact(Contact* p)
{
	int i;
	printf("%-5s %-5s %-5s %-15s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < p->sz; i++)
	{
		printf("%-5s %-5d %-5s %-15s %-15s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].tele, p->data[i].addr);
	}
}
static int Find(Contact* p,char name[])
{
	int i;
	for (i = 0; i<p->sz; i++)
	{
		if (strcmp(p->data[i].name, name)==0)
		{
			return i;
		}
	}
	return -1;
}
void SearchContact(Contact* p)
{
	
	char name[MAX_NAME];
	printf("请输入要查找人的姓名:>\n");
	scanf("%s", name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	int pos = Find(p,name);
	if (pos == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了\n");
		printf("%-5s %-5s %-5s %-15s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-5s %-5d %-5s %-15s %-15s\n", p->data[pos].name, p->data[pos].age, p->data[pos].sex, p->data[pos].tele, p->data[pos].addr);
	}
}
void DelContact(Contact* p)
{
	char name[MAX_NAME];
	printf("请输入要删除人的姓名:>\n");;
	scanf("%s", name);
	int pos = Find(p, name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	if (pos==-1)
	{
		printf("找不到\n");

	}
	
	else
	{
		for (int i = pos; i < p->sz; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->sz--;
		printf("删除成功\n");
	}
}
void ModifyContact(Contact* p)
{
	char name[MAX_NAME];
	printf("请输入要修改人的姓名:>\n");
	scanf("%s", name);
	int pos = Find(p, name);
	if (p->sz == 0)
	{
		printf("通信录无信息\n");
		return;
	}
	if (pos == -1)
	{
		printf("找不到\n");

	}
	else
	{
		printf("请输入要修改人的姓名:>\n");
		scanf("%s", p->data[pos].name);
		printf("请输入要修改人的年龄:>\n");
		scanf("%d", &(p->data[pos].age));
		printf("请输入要修改人的性别:>\n");
		scanf("%s", p->data[pos].sex);
		printf("请输入要修改人的电话:>\n");
		scanf("%s", p->data[pos].tele);
		printf("请输入要修改人的地址:>\n");
		scanf("%s", p->data[pos].addr);
		printf("修改成功\n");
	}

}

int cmp(const void* p1, const void*p2)
{
	return strcmp((PeoIno*)p1, (PeoIno*)p2);
}
void SortContact(Contact* p)
{
	qsort(p->data,p->sz, sizeof(PeoIno), cmp);
	printf("排序成功\n");
}

3.test.c 

#include"contact.h"


void menu()
{
	printf("***********************\n");
	printf("***0.exit  1.add   ****\n");
	printf("***2.del   3.search****\n");
	printf("***4.modify5.show  ****\n");
	printf("***6.sort           ***\n");
}

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
 };

int main()
{
	int input;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请输入要功能:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			printf("请添加:>\n");
			AddContact(&con);
			break;
		case DEL:
			printf("请删除:>\n");
			DelContact(&con);
			break;
		case SEARCH:
			printf("请查找:>\n");
			SearchContact(&con);
			break;
		case MODIFY:
			printf("请修改:>\n");
			ModifyContact(&con);
			break;
		case SHOW:
			printf("请打印\n");
			ShowContact(&con);
			break;
		case SORT:
			printf("请排序\n");
			SortContact(&con);
			break;
		case EXIT:
			DestroyContact(&con);
			printf("结束\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
		
	} while (input);
}

最后相信你已经有所收获,快动手试试看吧!喜欢可以点赞收藏呀!

考虑可再生能源出力不确定性的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定性的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定性的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济性。文中可能涉及不确定性建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效性。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定性并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文中提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定性处理方法与需求响应机制的设计逻辑,同时可参考文档中列出的其他资源进行扩展学习与交叉验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值