C语言-自定义类型-结构体应用-通讯录(11.2)

目录

1.通讯录的设计思路

1.1主函数与通讯录框架

1.2菜单的实现

1.3通讯录的定义与初始化

2.通讯录具体功能的实现

2.1添加联系人

2.2删除联系人

2.3查找联系人

2.4修改联系人信息

2.5整理通讯录(按年龄排序)

2.6查看整个通讯录

3.通讯录源码

写在最后:


1.通讯录的设计思路

我们创建三个文件拆分通讯录的实现过程:

一个测试文件(test.c)通讯录实现文件(contact.c)头文件(contact.h)

 我们先对测试文件进行编辑,

写出一个总体的通讯录的框架。

1.1主函数与通讯录框架

在test.c文件中实现。

添加主函数:

int main()//主函数里不要放太多东西
{
	test();
	return 0;
}

分装test函数实现:

利用do...while循环:

void test()
{
	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("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

swich语句分出我们需要实现的功能。

1.2菜单的实现

打印菜单(可以按照自己的喜好设计):

void menu()
{
	printf("\n");
	printf("—————————— 通讯录 ———————————-\n");
	printf("—————————————————————————-\n");
	printf("————————   1.添加联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   2.删除联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   3.查找联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   4.修改联系人信息  ———————\n");
	printf("—————————————————————————-\n");
	printf("————————   5.整理通讯录    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   6.查看整个通讯录  ———————\n");
	printf("—————————————————————————-\n");
	printf("————————   0.退出通讯录    ————————\n");
	printf("—————————————————————————-\n");
	printf("\n");
}

1.3通讯录的定义与初始化

基本框架设计好后,我们需要一段空间来存储通讯录中的数据:

在contact.h文件中实现:

#pragma once//防止头文件重复引用

//提前将需要使用的头文件引用,
//具体实现通讯录是,需要头文件可以直接添加
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

//通过#define定义的常量,方便管理和使用
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//通讯录中存放一个人的信息
typedef struct PeoInfo//typedef简化结构体名称
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

//创建一个结构体将数组和数组中存放的元素数封装
typedef struct Contact
{
	PeoInfo data[MAX];//data这个数组元素的类型的是结构体PeoInfo
	                  //用来存放联系人信息
	int sz;//用来存放数组元素个数
}Contact;

这样,存放通讯录的结构体就创建完了,

接下来是通讯录的初始化:

在test.c文件中实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	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("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

我们会将功能不断添加到test函数里面。

初始化通讯录的实现:

contact.h中声明函数,其他两个文件包含#include "contact.h"

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

在contact.c文件中实现函数功能:

//初始化通讯录
void InitContact(Contact* pc)
{
	pc->sz = 0;//代表数组中有0个元素
	memset(pc->data, 0, sizeof(pc->data));//data是整个数组的大小,初始化成0
}

完成初始化后,我们就要具体实现通讯录的各种功能了。

2.通讯录具体功能的实现

2.1添加联系人

我们分装函数AddContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			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);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

在contact.c文件中实现函数功能:

//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)//如果通讯录满了
	{
		printf("通讯录已满,无法添加\n");
		return;//就会直接返回
	}

	//增加一个人的信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	//通过pc指针访问data数组的结构体类型的元素,进而访问结构体成员

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));//age不是数组,需要取地址

	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);

	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;//代表数组中的元素个数+1
}

2.2删除联系人

我们分装函数DelContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			break;
		case 2:
            //删除联系人
            DelContact(&con);
			break;
		case 3:
            //查找联系人
			break;
		case 4:
            //修改指定联系人
            break;
		case 5:
            //整理通讯录(按类型排序)
			break;
		case 6:
            //显示通讯录的信息
			break;
		case 0:
            //退出通讯录
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

在contact.c文件中实现函数功能:

//查找函数
int FindByName(const Contact* pc, char name[])
{
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{   //通过strcmp函数判断要查找的联系人是否存在
			del = i;
			return del;//返回数组下标(要查找的元素的位置)
		}
	}
	return -1;//找不到
}

//删除联系人
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)

	if (pc->sz == 0)//判断通讯录中是否存在联系人
	{
		printf("通讯录为空,无法删除\n");
		return;
	}

	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);//输入字符串
	int ret = FindByName(pc, name);//分装字符串查找函数
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;
	}

	//删除
	int i = 0;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];//将存放在被删除的联系人后面的联系人信息,
   	}                                 //通过循环一个个往前覆盖
	pc->sz--;//数组元素-1
	printf("删除成功\n");
}

