C语言| |静态实现通讯录

首先对于通讯录的功能:

1.增加联系人

2.清空联系人

3.删除联系人

4.对联系人排序

5.输出联系人

6.查找联系人

7.修改联系人信息

接下来实现通讯录:

第一步:address.h是头文件,里面包含了所有要用到的函数,以及头文件

代码如下:

#pragma once 
//确保头文件被引用一次,但是可移植性差
//最好用#ifndef #defiene #endif 可移植性高
//#ifndef __ADDRESS_H__ //防止头文件被多次定义,该头文件是  address.h
//#define __ADDRESS_H__


//检测X86是否被宏定义,如果没有的话在编译输出窗口输出X86 not define
//#ifndef X86
//
//#pragma message("X86 not define")
//
//#endif

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

#define MAXSIZE 1000

enum INPUT //定义一个枚举类型
{
	A, //枚举常量
	ENTER,
	EMPTY,
	DELETE,
	SORT,
	SHOW,
	SEARCH,
	REVISE, //修改信息
	EXIT
};

typedef struct LinkMan
{
	char name[20];
	char sex[4];
	int age;
	char tel[15];
	char addr[50];
}LinkMan;

typedef struct LinkManCount
{
	LinkMan contact[MAXSIZE];//可以存放MAXSIZE个人的通讯录
	int sz;//记录当前存了几个联系人
}LMCount, *pLMCount;

void init_linkman(pLMCount my_addr);
void enter_linkman(pLMCount my_addr);
void show_linkman(pLMCount my_addr);
void delete_linkman(pLMCount my_addr);
void empty_linkman(pLMCount my_addr);
void sort_linkman(pLMCount my_addr);
void search_linkman(pLMCount my_addr);
void revise_linkman(pLMCount my_addr);


//#endif //__ADDRESS_H__

2.对于通讯录各种功能的实现,放在address.h源文件下

代码如下:

#include "address.h"

//初始化通讯录
void init_linkman(pLMCount my_addr)
{
	memset(my_addr->contact, 0, sizeof(my_addr->contact));
	my_addr->sz = 0;//开始通讯录里面没有联系人
} 

//添加联系人
void enter_linkman(pLMCount my_addr)
{
	printf("请输入联系人姓名:>");
	scanf("%s", my_addr->contact[my_addr->sz].name);
	printf("请输入联系人的性别:>");
	scanf("%s", my_addr->contact[my_addr->sz].sex);
	printf("请输入联系人的年龄:>");
	scanf("%d", &my_addr->contact[my_addr->sz].age);
	printf("请输入联系人的电话:>");
	scanf("%s", my_addr->contact[my_addr->sz].tel);
	printf("请输入联系人的地址:>");
	scanf("%s", my_addr->contact[my_addr->sz].addr);
	my_addr->sz++;//添加完了之后要对计数器进行自增操作
}

//清空通讯录
void empty_linkman(pLMCount my_addr)
{
	memset(my_addr->contact, 0, sizeof(my_addr->contact));//将通讯录数组内容全部置0
	my_addr->sz = 0;//将通讯录里储存的人数置0
}

//查找联系人
int find_name(pLMCount my_addr, char delete_name[])
{
	int i = 0;
	for (i = 0; i < my_addr->sz; i++)
	{
		if (!strcmp(my_addr->contact[i].name, delete_name))
		{
			return i;//返回与要删除的名字相同的下标
		}
	}
	return -1;//没有找到返回-1
}

//删除通讯录的信息
void delete_linkman(pLMCount my_addr)
{
	int i = 0;
	char delete_name[20] = "0";
	int ret = 0;
	//按名字删除联系人信息
	printf("输入你要删除联系人的名字:>");
	scanf("%s", delete_name);
	//查找联系人
	ret = find_name(my_addr, delete_name);
	//删除该联系人
	if (ret != -1)
	{
		for (i = ret; i < my_addr->sz - 1; i++)
		{
			my_addr->contact[i] = my_addr->contact[i + 1];
		}
		my_addr->sz--;
	}
	printf("删除结束\n");
}

