通讯录1.0(基础版)

公共头文件 utili.h

#ifndef _UTILI_H//预处理指令解决头文件可能存在的重复问题
#define _UTILI_H

//定义的是公共头文件,内部存放的是库函数之类的
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#endif/*_UTILI_H_*/	

通讯录头文件Contact.h

#ifndef _CONTACT_H
#define _CONTACT_H

//主要做一些函数的声明、定义,自定义类型的定义,函数要先声明完成后才能调用
#include"utili.h" //引入公共头文件

enum{QUIT,ADD,DEL,FIND,MODIFY,CLEAR,SORT,SHOW};//枚举定义选项框
#define MAX_NAME_SIZE 20
#define MAX_SEX_SZIE 3
#define MAX_TEL_SIZE 20
#define MAX_ADD_SIZE 256
#define MAX_CONTACT_SIZE 256
#define scanf scanf_s
//定义人员信息结构体
typedef struct PersonInfo
{
	char name[MAX_NAME_SIZE];
	char sex[MAX_SEX_SZIE];
	int age;
	char tel[MAX_TEL_SIZE];
	char address[MAX_ADD_SIZE];
}PersonInfo;

//定义通讯录结构
typedef struct Contact
{
	PersonInfo Cont[MAX_CONTACT_SIZE];	//人员信息结构体数组
	size_t capacity;		//通讯录的容量
	size_t size;			//通讯录存放的人员信息的个数
}Contact;
//函数声明
bool IsFull(Contact* pcnt);
bool IsEmpty(Contact* pcnt);
int FindByName(Contact* pcnt);
void InitContact(Contact* pcnt);
void AddContact(Contact* pcnt);
void DelContact(Contact* pcnt);
void FindContact(Contact* pcnt);
void ModifyContact(Contact* pcnt);
void ClearContact(Contact* pcnt);
void SortContact(Contact* pcnt);
void ShowContact(Contact* pcnt);
void ShowPersonInfo(Contact* pcnt, int loca);


#endif	//预处理解决可能存在的头文件重复问题

Contact.c函数实现