2.3查找联系人

我们分装函数SearchContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			break;
		case 2:
            //删除联系人
            DelContact(&con);
			break;
		case 3:
            //查找联系人
            SearchContact(&con);
			break;
		case 4:
            //修改指定联系人
            break;
		case 5:
            //整理通讯录(按类型排序)
			break;
		case 6:
            //显示通讯录的信息
			break;
		case 0:
            //退出通讯录
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

在contact.c文件中实现函数功能:

//查找函数
int FindByName(const Contact* pc, char name[])
{
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{   //通过strcmp函数判断要查找的联系人是否存在
			del = i;
			return del;//返回数组下标(要查找的元素的位置)
		}
	}
	return -1;//找不到
}

//查找联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//函数复用
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}

	//打印信息//我实现的是左对齐,并用水平制表符使打印出来的观感更好
	printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
		printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].addr,
			pc->data[pos].tele);
}

2.4修改联系人信息

我们分装函数ModefyContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			break;
		case 2:
            //删除联系人
            DelContact(&con);
			break;
		case 3:
            //查找联系人
            SearchContact(&con);
			break;
		case 4:
            //修改指定联系人
            ModifyContact(&con);
            break;
		case 5:
            //整理通讯录(按类型排序)
			break;
		case 6:
            //显示通讯录的信息
			break;
		case 0:
            //退出通讯录
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

在contact.c文件中实现函数功能:

//查找函数
int FindByName(const Contact* pc, char name[])
{
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{   //通过strcmp函数判断要查找的联系人是否存在
			del = i;
			return del;//返回数组下标(要查找的元素的位置)
		}
	}
	return -1;//找不到
}

//修改指定联系人
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//函数复用
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}

	//重新录入
	printf("请输入修改后的名字:>");
	scanf("%s", pc->data[pos].name);

	printf("请输入修改后的年龄:>");
	scanf("%d", &(pc->data[pos].age));//age不是数组,需要取地址

	printf("请输入修改后的性别:>");
	scanf("%s", pc->data[pos].sex);

	printf("请输入修改后的地址:>");
	scanf("%s", pc->data[pos].addr);

	printf("请输入修改后的电话:>");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

2.5整理通讯录(按年龄排序)

我们分装函数SortContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			break;
		case 2:
            //删除联系人
            DelContact(&con);
			break;
		case 3:
            //查找联系人
            SearchContact(&con);
			break;
		case 4:
            //修改指定联系人
            ModifyContact(&con);
            break;
		case 5:
            //整理通讯录(按类型排序)
            SortContact(&con);
			break;
		case 6:
            //显示通讯录的信息
			break;
		case 0:
            //退出通讯录
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

//整理通讯录
void SortContact(Contact* pc);

在contact.c文件中实现函数功能:

//整形排序的实现
int CmpContactByAge(const void* e1, const void* e2)
{
	//这个排出来的是升序,如果想排降序,只需将e1和e2的位置调换即可
	return ((Contact*)e1)->data->age - ((Contact*)e2)->data->age;
}

//整理通讯录
void SortContact(Contact* pc)
{
	assert(pc);
	int sz = pc->sz;
	//通过qsort函数辅助排序
	qsort(pc->data, sz, sizeof(pc->data[0]), CmpContactByAge);
	printf("排序成功\n");
}

2.6查看整个通讯录

我们分装函数AddContact实现:

void test()
{
	int input = 0;
    
	//创建通讯录con
	Contact con;

    //初始化通讯录
    InitContact(&con);//分装成函数实现

	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);//选择功能
		switch(input)
		{
		case 1:
            //增加联系人
            AddContact(&con);
			break;
		case 2:
            //删除联系人
            DelContact(&con);
			break;
		case 3:
            //查找联系人
            SearchContact(&con);
			break;
		case 4:
            //修改指定联系人
            ModifyContact(&con);
            break;
		case 5:
            //整理通讯录(按类型排序)
            SortContact(&con);
			break;
		case 6:
            //显示通讯录的信息
            ShowContact(&con);
			break;
		case 0:
            //退出通讯录
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

在contact.h中声明:

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

//整理通讯录
void SortContact(Contact* pc);

//显示通讯录的信息
void ShowContact(const Contact* pc);

在contact.c文件中实现函数功能:

//显示通讯录的信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录并打印
	{
		printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n",
				pc->data[i].name,
 				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].addr,
				pc->data[i].tele);
	}
}

这样,我们就将静态的通讯录实现成功了。

以下是源码,有兴趣的话可以拿来测试体验一下,我就不在这里演示了。