//对联系人进行排序
void sort_linkman(pLMCount my_addr)
{
	//对姓名进行排序
	int i = 0;
	int j = 0;
	for (i = 0; i < my_addr->sz - 1; i++)
	{
		for (j = 0; j < my_addr->sz - 1 - i; j++)
		{
			if (strcmp(my_addr->contact[j].name, my_addr->contact[j + 1].name) > 0)
			{
				LinkMan tmp = my_addr->contact[j];
				my_addr->contact[j] = my_addr->contact[j + 1];
				my_addr->contact[j + 1] = tmp;
			}
		}
	}
	printf("排序结束\n");
}

//展示通讯录
void show_linkman(pLMCount my_addr)
{
	int i = 0;
	assert(my_addr != NULL);//条件为假,表示通讯录是0个人
	printf("\t姓名\t\t性别\t\t年龄\t\t电话\t\t地址\n");
	for (i = 0; i < my_addr->sz; i++)
	{
		//加-表示左对齐
		printf("\t%-s\t\t", my_addr->contact[i].name);
		printf("%-s\t\t", my_addr->contact[i].sex);
		printf("%-d\t\t", my_addr->contact[i].age);
		printf("%-s\t\t", my_addr->contact[i].tel);
		printf("%-s\n", my_addr->contact[i].addr);
	}
}

//查找一个联系人并且输出
void search_linkman(pLMCount my_addr)
{
	int ret = 0;
	char search_name[20] = "0";
	printf("请输入你要查找的联系人的名字:>");
	scanf("%s", search_name);
	ret = find_name(my_addr, search_name); 
	if (ret != -1)
	{
		printf("name\tsex\tage\ttel\taddr\n");
		printf("\t%-s\t\t%-s\t\t%-d\t\t%-s\t\t%-s\n", my_addr->contact[ret].name,
			my_addr->contact[ret].sex,
			my_addr->contact[ret].age,
			my_addr->contact[ret].tel,
			my_addr->contact[ret].addr);
	}
	printf("查找结束\n");
}

//修改联系人信息
void revise_linkman(pLMCount my_addr)
{
	int ret = 0;
	char revise_name[20] = "0";
	printf("请输入你要修改的联系人的名字:>");
	scanf("%s", revise_name);
	ret = find_name(my_addr, revise_name);
	printf("请输入联系人姓名:>");
	scanf("%s", my_addr->contact[ret].name);
	printf("请输入联系人的性别:>");
	scanf("%s", my_addr->contact[ret].sex);
	printf("请输入联系人的年龄:>");
	scanf("%d", &my_addr->contact[ret].age);
	printf("请输入联系人的电话:>");
	scanf("%s", my_addr->contact[ret].tel);
	printf("请输入联系人的地址:>");
	scanf("%s", my_addr->contact[ret].addr);
	printf("修改结束\n");
}

3.对于通讯录的测试代码放在test.h中

代码如下:

#include "address.h"

void menu()
{
	printf("******       ADDRESS LIST     *****\n");
	printf("******  1.enter     2.empty   *****\n");
	printf("******  3.delete    4.sort    *****\n");
	printf("******  5.show      6.search  *****\n");
	printf("******  7.revise    8.exit    *****\n");
	printf("***********************************\n");
}
int main()
{
	LMCount addr;
	pLMCount my_addr = &addr; 
	init_linkman(my_addr);//初始化通讯录
	int input = 0;
	do
	{
		menu();
		printf("请选择操作>");
		scanf("%d", &input);

		switch (input)
		{
		case ENTER:
			enter_linkman(my_addr);
			break;
		case EMPTY:
			empty_linkman(my_addr);
			break;
		case DELETE:
			delete_linkman(my_addr);
			break;
		case SORT:
			sort_linkman(my_addr);
			break;
		case SHOW:
			show_linkman(my_addr);
			break;
		case SEARCH:
			search_linkman(my_addr);
			break;
		case REVISE:
			revise_linkman(my_addr);
			break;
		case EXIT:
			exit(0);
			break;
		default:
			printf("Choose is error,please again choose.\n");
			break;
		}
	} while (input);

	return 0;
}
以上就是静态通讯录的实现。如有不会可以私聊我哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值