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

news2024/11/17 8:30:29

目录

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");
}

写在最后:

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 网络管理

一&#xff1a;NetPlan配置 1、安装netplan 如果/etc/netplan目录不存在请用以下命令安装&#xff1a; apt -y install netplan.io 2、配置文件 创建并编辑/etc/netplan/01-netplan.yaml文件&#xff1a; eth0&#xff1a;动态分配&#xff1b;eth1&#xff1a;静态分配 …

聊一聊nginx中KeepAlive的设置

文章目录问题分析为什么要有KeepAlive&#xff1f;TCP KeepAlive和HTTP的Keep-Alive是一样的吗&#xff1f;Nginx的TCP KeepAlive如何设置Apache中KeepAlive和KeepAliveTimeOut参考资料问题 之前工作中遇到一个KeepAlive的问题&#xff0c;现在把它记录下来&#xff0c;场景是…

【BP靶场portswigger-客户端11】跨站点脚本XSS-20个实验(上)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

ssm权限管理系统1

先说一个声明&#xff0c;这个文章可能不完整&#xff0c;也就是说&#xff0c;我只是列举出了项目里面部分疑问难点&#xff0c;然后你们想做&#xff0c;可以去b站查看这个项目的视频。我这里会上传每一部分源代码 svn: 安装好svn服务器之后&#xff0c;我们需要去服务器建…

Python之勒让德多项式

文章目录勒让德多项式简介求导和积分求根和反演拟合勒让德多项式简介 Legendre多项式是一种非常重要的正交多项式&#xff0c;在物理学中有着广泛的应用&#xff0c;例如点电荷在空间中的激发电势就具备勒让德多项式的形式。其表达形式为 Pn(x)12nn!dndxn{(x2−1)n}P_n(x)\fra…

D. Rorororobot(线段树寻找区间最大值)

Problem - 1709D - Codeforces 有一个网格&#xff0c;由n行和m列组成。行的编号是从1到n&#xff0c;从下到上。列从左至右编号为1至m。第i列的底部ai单元被封锁&#xff08;第1,2,...,ai行的单元&#xff09;&#xff0c;其余n-ai单元没有被封锁。 一个机器人正在穿越这个网…

制冷设备远程监控解决方案

大中型工业制冷设备方面在国内发展还是处在一个发展期&#xff0c;前景广阔&#xff0c;在船舶行业&#xff0c;大型化&#xff0c;个性化&#xff0c;大冷量化是趋势&#xff0c;在石油石化领域&#xff0c;工艺分离、结晶浓缩、提纯催化需求低温&#xff0c;而在建筑领域&…

Vue+element 实现影响榜功能

目录 一、英雄榜实现 1、引入element Lib 和VUE 2、设置滚动条动态显示 1&#xff09;设置对应的VUE参数名&#xff1a;scrollHiddenVar 2&#xff09;VUE data定义 3&#xff09;mounted 设置鼠标监听事件 4&#xff09;监听方法 3、设置element Table 4、table 数组…

CentOS 7 升级 GCC/G++ 版本

CentOS 7官方源的 GCC 最新版本是 4.8.5&#xff0c;该版本发布于2015年&#xff0c;年代久远且不支持高版本的 C 编译了&#xff0c;因此有必要安装高版本的 GCC。   红帽&#xff08;RedHat&#xff09;中拥有多个已经编译好了的高版本 GCC&#xff0c;但未更新到 base 和 …

再说多线程(四)——Semaphore类

Semaphore提供了更精细化的多线程控制&#xff0c;如果你看过上一节的Mutex介绍&#xff0c;那么你应该很容易理解Semaphore类。我们直接先以例子开头&#xff0c;然后在介绍这个类。1.Semaphore实例看下面的代码&#xff1a;using System; using System.Threading;namespace S…

【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶,JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记 ✈往期博文回顾:【爪洼岛冒险记】第2站&#xff…

Allegro172版本如何快速打开和关闭层面操作指导

Allegro172版本如何快速打开和关闭层面操作指导 在做PCB设计的时候,打开和关闭某个层面是非常频繁的操作,尤其是丝印等等层面。 Allgeo升级到了172版本的时候,可以将常用的层面添加到Visibility菜单里,就不需要频繁打开颜色管理器打卡和关闭层面了,如下图 具体操作如下 打…

常见锁策略,CAS,synchronized原理

1.常见锁策略锁策略不仅仅局限于java,任何与"锁"相关的话题(操作系统,数据库...),都会涉及到锁策略,这些策略是给锁的实现者用来参考的1.1乐观锁vs悲观锁这个不是两把具体的锁.而是两类锁,是在锁冲突的概率上进行区分的乐观锁指的是预测锁竞争不是很激烈(做的工作相对…

Ambari2.7.5安装Flink1.14

文章目录下载Flink配置安装源下载ambari-flink-service服务修改配置文件创建用户和组重启Ambari登录Ambari安装Flink提交Flink任务Flink 直接单独提交到 On Yarn指定Flink在Yarn跑的容器运行Flink异常异常1异常2异常3下载Flink配置安装源 wget https://archive.apache.org/dis…

Goby+AWVS 联动

系列文章 AWVS安装与激活 AWVS扫描Web应用程序 AWVS扫描报告分析 GobyAWVS 联动 1.Goby简介 Goby是针对目标企业梳理最全面的工具&#xff0c;同构goby可以清晰的扫描出ip地址开放的端口&#xff0c;以及端口对应的服务&#xff0c;于此同事会根据开放的端口及应用进行实战…

分享116个ASP源码,总有一款适合您

ASP源码 分享116个ASP源码&#xff0c;总有一款适合您 116个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1LEs24-feWjvhac6vzyVecg?pwdnosx 提取码&#xff1a;nosx 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&am…

2.线性表

##线性结构 基本特点&#xff1a;结构中各元素之间满足线性关系。 线性关系&#xff1a;数据元素之间存在一对一的关系 1.存在唯一的开始元素 2.存在唯一的终止元素 3.除了开始元素和终止元素&#xff0c;其他元素均有且仅有一个直接前驱元素和一个直接后驱元素。 所有元素可排…

Sass进阶指南 -- 写出更优雅的样式表

我以为已经会了&#xff0c;之前在公司写项目基本都是用sass写样式&#xff0c;十分顺手。直到有段时间&#xff0c;我准备参考Element Plus来设计自己组件库的工程结构&#xff0c;看到Element Plus那些优雅的sass用法时&#xff0c;我开始为我的浅薄和无知感到羞愧。这便开始…

Python学习笔记——集合

集合&#xff08;set&#xff09;是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合&#xff0c;注意&#xff1a;创建一个空集合必须用 set() 而不是 { }&#xff0c;因为 { } 是用来创建一个空字典。创建格式&#xff1a;parame {value01,value02,..…

LeetCode[313]超级丑数

难度&#xff1a;中等题目&#xff1a;超级丑数 是一个正整数&#xff0c;并满足其所有质因数都出现在质数数组 primes中。给你一个整数 n和一个整数数组 primes&#xff0c;返回第 n个 超级丑数 。题目数据保证第 n个 超级丑数 在 32-bit 带符号整数范围内。示例 1&#xff1a…