lenguaje c: realizar la libreta de direcciones

inserte la descripción de la imagen aquí


prefacio

La libreta de direcciones debe implementar 7 funciones: 1. Agregar contactos 2. Eliminar contactos especificados 3. Buscar contactos 4. Modificar contactos 5. Mostrar contactos 6. Borrar contactos 7. Ordenar contactos por nombre


1. Idea de implementación

1. La estructura de la libreta de direcciones.

En primer lugar, la libreta de direcciones es una colección de contactos y los contactos tienen atributos como nombre, sexo, edad, número de teléfono y dirección. Entonces, para datos como contactos, obviamente necesitamos una estructura para implementar contactos. Eso es todo por la estructura de la libreta de direcciones y listo.
como sigue:

#define MAXSIZE 100

typedef struct PeoInfo
{
    
    
	char name[20];
	char sex[5];
	int age;
	char tele[12];
	char adder[20];
}PeoInfo;


typedef struct Contact
{
    
    
	PeoInfo data[MAXSIZE];
	int sz;//方便我们操作data数组,记录我们将要使用的数组下标
}Contact;

2. Realización de una interfaz sencilla de libreta de direcciones.

(Esto es muy simple, así que no lo explicaré)

//使用枚举类型增加代码的可读性
enum {
    
    
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	DESTROY,
	SORT,
};

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

int main()
{
    
    
	int input = 1;
	Contact con;
	InitContact(&con);
	while (input)
	{
    
    
		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 SHOW:
			ShowContact(&con);
			break;
		case DESTROY:
			DestroyContact(&con);
			break;
		case SORT:
			SortConTact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请从新输入\n");
			break;
		}
	}
	return 0;
}

3. Inicialice la libreta de direcciones (InitContact)

Primero que nada, sz en la estructura Contact indica el subíndice de la matriz sobre el que se va a operar, luego configuramos sz = 0, ¿significa que vamos a operar sobre el subíndice 0 de la matriz? ¿No es equivalente a inicializar el ¿directorio?

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

//初始化通讯录
void InitContact(Contact* pc)
{
    
    
	pc->sz = 0;
}

4. Agregar información de contacto (AddContact)

Simplemente opere en la posición de sz en la matriz de datos y luego agregue uno a sz, eso es todo.

//添加联系人
void AddContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc)
{
    
    
	assert(pc);//判断pc是否是NULL

	printf("请输入联系人名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入联系人电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入联系人地址:>");
	scanf("%s", pc->data[pc->sz].adder);
	pc->sz += 1;
}

5. Mostrar libreta de direcciones (ShowContact)

Siempre que haya una variable i, puede atravesar los elementos en [0, sz). Pero preste atención al formato de impresión: los siguientes códigos que utilizo, como %-20s y \t, indican respectivamente que la cadena impresa está alineada a la izquierda con un ancho de 20 caracteres y una pestaña horizontal (4 caracteres vacíos).

//打印通讯录
void ShowContact(Contact* pc);
void ShowContact(Contact* pc)
{
    
    
	assert(pc);

	printf("%-20s\t%-5s\t%-2s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
    
    
		printf("%-20s\t%-5s\t%-2d\t%-12s\t%-20s\n"
			, pc->data[i].name
			, pc->data[i].sex
			, pc->data[i].age
			, pc->data[i].tele
			, pc->data[i].adder);
	}
}

6. Eliminar contacto (DelContact)

Para eliminar un contacto, necesitamos que el usuario ingrese primero el nombre del contacto y luego verifique si el contacto está en la libreta de direcciones. Si se devuelve verdadero, entonces el subíndice del contacto se devuelve a través del puntero y los elementos de la matriz después del subíndice se mueven hacia adelante para sobrescribir el contacto que se va a eliminar, y sz se reduce en uno.
Si no devuelve falso, falló la impresión y eliminación del contacto.

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

//查找名字
bool FindName(Contact* pc, char* name, int* retIndex)
{
    
    
	for (int i = 0; i < pc->sz; i++)
	{
    
    
		if (strcmp(pc->data[i].name, name) == 0)
		{
    
    
			*retIndex = i;
			return true;
		}
	}

	return false;
}


//删除联系人
void DelContact(Contact* pc)
{
    
    
	assert(pc);
	
	char name[20] = {
    
     0 };
	printf("请输入要删除联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		for (int i = retIndex; i < pc->sz - 1; i++)
		{
    
    
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz -= 1;
		printf("删除联系人成功\n");
		return;
	}

	printf("删除联系人失败\n");
	return;
}

7. Buscar contactos (BuscarContacto)

Para buscar un contacto, el usuario debe ingresar primero el nombre del contacto, luego buscar el contacto e imprimir la información del contacto si existe. Si no está presente, imprime que el contacto no existe.

//查找联系人
void SearchContact(Contact* pc);
//查找名字
bool FindName(Contact* pc, char* name, int* retIndex)
{
    
    
	for (int i = 0; i < pc->sz; i++)
	{
    
    
		if (strcmp(pc->data[i].name, name) == 0)
		{
    
    
			*retIndex = i;
			return true;
		}
	}

	return false;
}


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

	char name[20] = {
    
     0 };
	printf("请输入要查找联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		printf("%-20s\t%-5s\t%-2s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
		printf("%-20s\t%-5s\t%-2d\t%-12s\t%-20s\n"
			, pc->data[retIndex].name
			, pc->data[retIndex].sex
			, pc->data[retIndex].age
			, pc->data[retIndex].tele
			, pc->data[retIndex].adder);
		return;
	}

	printf("查找失败\n");
	return;
}

