栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言1. 通讯录——结构体+枚举应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言1. 通讯录——结构体+枚举应用

需求:

类型和函数的声明都在h头文件
通讯录的main函数文件——test文件:

#define _CRT_SECURE_NO_WARNINGS

#include "learn17_Contact.h"


void menu()
{
	printf("******************************************n");
	printf("****1. add			2. del		**********n");
	printf("****3. search		4. modify	**********n");
	printf("****5. sort			6. print**************************************n");
	printf("****7. exit					**************************************n");
	printf("******************************************n");
}

// 利用枚举默认值更好switch的选项
// 1、2、3、4、5、6:
enum Option
{
	EXIT,	// 0
	ADD,	// 
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};
void test()
{
	int input = 0;
	// 创建通讯录
	//PeoInfo data[1000];	// 存1000人信息
	//int sz = 0;	// 通讯录中已经保存的信息个数
	// 有通讯录结构体时,上面两行都不需要了
	Contact con;	// 通讯录
	// 初始化通讯录	sz要置为0
	InitContact(&con);
	do
	{
		menu();
		printf("请选择>");
		scanf("%d", &input);
		switch (input)
		{
			case ADD:
				AddContact(&con);		// 要改con,所以要传con地址	传con只是形参的拷贝
				break;
			case DEL:
				DelContact(&con);
				break;
			case SEARCH:
				SearchContact(&con);
				break;
			case MODIFY:
				break;
			case SORT:
				break;
			case PRINT:
				PrintContact(&con);	// 这里传con可以,因为只打印,但是传地址,效率高,因为后期结构体存的内容多,很大时,形参临时拷贝会很慢
				break;
			case 0:
				printf("退出通讯录n");
				break;
			default:
				printf("选择错误n");
				break;
		}
	} while (input);	// 当input是0,这个while就停了。
}


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

contact通讯录头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS

#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 35
#include
#include
#include

typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

// 创建通讯录结构体,包含通讯录结构体数组和sz,不然直接对data[1000]操作,做函数传参时,需要又传通讯录data,又要传大小sz
typedef struct Contact
{
	PeoInfo data[1000];	// 放1000人信息
	int sz;	// 通讯录中记录保存信息个数
}Contact;

void AddContact(Contact* pc);
void InitContact(Contact* pc);
void PrintContact(Contact* pc);
void DelContact(Contact* pc);
void SearchContact(Contact* pc);

头文件的实现

#include "learn17_Contact.h"

void InitContact(Contact* pc)
{
	// 初始化
	assert(pc);	// pc空值直接报错
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));	// 大小直接用->data,不需要乘法了,因为data本身就算1000个的大小
}

void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加n");
		return;
	}
	// 录入
	printf("输入名字:>");
	scanf("%s", &pc->data[pc->sz].name);
	printf("输入年龄:");
	scanf("%d", &pc->data[pc->sz].age);
	printf("输入性别:");
	scanf("%s", &pc->data[pc->sz].sex);
	printf("输入电话:");
	scanf("%s", &pc->data[pc->sz].tele);
	printf("输入地址:");
	scanf("%s", &pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功n");
}


void PrintContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s %-5s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{

		// 左对齐,加负号
		printf("%-20s %-5d %-5s %-12s %-30sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

// 找到了返回下标
// 根据名字找人,找不到返回-1
int FindByName(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		// strcmp比较:
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除n");
	}
	// 删除
	// 1. 
	printf("输入要删的人名");
	char name[NAME_MAX] = {0};
	scanf("%s",&name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在n");
		return;
	}
	// 2. 删除,做覆盖
	for (int i = pos; i <=pc->sz-2 ; i++)
	{
		pc->data[i] = pc -> data[i + 1];
	}
	pc->sz--;
	printf("删除成功n");
}

void SearchContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法查找n");
	}
	// 删除
	// 1. 
	printf("输入要找的人名:");
	char name[NAME_MAX] = { 0 };
	scanf("%s", &name);
	int pos = FindByName(pc, name);
	int i = pos;
	if (pos == -1)
	{
		printf("要查找的人不存在n");
		return;
	}
	printf("%-20s %-5s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-30sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022789.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号