【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)

过程详解

  • step 0.总体思路
  • step 1.创建通讯录
  • step 2.创建联系人结构体并初始化通讯录
  • step 3.Add增加联系人的信息到通讯录
  • step 4.显示通讯中的信息
  • step 5.删除指定联系人
  • step 6.查找指定联系人
  • step 7.修改指定联系人的信息
  • step 8.排序通讯录中的信息

step 0.总体思路


注:将所有的头文件声明放入contact.h的头文件中

step 1.创建通讯录


test.c文件

#include "contact.h"

void menu()
{
	printf("*************************************************\n");
	printf("**************1.Add        2.Del*****************\n");
	printf("**************3.Search     4.Modify**************\n");
	printf("**************5.Show       6.Sort****************\n");
	printf("**************       0.exit         *************\n");
	printf("*************************************************\n");

}

int main()
{
	//创建通讯录
	int input = 0;

	//通讯录测试主体↓
	do
	{
		menu();//打印简单菜单,显示通讯录的功能
		printf("请选择:");
		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("退出通讯录");
			break;
		default:
			printf("选择错误,请重新选择:\n");
			break;
		}
	} while (input);
}

step 2.创建联系人结构体并初始化通讯录

【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第1张图片
【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第2张图片

#pragma once

#include
#include 

//便于后续可能更改数据
#define N_MAX 100

#define NAME_MAX 30
#define GENDER_MAX 5
#define TEL_MAX 13
#define ADDR_MAX 50

//创建联系人结构体
struct PeoInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int tel[TEL_MAX];
	int age;
	char addres[ADDR_MAX];
};

struct Contact
{
	struct PeoInfo data[N_MAX];
	int sz;
};

//初始化通讯录
void InitContact(struct Contact* pc);

【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第3张图片

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, N_MAX * sizeof(struct PeoInfo));
}

memest函数笔记
memset(cplusplus.com)

step 3.Add增加联系人的信息到通讯录

【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第4张图片
【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第5张图片

//增加联系人的信息到通讯录
void AddContact(struct Contact* pc)
{
	//首先判断能否增加信息
	if (pc->sz == N_MAX)
	{
		printf("通讯录已满,无法增加联系人的信息\n");
		return;
	}
	else
	{
		printf("请输入联系人的名字:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入联系人的性别:");
		scanf("%s", pc->data[pc->sz].gender);
		printf("请输入联系人的电话:");
		scanf("%s", pc->data[pc->sz].tel);
		printf("请输入联系人的年龄:");
		scanf("%d", &pc->data[pc->sz].age);//注意这里age不是数组名!要有‘&’
		printf("请输入联系人的地址:");
		scanf("%s", pc->data[pc->sz].addres);
		printf("成功增加联系人的信息\n\n");
		pc->sz++;
	}
}

运行结果
【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第6张图片

step 4.显示通讯中的信息

【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第7张图片
【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第8张图片

//显示通讯录中的信息
void ShowContact(const struct Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-5s\t%-15s\t%-5s\t%-30s\n","姓名","性别","电话","年龄","地址");
	//右对齐-正数 ; 左对齐-负数
	for (i = 0; i < (pc->sz); i++)
	{
		printf("%-20s\t%-5s\t%-15s\t%-5d\t%-30s\n", pc->data[i].name, 
			                                        pc->data[i].gender,
			                                        pc->data[i].tel,
			                                        pc->data[i].age,
			                                        pc->data[i].addres);
	}
}

运行结果
【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第9张图片

step 5.删除指定联系人

【C语言进阶】[struct结构体的应用]——contact1.0通讯录(初级)_第10张图片

//根据姓名查找指定联系人
int FindByName(const struct Contact* pc, char* name)
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			//printf("该联系人不存在\n");
			return i;
		}

	}
	return -1;
}

//删除指定联系人
void DelContact(struct Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入指定删除的联系人的姓名:");
	scanf("%s", &name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("该联系人不存在\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = 0; i < (pc->sz - 1); i++)
		{
			pc->data[ret + i] = pc->data[ret + 1 + i];
		}
		pc->sz--;
		printf("成功删除指定联系人\n");
	}
}

strcmp函数笔记

step 6.查找指定联系人

思路:前半部分同 step5.删除 的思路(到查找为止)->后半部分同 step4.显示 的思路(输出指定查找的联系人)

//查找指定联系人
void SearchContact(const struct Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入指定查找的联系人的姓名:");
	scanf("%s", &name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("该联系人不存在\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5s\t%-15s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
		printf("%-20s\t%-5s\t%-15s\t%-5d\t%-30s\n", pc->data[ret].name,
			pc->data[ret].gender,
			pc->data[ret].tel,
			pc->data[ret].age,
			pc->data[ret].addres);
	}
}

step 7.修改指定联系人的信息

思路:类似step5.删除 +step3.增加的思路(删除变修改)

//修改指定联系人的信息
void ModifyContact(struct Contact* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入指定修改的联系人的姓名:");
	scanf("%s", &name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("该联系人不存在\n");
		return;
	}
	else
	{
		//注意是[ret]!
		printf("请输入联系人的名字:");
		scanf("%s", pc->data[ret].name);
		printf("请输入联系人的性别:");
		scanf("%s", pc->data[ret].gender);
		printf("请输入联系人的电话:");
		scanf("%s", pc->data[ret].tel);
		printf("请输入联系人的年龄:");
		scanf("%d", &pc->data[ret].age);
		printf("请输入联系人的地址:");
		scanf("%s", pc->data[ret].addres);
		printf("成功修改联系人的信息\n\n");
	}
}

step 8.排序通讯录中的信息

利用qsort函数

//按名字排序
int CmpByName(const void* e1, const void* e2)
{
	return ((struct PeoInfo*)e1)->name - ((struct PeoInfo*)e2)->name;
}
//排序通讯录中的信息
void SortContact(const struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}

qsort函数

源码

你可能感兴趣的:(学习笔记,c语言)