8. Destruir la libreta de direcciones (DestroyContact)

La idea de destruir la libreta de direcciones es la misma que la de inicializar la libreta de direcciones, solo que sz se establece en 0. O reutilice la función InitContact.

//销毁通讯录
void DestroyContact(Contact* pc);
//销毁通讯录
void DestroyContact(Contact* pc)
{
    
    
	assert(pc);

	pc->sz = 0;
	printf("销毁成功\n");
}

//复用InitContact
/*void DestroyContact(Contact* pc)
{
	assert(pc);
	
	InitContact(pc);
}*/


9. Modificar contacto (ModifyContact)

Para modificar un contacto, el usuario primero debe ingresar el nombre del contacto a modificar y luego buscar el contacto. Si está presente, vuelva a ingresar la información del contacto mediante el subíndice. Si no está presente, la modificación de la impresión falló.

//修改联系人
void ModifyContact(Contact* pc);
//修改联系人
void ModifyContact(Contact* pc)
{
    
    
	assert(pc);

	char name[20] = {
    
     0 };
	printf("请输入要修改联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		printf("请输入联系人名字:>");
		scanf("%s", pc->data[retIndex].name);
		printf("请输入联系人性别:>");
		scanf("%s", pc->data[retIndex].sex);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pc->data[retIndex].age));
		printf("请输入联系人电话:>");
		scanf("%s", pc->data[retIndex].tele);
		printf("请输入联系人地址:>");
		scanf("%s", pc->data[retIndex].adder);

		printf("修改成功\n");
		return;
	}

	printf("修改失败\n");
	return;
}

10. Ordenar contactos (SortConTact)

Ordenamos la libreta de direcciones por nombre. Usamos el nombre del primer elemento de la matriz de datos como estándar para dividir la matriz en una matriz más grande que el primer elemento y una matriz más pequeña o igual que el primer elemento, y luego tomamos el primer elemento de las dos matrices. y luego divídalos en matrices mayores o iguales al primer elemento La matriz del primer elemento y la matriz menor o igual al primer elemento, repita esta operación hasta que solo quede un elemento en la matriz.

//排序通讯录
void SortConTact(Contact* pc);
//排序通讯录

void Swap(Contact* pc, int left, int right)
{
    
    
	PeoInfo tmp = pc->data[left];
	pc->data[left] = pc->data[right];
	pc->data[right] = tmp;
}

int PivotIndex(Contact* pc, int startIndex, int endIndex)
{
    
    
	PeoInfo tmp = pc->data[startIndex];

	int right = endIndex;
	int left = startIndex;
	while (left < right)
	{
    
    
		while (left < right && strcmp(pc->data[right].name, tmp.name) > 0)
		{
    
    
			right--;
		}

		while (left < right && strcmp(pc->data[left].name, tmp.name) <= 0)
		{
    
    
			left++;
		}

		Swap(pc, left, right);
	}
	pc->data[startIndex] = pc->data[left];
	pc->data[left] = tmp;

	return left;
}

void QuickSort(Contact* pc, int startIndex, int endIndex)
{
    
    
	if (startIndex > endIndex)
	{
    
    
		return;
	}

	int pivot = PivotIndex(pc, startIndex, endIndex);
	QuickSort(pc, startIndex, pivot - 1);
	QuickSort(pc, pivot + 1, endIndex);
}

void SortConTact(Contact* pc)
{
    
    
	assert(pc);

	QuickSort(pc, 0, pc->sz-1);
	printf("排序成功\n");
}

2. Implementación del código

El archivo test.c se usa para simular la interfaz de selección.
El archivo contact.c se usa para almacenar la implementación de la función.
El archivo contact.h se usa para almacenar la declaración de la función, la declaración de la estructura y la referencia del archivo de encabezado.

//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.destroy  ****\n");
	printf("**** 7.sort    8.exit     ****\n");
	printf("******************************\n");
}

int main()
{
    
    
	int input = 1;
	Contact con;
	InitContact(&con);
	while (input)
	{
    
    
		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 SHOW:
			ShowContact(&con);
			break;
		case DESTROY:
			DestroyContact(&con);
			break;
		case SORT:
			SortConTact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请从新输入\n");
			break;
		}
	}
	return 0;
}
//contact.h文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>