3.通讯录源码

test.c文件:

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

void menu()
{
	printf("\n");
	printf("—————————— 通讯录 ———————————-\n");
	printf("—————————————————————————-\n");
	printf("————————   1.添加联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   2.删除联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   3.查找联系人    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   4.修改联系人信息  ———————\n");
	printf("—————————————————————————-\n");
	printf("————————   5.整理通讯录    ————————\n");
	printf("—————————————————————————-\n");
	printf("————————   6.查看整个通讯录  ———————\n");
	printf("—————————————————————————-\n");
	printf("————————   0.退出通讯录    ————————\n");
	printf("—————————————————————————-\n");
	printf("\n");
}

void test()
{
	int input = 0;

	//创建通讯录con
	Contact con;

	//初始化通讯录
	InitContact(&con);

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case EXIT:
			printf("通讯录已退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

int main()//主函数里不要放太多东西
{
	test();
	return 0;
}

contact.h文件:

#pragma once//防止头文件重复引用

//提前将需要使用的头文件引用,
//具体实现通讯录是,需要头文件可以直接添加
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

//通过#define定义的常量,方便管理和使用
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//通讯录中存放一个人的信息
typedef struct PeoInfo//typedef简化结构体名称
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

//创建一个结构体将数组和数组中存放的元素数封装
typedef struct Contact
{
	PeoInfo data[MAX];//data这个数组元素的类型的是结构体PeoInfo
	                  //用来存放联系人信息
	int sz;//用来存放数组元素个数
}Contact;

enum Option
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};

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

//增加联系人
void AddContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

//整理通讯录
void SortContact(Contact* pc);

//显示通讯录的信息
void ShowContact(const Contact* pc);

contact.c文件:

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	pc->sz = 0;//代表数组中有0个元素
	memset(pc->data, 0, sizeof(pc->data));//data是整个数组的大小,初始化成0
}

//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)//如果通讯录满了
	{
		printf("通讯录已满,无法添加\n");
		return;//就会直接返回
	}

	//增加一个人的信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	//通过pc指针访问data数组的结构体类型的元素,进而访问结构体成员

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));//age不是数组,需要取地址

	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);

	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;//代表数组中的元素个数+1
}

//显示通讯录的信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录并打印
	{
		printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n",
				pc->data[i].name,
 				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].addr,
				pc->data[i].tele);
	}
}

//查找函数
int FindByName(const Contact* pc, char name[])
{
	int i = 0;
	int del = 0;
	for (i = 0; i < pc->sz; i++)//遍历通讯录
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{   //通过strcmp函数判断要查找的联系人是否存在
			del = i;
			return del;//返回数组下标(要查找的元素的位置)
		}
	}
	return -1;//找不到
}

//删除联系人
void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)

	if (pc->sz == 0)//判断通讯录中是否存在联系人
	{
		printf("通讯录为空,无法删除\n");
		return;
	}

	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);//输入字符串
	int ret = FindByName(pc, name);//分装字符串查找函数
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;
	}

	//删除
	int i = 0;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];//将存放在被删除的联系人后面的联系人信息,
   	}                                 //通过循环一个个往前覆盖
	pc->sz--;//数组元素-1
	printf("删除成功\n");
}

//查找联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//函数复用
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}

	//打印信息//我实现的是左对齐,并用水平制表符使打印出来的观感更好
	printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
		printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].addr,
			pc->data[pos].tele);
}

//修改指定联系人
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };//初始化name数组(字符串)
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);//函数复用
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}

	//重新录入
	printf("请输入修改后的名字:>");
	scanf("%s", pc->data[pos].name);

	printf("请输入修改后的年龄:>");
	scanf("%d", &(pc->data[pos].age));//age不是数组,需要取地址

	printf("请输入修改后的性别:>");
	scanf("%s", pc->data[pos].sex);

	printf("请输入修改后的地址:>");
	scanf("%s", pc->data[pos].addr);

	printf("请输入修改后的电话:>");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

//整形排序的实现
int CmpContactByAge(const void* e1, const void* e2)
{
	//这个排出来的是升序,如果想排降序,只需将e1和e2的位置调换即可
	return ((Contact*)e1)->data->age - ((Contact*)e2)->data->age;
}

//整理通讯录
void SortContact(Contact* pc)
{
	assert(pc);
	int sz = pc->sz;
	//通过qsort函数辅助排序
	qsort(pc->data, sz, sizeof(pc->data[0]), CmpContactByAge);
	printf("排序成功\n");
}

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戊子仲秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值