2021-03-05

静态方法实现通讯录的基本功能

近两日跟鹏哥学习了简易版通讯录的实现,我今天先把这个给分享一下。过几天我会把这个改成使用malloc、realloc函数等动态方法实现,希望有帮助到你的地方[狗头]。废话不多说,直接上代码。

  1. Contact.h头文件
#define _CRT_SECURE_NO_WARNINGS 
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 100
#include <stdio.h>
#include <string.h>

struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};

struct Contact
{
	struct PeoInfo data[MAX];
	int size;

};

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

//声明函数
//初始化
void InitContact(struct Contact* ps);
//添加
void AddContact(struct Contact* ps);
//显示
void ShowContact(const struct Contact* ps);
//删除
void DeleContact(struct Contact* ps);
//查找
void SearchContact(struct Contact* ps);
//修改
void ModifyContact(struct Contact* ps);
//排序
void SortContact(struct Contact* ps);
  1. Contact.c方法实现
#include "contact.h"

//初始化
void InitContact(struct Contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;//设置通讯录最初只有0个元素
}
//添加
void AddContact(struct Contact* ps)
{
	if (ps->size == MAX)
	{
		printf("联系人已满,无法添加!");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", ps->data[ps->size].name);
		printf("请输入年龄:>");
		scanf("%d", &(ps->data[ps->size].age));
		printf("请输入性别:>");
		scanf("%s", ps->data[ps->size].sex);
		printf("请输入电话:>");
		scanf("%s", ps->data[ps->size].tele);
		printf("请输入地址:>");
		scanf("%s", ps->data[ps->size].addr);

		ps->size++;
		printf("添加成功!\n");

	}
}
//显示
void ShowContact(const struct Contact* ps)
{
	if (ps->size == 0)
	{
		printf("无联系人!\n");
	}
	else
	{
		//建立表头
		printf("%20s\t %10s\t %10s\t %12s\t %10s\n", "姓名", "年龄", "性别", "电话", "地址");
		for (int i = 0; i < ps->size; i++)
		{
			printf("%20s\t %10d\t %10s\t %12s\t %10s\n", 
					ps->data[i].name,
					ps->data[i].age,
					ps->data[i].sex,
					ps->data[i].tele,
					ps->data[i].addr);
		}
		
	}
}
//删除
void DeleContact(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入删除联系人的姓名:>");
	scanf("%s", name);
	//int i = 0;
	//for (i = 0; i < ps->size; i++)
	//{
	//	if (0 == strcmp(ps->data[i].name,name))
	//		break;
	//}
	int pos = FindByName(ps, name);
	if (pos == ps->size)
	{
		printf("无该联系人\n");
	}
	else
	{
		int j = 0;
		for (int j = pos; j < ps->size - 1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功!\n");
	}
	
}
//查找给定姓名的下标 有则下标 无则-1
static int FindByName(const struct Contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (0 == strcmp(ps->data[i].name, name))
			return i;
	}

	return -1;
}
//查找
void SearchContact(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入查找的姓名:>");
	scanf("%s", name);
	int pos = FindByName(ps, name);

	if (pos == -1)
	{
		printf("你查找的联系人不存在!\n");
	}
	else
	{
		printf("%20s\t %10s\t %10s\t %12s\t %10s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%20s\t %10d\t %10s\t %12s\t %10s\n",
			ps->data[pos].name,
			ps->data[pos].age,
			ps->data[pos].sex,
			ps->data[pos].tele,
			ps->data[pos].addr);
	}
}
//修改
void ModifyContact(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入要修改的名字:>");
	scanf("%s", name);
	int pos = FindByName(ps, name);

	if (pos == -1)
	{
		printf("修改的联系人不存在!\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", ps->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(ps->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", ps->data[pos].sex);
		printf("请输入电话:>");
		scanf("%s", ps->data[pos].tele);
		printf("请输入地址:>");
		scanf("%s", ps->data[pos].addr);

		printf("修改成功!\n");
	}
}
//定义排序方法
int cmp(const void* a, const void* b)
{
	return *(char*)a - *(char*)b;
}
//排序
void SortContact(struct Contact* ps)
{
	//待排序的首地址  数组的总数量  各元素的大小  自定义排列数组  
	qsort(ps, ps->size, sizeof(ps->data[0]), cmp);

}
  1. demo.c测试
#define _CRT_SECURE_NO_WARNINGS 
#include "contact.h"

menu()
{
	printf("*****************************************\n");
	printf("***** 1.add                  2.dele *****\n");
	printf("***** 3.search               4.modi *****\n");
	printf("***** 5.show                 6.sort *****\n");
	printf("***** 0.exit                        *****\n");
	printf("*****************************************\n");
}

int main()
{
	int input = 0;
	struct Contact con;
	InitContact(&con);

	do
	{
	menu();
	printf("请选择 >");
	scanf_s("%d", &input);
	
		switch(input)
		{
			case ADD: 
				AddContact(&con);
				break;
			case DELE:
				DeleContact(&con);
				break;
			case SEARCH:
				SearchContact(&con);
				break;
			case MODIFY:
				ModifyContact(&con);
				break;
			case SHOW:
				ShowContact(&con);
				break;
			case SORT:
				SortContact(&con);
				break;
			case EXIT:
				printf("退出");
				break;
			default:
				printf("选择错误!");

		}
		
	} while (input);


	return 0;
}

有错误的请大佬指正哦!(新人一个,请轻喷)[狗头保命]。
未完待续。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值