#define MAXSIZE 100

enum {
    
    
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	DESTROY,
	SORT,
};


typedef struct PeoInfo
{
    
    
	char name[20];
	char sex[5];
	int age;
	char tele[12];
	char adder[20];
}PeoInfo;


typedef struct Contact
{
    
    
	PeoInfo data[MAXSIZE];
	int sz;
}Contact;


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

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

//打印通讯录
void ShowContact(Contact* pc);

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

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

//销毁通讯录
void DestroyContact(Contact* pc);

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

//排序通讯录
void SortConTact(Contact* pc);
//contact.c文件

#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
    
    
	pc->sz = 0;
}

//添加联系人
void AddContact(Contact* pc)
{
    
    
	assert(pc);

	printf("请输入联系人名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入联系人电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入联系人地址:>");
	scanf("%s", pc->data[pc->sz].adder);
	pc->sz += 1;
}


//打印通讯录
void ShowContact(Contact* pc)
{
    
    
	assert(pc);

	printf("%-20s\t%-5s\t%-2s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
    
    
		printf("%-20s\t%-5s\t%-2d\t%-12s\t%-20s\n"
			, pc->data[i].name
			, pc->data[i].sex
			, pc->data[i].age
			, pc->data[i].tele
			, pc->data[i].adder);
	}
}


//查找名字
bool FindName(Contact* pc, char* name, int* retIndex)
{
    
    
	for (int i = 0; i < pc->sz; i++)
	{
    
    
		if (strcmp(pc->data[i].name, name) == 0)
		{
    
    
			*retIndex = i;
			return true;
		}
	}

	return false;
}


//删除联系人
void DelContact(Contact* pc)
{
    
    
	assert(pc);
	
	char name[20] = {
    
     0 };
	printf("请输入要删除联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		for (int i = retIndex; i < pc->sz - 1; i++)
		{
    
    
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz -= 1;
		printf("删除联系人成功\n");
		return;
	}

	printf("删除联系人失败\n");
	return;
}



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

	char name[20] = {
    
     0 };
	printf("请输入要查找联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		printf("%-20s\t%-5s\t%-2s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
		printf("%-20s\t%-5s\t%-2d\t%-12s\t%-20s\n"
			, pc->data[retIndex].name
			, pc->data[retIndex].sex
			, pc->data[retIndex].age
			, pc->data[retIndex].tele
			, pc->data[retIndex].adder);
		return;
	}

	printf("查找失败\n");
	return;
}



//销毁通讯录
void DestroyContact(Contact* pc)
{
    
    
	assert(pc);

	pc->sz = 0;
	printf("销毁成功\n");
}


//修改联系人
void ModifyContact(Contact* pc)
{
    
    
	assert(pc);

	char name[20] = {
    
     0 };
	printf("请输入要修改联系人的名字:>");
	scanf("%s", name);

	int retIndex = 0;
	if (FindName(pc, name, &retIndex) == true)
	{
    
    
		printf("请输入联系人名字:>");
		scanf("%s", pc->data[retIndex].name);
		printf("请输入联系人性别:>");
		scanf("%s", pc->data[retIndex].sex);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pc->data[retIndex].age));
		printf("请输入联系人电话:>");
		scanf("%s", pc->data[retIndex].tele);
		printf("请输入联系人地址:>");
		scanf("%s", pc->data[retIndex].adder);

		printf("修改成功\n");
		return;
	}

	printf("修改失败\n");
	return;
}


//排序通讯录

void Swap(Contact* pc, int left, int right)
{
    
    
	PeoInfo tmp = pc->data[left];
	pc->data[left] = pc->data[right];
	pc->data[right] = tmp;
}

int PivotIndex(Contact* pc, int startIndex, int endIndex)
{
    
    
	PeoInfo tmp = pc->data[startIndex];

	int right = endIndex;
	int left = startIndex;
	while (left < right)
	{
    
    
		while (left < right && strcmp(pc->data[right].name, tmp.name) > 0)
		{
    
    
			right--;
		}

		while (left < right && strcmp(pc->data[left].name, tmp.name) <= 0)
		{
    
    
			left++;
		}

		Swap(pc, left, right);
	}
	pc->data[startIndex] = pc->data[left];
	pc->data[left] = tmp;

	return left;
}

void QuickSort(Contact* pc, int startIndex, int endIndex)
{
    
    
	if (startIndex > endIndex)
	{
    
    
		return;
	}

	int pivot = PivotIndex(pc, startIndex, endIndex);
	QuickSort(pc, startIndex, pivot - 1);
	QuickSort(pc, pivot + 1, endIndex);
}

void SortConTact(Contact* pc)
{
    
    
	assert(pc);

	QuickSort(pc, 0, pc->sz-1);
	printf("排序成功\n");
}

Resumir

Lo anterior es la idea específica y la implementación del código de mi libreta de direcciones.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/li209779/article/details/131814275
Recomendado
Clasificación