c语言实现通讯录-结构体的运用

本文详细介绍了如何使用C语言实现一个包含1000个联系人信息的通讯录应用,涉及添加、删除、修改、查找、排序和打印等功能,通过函数封装和结构体设计,展示了程序的实现过程和测试逻辑。
摘要由CSDN通过智能技术生成

一.通讯录功能

1.保存1000个联系人的信息

2.增加联系人

3.删除联系人

4.修改联系人

5.查找联系人

6.排序

7.打印

其中一个人的信息包括:

名字   性别   年龄   电话   住址

二.实现的总体思路

创建三个文件

contact.h文件储存头文件的声明和自定义类型

contact.c文件储存具体函数的实现代码

test.c用于测试程序

注意:在写程序时尽量使用函数封装

三.程序实现

1.目录与test.c文件逻辑的基本实现

#include "contact.h"

void menu()
{
	printf("**********************************\n");
	printf("******  1.Add      2.Sub    ******\n");
	printf("******  3.modify   4.select ******\n");
	printf("******  5.sort     6.print  ******\n");
	printf("******  0.exit              ******\n");
	printf("**********************************\n");
}

void test()
{
	int input = 0;
	
	do
	{
		menu();
		printf("请选择模式:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 0:
			printf("推出程序\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}

	} while (input);

}

为了便于其他程序员阅读,可以使用枚举将数字替换,枚举类型在.h文件中声明

修改完之后的代码

switch (input)
		{
		case ADD:
			break;
		case SUB:
			break;
		case MODIFY:
			break;
		case SELECT:
			break;
		case SORT:
			break;
		case PRINT:
			break;
		case EXIT:
			printf("退出程序\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}

 枚举类型默认EXIT为0,之后依次加1,就不用具体声明枚举常量的值了.

2.数据的存储

本节讲述数据的存储实现

首先,我们要有一个结构体,去储存人的信息

其次,需要一个可以储存一千人信息的空间

 我们都在contact.c文件中写

为了方便后期修改,可以使用宏定义将可能会变动的值改名

为了方便排序和记录通讯录已经储存信息的个数,设置一个变量sz用于储存

为了便于使用1000人的信息和已经储存的人数,可将这两个封装在一个结构体

#define NAME 20
#define SEX 5
#define TELE 12
#define ADDR 30
#define MAX 1000

enum Mode
{
	EXIT,
	ADD,
	SUB,
	MODIFY,
	SELECT,
	SORT,
	PRINT
};

typedef struct PeoInfo
{
	char Name[NAME];
	char Sex[SEX];
	int Old;
	char Tele[TELE];
	char Addr[ADDR];
}PeoInfo;

typedef struct contact
{
	PeoOneInfo PeoInfo[MAX];
	int sz;
}contact;

3.实现增加一个人功能的函数

在实现增加一个人的时候需要先初始化通讯录

void InitContact(contact* p)
{
	assert(p);
	p->sz = 0;
	memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}

下面实现输入信息

其中p->sz代表1000个数组的第几个

void AddContact(contact* p)
{
	assert(p);

	printf("请输入名字\n");
	scanf("%s", p->PeoInfo[p->sz].Name);

	printf("请输入性别\n");
	scanf("%s", p->PeoInfo[p->sz].Sex);

	printf("请输入年龄\n");
	scanf("%d", &(p->PeoInfo[p->sz].Age));

	printf("请输入手机号\n");
	scanf("%s", p->PeoInfo[p->sz].Tele);

	printf("请输入地址\n");
	scanf("%s", p->PeoInfo[p->sz].Addr);

	p->sz++;

}

4.实现减去一个人的功能

要实现减去一个人的功能首先要查找这个人

本文章的查询方法是使用名字查询

查找函数后面的查找功能以及替换功能还会用到所以选择用一个函数进行封装

该函数的使用逻辑是,如果存在返回sz,如果不存在返回-1

void SubContact(contact* p)
{
	assert(p);
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到\n");
		return;
	}
	int j = 0;
	for (j = i; j < p->sz - 1; j++)
	{
		p->PeoInfo[j] = p->PeoInfo[j + 1];
	}
	p->sz--;

}

5.实现打印的功能

我们需要通过界面调试来验证我们前面的代码是否正确,所以要加入打印功能

void PrintContact(const contact* p)
{
	int i = 0;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < p->sz; i++)
	{
		printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
			p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
	}
	

}

6.实现查找的功能

实现逻辑是输入名字,如果有对应名字,则输出对应人物信息,如果没有则输出没有

void SelectContact(const contact* p)
{
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到该人\n");
		return;
	}

	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
		p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);

}

7.实现更改的功能

输入名字找到对应人物,更改其信息

void ModifyContact(contact* p)
{
	assert(p);
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到该人\n");
		return;
	}

	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
		p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
	printf("请重新信息\n");
	printf("请输入名字\n");
	scanf("%s", p->PeoInfo[i].Name);

	printf("请输入性别\n");
	scanf("%s", p->PeoInfo[i].Sex);

	printf("请输入年龄\n");
	scanf("%d", &(p->PeoInfo[i].Age));

	printf("请输入手机号\n");
	scanf("%s", p->PeoInfo[i].Tele);

	printf("请输入地址\n");
	scanf("%s", p->PeoInfo[i].Addr);


}

8.实现排序的功能

按照年龄从小到大进行排序,使用冒泡排序法

