Lenguaje C - implementación de la libreta de direcciones

contenido

Crear un entorno de proyecto

Crear una estructura

archivo prueba.c

Crear una libreta de direcciones

añadir contactos

imprimir libreta de direcciones

eliminar contacto especificado

encontrar un contacto

cambiar contacto

Organizar contactos

libreta de direcciones completa

código

Epílogo


Crear un entorno de proyecto

Para la implementación de esta libreta de direcciones, podemos pensar en cómo pensar como escribir un juego de ajedrez, luego primero debemos crear un entorno de proyecto

 Esta vez, también iré a los submódulos para escribir

En primer lugar, pensemos qué función tiene la libreta de direcciones. Necesita guardar la información de todos. Para esta información, también necesitamos agregar, eliminar, buscar y modificar la operación. Por supuesto, la libreta de direcciones del teléfono móvil que usamos también será alfabético para ordenar por tamaño.

Los archivos de encabezado que creamos nosotros mismos todavía pueden escribir nuestras funciones de biblioteca, tipos personalizados, etc. aquí, y hacer referencia a "contact.h" en otros archivos fuente.


Crear una estructura

En primer lugar, necesitamos almacenar la información de una persona, aquí creamos una estructura para almacenar el nombre de la persona, sexo, edad, etc.

Aquí se renombra con tpyedef, y PeoInfo será esta estructura en el futuro


archivo prueba.c

El archivo de inicio imprime un menú y, después de escribirlo, se usa una declaración de cambio

se puede escribir de acuerdo a nuestro menú

 


Crear una libreta de direcciones

El siguiente contacto es la libreta de direcciones que creamos, que puede almacenar la información de 1000 personas y la cantidad de registros sz.

El código de ahora también se puede definir con define, lo que nos conviene para modificar este valor más adelante.

Entonces puedes usarlo en el archivo test.c 

 Por supuesto, también podemos usar la enumeración mencionada en el artículo anterior , para que coincida con el menú

 El siguiente interruptor también se puede reescribir así

Por supuesto, también puede obtener la enumeración en el archivo de encabezado 


añadir contactos

Antes de agregar contactos, no inicializamos los miembros en la estructura de contactos, por lo que el siguiente paso es inicializar la libreta de direcciones.

 Use memset para inicializar toda la matriz a 0

Después de eso, puede escribir funciones adicionales y también debe declararlas en el archivo de encabezado.

 


imprimir libreta de direcciones

En el paso anterior, escribimos una función para agregar contactos, y luego escribimos una función para imprimir la libreta de direcciones para probar si se pasó la información de los contactos agregados.

 

 Después de la prueba, la información ingresada se ha pasado a la libreta de direcciones.


eliminar contacto especificado

Cuando queremos eliminar un contacto específico, primero debemos determinar si hay algún dato en la libreta de direcciones. Luego necesitamos encontrar a la persona que queremos eliminar, y luego encontrar el contacto y cambiar el contacto para encontrar el contacto, así que aquí podemos escribir una función para ayudarnos a encontrar, y podemos eliminarla después de encontrarla.


encontrar un contacto

Cuando queremos realizar la búsqueda, se pueden aplicar muchos de los códigos anteriores, como cuando la libreta de direcciones está vacía, cuando no se encuentra la libreta de direcciones y cuando se encuentra la huella, estos códigos también se han escrito antes.


cambiar contacto

 No hay mucho que decir aquí, el código se ha escrito antes y se puede usar de manera flexible


Organizar contactos

        Al ordenar los contactos, puede usar la función qsort del capítulo anterior del puntero, que también es muy conveniente, pero aquí está la estructura de ordenación, parámetro 1: pase en la posición inicial para ordenar, ya que se va a ordenar, apunte a la primera posición del contacto Uno; parámetro 2: el número de elementos, es decir, cuántas personas hay en la libreta de direcciones; parámetro 3: el byte de un elemento, es decir, el tamaño en bytes de toda la persona; parámetro 4 : la dirección de función de la clasificación.

        Al escribir la función de clasificación, es diferente de organizar matrices de enteros. Aquí, e1 y e2 se convierten en punteros de estructura. No hay necesidad de desreferenciar aquí. Los punteros se usan directamente ->. En nuestra libreta de direcciones diaria, generalmente, el La primera letra del contacto se usa para comparar, así que aquí está el nombre para comparar directamente. El nombre es una cadena y strcmp se usa para comparar.


libreta de direcciones completa

       En este punto, la libreta de direcciones básicamente se ha completado. Finalmente, veamos qué se puede optimizar. Por ejemplo, las funciones de búsqueda e impresión no necesitan modificarse, pero no queremos que la estructura de destino cambie, por lo que agregue const para modificarlo; un punto es que cuando se le pasan parámetros a la estructura, use la llamada por referencia (el artículo anterior también habló sobre por qué la estructura se debe pasar por dirección en lugar de por valor). transferencia de la dirección, todavía se afirma cuando se llama a la función.


código

Todos los códigos son los siguientes

contacto.h archivo

#pragma once

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

//类型的声明

#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SORT,//5
	PRINT//6
};

typedef struct PeoInfo
{
	//存放一个人的信息
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//存放1000个人的信息
	int sz;//记录通讯录中已经保存的信息个数
}Contact;

//函数的声明

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

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

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

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

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

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

//排列联系人
void SortContact(Contact* pc);

archivo const.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

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

void AddContact(Contact* pc)
{
	assert(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);
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//查找函数,找到返回下标,找不到返回-1
int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
			return i;
	}
	return -1;

}

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	//1. 找到指定联系人
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除
	int j = 0;
	for (j = pos; j < pc->sz - 1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

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

void ModifyContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法更改\n");
		return;
	}
	//1. 找到指定联系人
	char name[NAME_MAX] = { 0 };
	printf("请输入要更改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要更改的人不存在\n");
		return;
	}
	//更改信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);
	printf("更改成功\n");
}

int cmp_name(const void* e1, const void* e2)
{
	assert(e1 && e2);
	return strcmp(((PeoInfo*)e1)->name, (((PeoInfo*)e2)->name));
}
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
	printf("排序成功\n");
}

archivo prueba.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "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("*****  0.exit             ******\n");
	printf("********************************\n");
}	
void test()
{
	int input = 0;
	//创建通讯录
	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 PRINT:
			PrintContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while(input);
}
int main()
{
	test();
	return 0;
}

Epílogo

La libreta de direcciones está terminada, el llamado final también es el comienzo, y se compartirán más productos secos en el futuro, ¡así que estad atentos! ! !

Supongo que te gusta

Origin blog.csdn.net/m0_64607843/article/details/123770808
Recomendado
Clasificación