#include"Contact.h"//引入头文件
//主要负责除主函数外的函数的实现
void InitContact(Contact* pcnt)//通讯录初始化
{
	memset(pcnt->Cont, 0, sizeof(PersonInfo) * MAX_CONTACT_SIZE);//memset将人员信息全部置零
	pcnt->capacity = MAX_CONTACT_SIZE;
	pcnt->size = 0;
}
bool IsFull(Contact* pcnt)	//判断通讯录是否已满,满则返回true
{
	return (pcnt->size >= pcnt->capacity);
}
bool IsEmpty(Contact* pcnt)//判断通讯录是否为空,空则返回true
{
	return (pcnt->size == 0);
}
void ShowPersonInfo(Contact*pcnt,int loca)//展示通讯录中下标为loca的人员信息
{
	printf("%-8s%-6s%-6d%-13s%s\n",	//使输出对齐
		pcnt->Cont[loca].name,
		pcnt->Cont[loca].sex,
		pcnt->Cont[loca].age,
		pcnt->Cont[loca].tel,
		pcnt->Cont[loca].address);
}
void ShowContact(Contact* pcnt)//展示通讯录中的人员信息
{
	if (IsEmpty(pcnt))		//判空	
	{
		printf("通讯录为空,没有信息\n");
	}
	else 
		printf("%-8s%-6s%-6s%-13s%s\n","姓名","性别","年龄","电话","地址");
	for (int i = 0; i < pcnt->size; ++i)
	{
		printf("%-8s%-6s%-6d%-13s%s\n", 
			pcnt->Cont[i].name,
			pcnt->Cont[i].sex,
			pcnt->Cont[i].age,
			pcnt->Cont[i].tel,
			pcnt->Cont[i].address);
	}
}
void AddContact(Contact* pcnt)//增加人员信息
{
	if (IsFull(pcnt))//检查容量,若通讯录已满,展示提示信息
	{
		printf("通讯录已满,无法新增人员信息\n");
		return;
	}
	printf("请输入信息:<\n");
	printf("姓名:<");
	scanf("%s", pcnt->Cont[pcnt->size].name,MAX_NAME_SIZE);
	printf("性别:<");
	scanf("%s", pcnt->Cont[pcnt->size].sex,MAX_SEX_SZIE);
	printf("年龄:<");
	scanf("%d", &pcnt->Cont[pcnt->size].age);
	printf("电话:<");
	scanf("%s", pcnt->Cont[pcnt->size].tel,MAX_TEL_SIZE);
	printf("地址:<");
	scanf("%s", pcnt->Cont[pcnt->size].address,MAX_ADD_SIZE);
	pcnt->size++;
	printf("新增人员信息成功!\n");
}
void DelContact(Contact* pcnt)//删除人员信息
{
	if (IsEmpty(pcnt))	//先判断通讯录是否为空
	{
		printf("通讯录里一个人都没有,无法删除\n");
		return ;
	}
	char name[MAX_NAME_SIZE];
	printf("输入想要删除的人的姓名:<\n");
	scanf("%s", name, MAX_NAME_SIZE);
	int ret = FindByName(pcnt, name);
	for (int i = ret; i < pcnt->size; ++i)
	{
		pcnt->Cont[i] = pcnt->Cont[i + 1];

	}pcnt->size--;
	printf("删除信息成功。。。。\n");

}
int FindByName(Contact* pcnt,char name[])//通过名字进行人员查找,找到返回该人员所在位置的下标,否则返回-1
{

	for (int i = 0; i < pcnt->size; ++i)
	{
		if (strcmp(pcnt->Cont[i].name, name) == 0)
			return i;
	}
	return -1;
	
}
void FindContact(Contact* pcnt)//查找人员信息并打印
{
	char ch = getchar();
	if (IsEmpty(pcnt))
	{
		printf("通讯录里一个人都没有\n");
		return ;
	}
	char name[MAX_NAME_SIZE];
	printf("请输入要查询的名字:>");
	scanf("%s", name,MAX_NAME_SIZE);
	int ret = FindByName(pcnt,name);
	if (ret == -1)
	{
		printf("您要查找的信息不存在\n");
		return;
	}
	ShowPersonInfo(pcnt, ret);
}
void ModifyContact(Contact* pcnt)//修改人员信息
{
	if (IsEmpty(pcnt))
	{
		printf("通讯录里一个人都没有,无法修改\n");
		return;
	}
	char name[MAX_NAME_SIZE];
	printf("请输入想要修改信息的人员的姓名:<\n");
	scanf("%s", name, MAX_NAME_SIZE);
	int ret = FindByName(pcnt, name); //按人名查找
	if (ret == -1)
	{
		printf("该人员信息不存在。。。。\n");
		return;
	}
	int select = 1;
	while (select)
	{
		ShowPersonInfo(pcnt,ret);		//将人员信息展示,看看要作何修改
		printf("请输入想要修改的信息:<\n");
		printf("1-姓名 2-性别 3-年龄 4-电话号码 5-家庭住址 6-退出 \n");		//建立一个循环,可一直修改信息,到满意为止,选择退出修改
		int select;
		scanf("%d", &select, 10);
		switch (select)
		{
		case 1:
			printf("请输入修改后的姓名:<\n");
			scanf("%s", pcnt->Cont[ret].name, MAX_NAME_SIZE);
			continue;
		case 2:
			printf("请输入修改后的性别:<\n");
			scanf("%s", pcnt->Cont[ret].sex, MAX_SEX_SZIE);
			continue;
		case 3:
			printf("请输入修改后的年龄:<\n");
			scanf("%d", &pcnt->Cont[ret].age);
			continue;
		case 4:
			printf("请输入修改后的电话号码:<\n");
			scanf("%s", pcnt->Cont[ret].tel, MAX_TEL_SIZE);
			continue;
		case 5:
			printf("请输入修改后的家庭住址:<\n");
			scanf("%s", pcnt->Cont[ret].address, MAX_ADD_SIZE);
			continue;
		case 6:
			break;
		}
		printf("修改人员信息成功。。。。\n");
		break;
	}


}
void ClearContact(Contact* pcnt)//清空通讯录
{
	if (IsEmpty(pcnt))		//	先判断通讯录是否为空?
	{
		printf("通信录已经为空\n");
		return;
	}
	printf("是否确定清空通讯录?<Y/N>:\n");//这里要吃掉一个换行'\n'
	char ch1 = getchar();
	char ch = getchar();
	if (ch == 'Y' || ch == 'y')
	{
		pcnt->size = 0;
		printf("通讯录已清空\n");
		return;
	}
	else if (ch == 'N' || ch == 'n')
	{
		printf("已取消清空通讯录\n");
		return;
	}
	else printf("输入非法。。。。\n");
	return;
}

void SortContact(Contact* pcnt)//通讯录排序
{
	for (int i = 0; i < pcnt->size-1;++i)
	{
		for (int j = 0; j < pcnt->size - i-1; ++j)
		{
			PersonInfo tmp;
			if (strcmp(pcnt->Cont[j].name, pcnt->Cont[j + 1].name) > 0)
			{
				tmp = pcnt->Cont[j];
				pcnt->Cont[j] = pcnt->Cont[j+ 1];
				pcnt->Cont[j + 1] = tmp;
			}

		}
	}
	printf("通讯录排序成功!!!\n");
	return;
}

ContactMain.c主函数

#include"Contact.h"	//引入头文件
int main(int argc, char* argv[])//主函数
{
	Contact Cont;//定义一个通讯录
	InitContact(&Cont);//初始化通讯录
	int select = 1;
	while(select)
	{
		printf("************************\n");
		printf("****通****讯****录******\n");
		printf("************************\n");
		printf("**[1]Add      [2]Del  **\n");
		printf("**[3]Find     [4]Mod  **\n");
		printf("**[5]Clear    [6]Sort **\n");
		printf("**[0]Quit     [7]Show **\n");
		printf("************************\n");
		printf("请选择:>\n");
		scanf("%d", &select);
		if (8 <= select || select < 0)
		{
			printf("输入非法,请输入正确的选项。。。。\n");
			break;
		}
		
		switch (select)
		{
		case QUIT://退出
			break;
		case ADD://增
			AddContact(&Cont);
			continue;
		case DEL://删
			DelContact(&Cont);
			continue;
		case FIND://查
			FindContact(&Cont);
			continue;
		case MODIFY://改
			ModifyContact(&Cont);
			continue;
		case CLEAR://清空
			ClearContact(&Cont);
			continue;
		case SORT://排序
			SortContact(&Cont);
			continue;
		case SHOW://展示
			ShowContact(&Cont);
			continue;
		}
		break;
	}
	printf("您已退出通讯录。。。See you");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值