void SortContact(contact* p)
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		int j = 0;
		for (j = 0; j < p->sz - 1; j++)
		{
			if (p->PeoInfo[j].Age > p->PeoInfo[j + 1].Age)
			{
				PeoOneInfo tmp = { 0 };
				tmp = p->PeoInfo[j];
				p->PeoInfo[j] = p->PeoInfo[j + 1];
				p->PeoInfo[j + 1] = tmp;


			}
		}
	}

}

四.总程序

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("**********************************\n");
	printf("******  1.Add      2.Sub    ******\n");
	printf("******  3.modify   4.select ******\n");
	printf("******  5.sort     6.print  ******\n");
	printf("******  0.exit              ******\n");
	printf("**********************************\n");
}

void test()
{
	int input = 0;
	
	contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请选择模式:\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case SUB:
			SubContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SELECT:
			SelectContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case PRINT:
			PrintContact(&con);
			break;
		case EXIT:
			printf("退出程序\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}

	} while (input);

}

int main()
{
	test();
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

void InitContact(contact* p)
{
	assert(p);
	p->sz = 0;
	memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}


void AddContact(contact* p)
{
	assert(p);

	printf("请输入名字\n");
	scanf("%s", p->PeoInfo[p->sz].Name);

	printf("请输入性别\n");
	scanf("%s", p->PeoInfo[p->sz].Sex);

	printf("请输入年龄\n");
	scanf("%d", &(p->PeoInfo[p->sz].Age));

	printf("请输入手机号\n");
	scanf("%s", p->PeoInfo[p->sz].Tele);

	printf("请输入地址\n");
	scanf("%s", p->PeoInfo[p->sz].Addr);

	p->sz++;

}

int SelectName(const contact* pp)
{
	assert(pp);
	char name[NAME] = { 0 };
	printf("请输入你要查找的名字\n");
	scanf("%s", name);
	int i = 0;
	for (i = 0; i < pp->sz; i++)
	{
		if (0 == strcmp(name, pp->PeoInfo[i].Name))
		{
			return i;
		}
	}
	return -1;
}


void SubContact(contact* p)
{
	assert(p);
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到\n");
		return;
	}
	int j = 0;
	for (j = i; j < p->sz - 1; j++)
	{
		p->PeoInfo[j] = p->PeoInfo[j + 1];
	}
	p->sz--;

}

void PrintContact(const contact* p)
{
	assert(p);
	int i = 0;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < p->sz; i++)
	{
		printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
			p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
	}
	

}

void ModifyContact(contact* p)
{
	assert(p);
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到该人\n");
		return;
	}

	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
		p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
	printf("请重新信息\n");
	printf("请输入名字\n");
	scanf("%s", p->PeoInfo[i].Name);

	printf("请输入性别\n");
	scanf("%s", p->PeoInfo[i].Sex);

	printf("请输入年龄\n");
	scanf("%d", &(p->PeoInfo[i].Age));

	printf("请输入手机号\n");
	scanf("%s", p->PeoInfo[i].Tele);

	printf("请输入地址\n");
	scanf("%s", p->PeoInfo[i].Addr);


}

void SelectContact(const contact* p)
{
	assert(p);
	int i = SelectName(p);
	if (-1 == i)
	{
		printf("找不到该人\n");
		return;
	}

	printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
	printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
		p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);

}

void SortContact(contact* p)
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		int j = 0;
		for (j = 0; j < p->sz - 1; j++)
		{
			if (p->PeoInfo[j].Age > p->PeoInfo[j + 1].Age)
			{
				PeoOneInfo tmp = { 0 };
				tmp = p->PeoInfo[j];
				p->PeoInfo[j] = p->PeoInfo[j + 1];
				p->PeoInfo[j + 1] = tmp;


			}
		}
	}

}

contact.h

#pragma once
#include <stdio.h>
#include <assert.h>
#include <string.h>

#define NAME 20
#define SEX 8
#define TELE 12
#define ADDR 30
#define MAX 1000

enum Mode
{
	EXIT,
	ADD,
	SUB,
	MODIFY,
	SELECT,
	SORT,
	PRINT
};

typedef struct PeoOneInfo
{
	char Name[NAME];
	char Sex[SEX];
	int Age;
	char Tele[TELE];
	char Addr[ADDR];
}PeoOneInfo;



typedef struct contact
{
	PeoOneInfo PeoInfo[MAX];
	int sz;
}contact;

void InitContact(contact* p);

void AddContact(contact* p);

void SubContact(contact* p);

int SelectName(const contact* pp);

void ModifyContact(contact* p);

void SelectContact(const contact* p);

void PrintContact(const contact* p);

void SortContact(contact* p);



增加功能

清除通讯录

同初始化

void ClearContact(contact* p)
{
	assert(p);
	p->sz = 0;
	memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}

以名字长度为标准排序

void SortNameContact(contact* p)
{
	assert(p);
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		int j = 0;
		for (j = 0; j < p->sz - 1; j++)
		{
			if (strlen(p->PeoInfo[j].Name) > strlen( p->PeoInfo[j + 1].Name))
			{
				PeoOneInfo tmp = { 0 };
				tmp = p->PeoInfo[j];
				p->PeoInfo[j] = p->PeoInfo[j + 1];
				p->PeoInfo[j + 1] = tmp;


			}
		}
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值