Implementación súper detallada del lenguaje C: libreta de direcciones

Tabla de contenido

1. Introducción

2. Código fuente

prueba.c:

Contacto.c:

Contacto.h:

Resultados de la ejecución del código:

3. Empieza a darte cuenta

1.Marco básico:

2. Agregar contactos:

3. Mostrar información de contacto:

4. Eliminar información de contacto:

5. Ver la información de contacto designada:

6. Modificar la información de contacto:

Resumir



1. Introducción

Creo que todo el mundo está familiarizado con la libreta de direcciones. Dado que ha venido a consultarla o estudiarla, significa que básicamente domina la sintaxis básica y algunas rutinas básicas del lenguaje C. Si tiene alguna pregunta o sugerencia más adelante, Son bienvenidos a discutirlos en el área de comentarios.

2. Código fuente

prueba.c:

#include "contact.h"
//测试通讯录

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

void test()
{
	int input = 0;
	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:
			ShowContact(&con);
			break;
		case 0:
			printf("退出成功!\n");
			break;
		default:
			printf("输入无效,请重新选择!\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

Contacto.c:

//函数的实现
#include "Contact.h"

//初始化通讯录结构体
void InitContact(Contact* p)
{
	memset(p->data, 0, sizeof(p->data));
	p->sz = 0;
}

//增加联系人信息
void AddContact(Contact* p)
{
	//判断通讯录是否塞满
	if (p->sz == Max)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	printf("请输入要添加的联系人的姓名:>");
	scanf("%s", p->data[p->sz].name);
	printf("请输入要添加的联系人的性别:>");
	scanf("%s", p->data[p->sz].sex);
	printf("请输入要添加的联系人的电话号码:>");
	scanf("%s", p->data[p->sz].tala);
	printf("请输入要添加的联系人的地址:>");
	scanf("%s", p->data[p->sz].addr);
	p->sz++;
	printf("添加联系人成功!\n");
}


//展示联系人信息
void ShowContact(const Contact* p)
{
	//显示标题
	printf("%-5s\t%-5s\t%-12s\t%-10s\n", "姓名", "性别", "电话号码", "地址");
	for (int i = 0; i < p->sz; i++)
	{
		printf("%-5s\t%-5s\t%-12s\t%-10s\n",
			p->data[i].name,
			p->data[i].sex,
			p->data[i].tala,
			p->data[i].addr);
	}
}


//查找联系人
int Findname(Contact* p, char name1[])
{
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name1) == 0)
		{
			return i;
		}
	}
	//没找到
	return -1;
}


//删除指定联系人信息
void DelContact(Contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	char name1[Max_name] = { 0 };
	printf("请输入你要删除的联系人姓名:>");
	scanf("%s", name1);
	int del = Findname(p, name1);
	if (del == -1)
	{
		printf("该通讯录不存在这个人!\n");
		return;
	}
	int i = 0;
	for (i = del; i < p->sz - 1; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	p->sz--;
	printf("删除联系人成功!\n");
}

//查找指定联系人
void SearchContact(const Contact* p)
{
	char name[Max_name] = { 0 };
	printf("请输入你要查看的联系人的姓名:>");
	while (getchar()!= '\n');
	scanf("%s", name);
	int i = Findname(p, name);
	if (i == -1)
	{
		printf("该通讯录不存在该联系人\n");
	}
	else
	{
		//显示标题
		printf("%-5s\t%-5s\t%-12s\t%-10s\n", "姓名", "性别", "电话号码", "地址");
		printf("%-5s\t%-5s\t%-12s\t%-10s\n",
				p->data[i].name,
				p->data[i].sex,
				p->data[i].tala,
				p->data[i].addr);
	}
}

//修改联系人信息
void ModifyContact(Contact* p)
{
	char name[Max_name] = { 0 };
	printf("请输入你要修改的联系人的姓名:>");
	while (getchar() != '\n');
	scanf("%s", name);
	int i = Findname(p, name);
	if (i == -1)
	{
		printf("该通讯录不存在该联系人\n");
	}
	else
	{
		printf("请重新输入该联系人的姓名:>");
		scanf("%s", p->data[i].name);
		printf("请重新输入该联系人的性别:>");
		scanf("%s", p->data[i].sex);
		printf("请重新输入该联系人的电话号码:>");
		scanf("%s", p->data[i].tala);
		printf("请重新输入该联系人的地址:>");
		scanf("%s", p->data[i].addr);
	}
	printf("修改成功!\n");
}

Contacto.h:

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#define Max 100
#define Max_name 20
#define Max_sex 5
#define Max_tele 12
#define Max_addr 30


//存放函数的类型和声明
#include<string.h>
#include<stdio.h>

typedef struct PeoInfo
{
	char name[Max_name];
	char sex[Max_sex];
	char tala[Max_tele];
	char addr[Max_addr];

}PeoInfo;

//通讯录结构体
typedef struct Contact
{
	PeoInfo data[Max];
	int sz;
}Contact;


//函数声明

//初始化通讯录结构体
void InitContact(Contact* p);

//增加联系人信息
void AddContact(Contact* p);

//展示联系人信息
void ShowContact(Contact* p);

//删除联系人信息
void DelContact(Contact* p);

//查找指定联系人信息
void SearchContact(const Contact* p);

//修改联系人信息
void ModifyContact(Contact* p);

Resultados de la ejecución del código:

3. Empieza a darte cuenta

1.Marco básico:

Esta implementación de la libreta de direcciones utilizaMétodo de archivos múltiples . Dado que todos han aprendido sobre la libreta de direcciones, casi todos deberían estar expuestos a operaciones de archivos múltiples.Las llamadas operaciones de archivos múltiples son:

①: La declaración de función, la definición de macro, la declaración de estructura, etc. se colocan en el archivo .h. (contacto.h)

②: La definición de la función se coloca en el archivo .c. (contacto.c)

③: La función principal y algunos marcos básicos se pueden colocar por separado en otro archivo .c. (prueba.c).

Dado que es una libreta de direcciones, necesitamos una estructura para guardar las personas en la libreta de direcciones y una estructura para guardar la información del personal . La declaración se coloca en el archivo contact.h:

①: Colocamos esta información personal en la estructura PerInfo, que incluye nombre, sexo, número de teléfono y dirección, puede agregar otra información según sus propias ideas.

②: Luego, la segunda estructura Contacto se usa para guardar contactos. Aquí tomamos el límite superior de 100 contactos como ejemplo, por lo que los miembros tienen una matriz de estructura PerInfo, y luego hay una variable entera sz que se usa para registrar el número existente de personas. , aumentar Una persona, sz+1; eliminar una persona, sz-1.

El código se muestra a continuación:

#pragma once
#define Max 100
#define Max_name 20
#define Max_sex 5
#define Max_tele 12
#define Max_addr 30

typedef struct PeoInfo
{
	char name[Max_name];
	char sex[Max_sex];
	char tala[Max_tele];
	char addr[Max_addr];

}PeoInfo;

//通讯录结构体
typedef struct Contact
{
	PeoInfo data[Max];
	int sz;
}Contact;

Luego, este marco todavía usa el bucle do while para cubrir la declaración de caso de cambio para facilitar la selección de diferentes funciones. Aquí lo colocamos en el archivo test.c:

#include "contact.h"
//测试通讯录

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

void test()
{
	int input = 0;
	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 0:
			break;
		default:
			break;
		}
	} while (input);
}

int main()
{
	test();
    return 0;
}

①: Debido a que el archivo de encabezado relevante está en el archivo contact.h, no importa si está en el archivo contact.c o en prueba. c, todos debemos incluir nuestro propio archivo de encabezado contact.h.

②: Luego, por el bien de la belleza, escriba un menú de funciones de menú, que puede configurar usted mismo.

③: Primero debemos tener una variable de estructura de contacto con y luego crear la función InitContact para simplemente inicializar sus miembros:

La matriz aquí tiene 100 espacios y la inicialización del bucle es demasiado problemática, por lo que usamos una función de biblioteca memset . Para una introducción detallada, consultehttp: //t.csdn.cn/wu8iX

④: La mayoría de las personas deberían haber usado do while para configurar el caso del interruptor, porque de esta manera podemos elegir de acuerdo con la función del menú, ingresar diferentes números para ingresar diferentes funciones y, una vez finalizada la función, podemos ingresar en un bucle. Se ingresa 0, hazlo mientras finaliza, es decir, todo el sistema finaliza.

2. Agregar contactos:

Una vez construido el marco básico, podemos implementar funciones relacionadas. Aquí, el editor recomienda que al escribir programas similares, es mejor implementar una función a la vez, para facilitar la depuración y corrección.

Primero, para implementar la operación agregar, creamos la función AddContact para implementar la operación agregar. El código fuente de la función es el siguiente:

//增加联系人信息
void AddContact(Contact* p)
{
	//判断通讯录是否塞满
	if (p->sz == Max)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	printf("请输入要添加的联系人的姓名:>");
	scanf("%s", p->data[p->sz].name);
	printf("请输入要添加的联系人的性别:>");
	scanf("%s", p->data[p->sz].sex);
	printf("请输入要添加的联系人的电话号码:>");
	scanf("%s", p->data[p->sz].tala);
	printf("请输入要添加的联系人的地址:>");
	scanf("%s", p->data[p->sz].addr);
	p->sz++;
	printf("添加联系人成功!\n");
}

①: Dado que estamos agregando, primero debemos determinar si la libreta de direcciones está llena. Si no está llena, continuaremos agregando, por lo que comenzamos con una declaración if. Cuando sz == Max, está llena.

②: Entonces solo necesita ingresar datos en las posiciones correspondientes en secuencia, porque sz representa el número de personas existentes en la libreta de direcciones, que es 0 al principio, y el subíndice de la matriz también comienza desde 0, así que use directamente sz como subíndice de matriz para ingresar datos. Sí, después de que la suma sea exitosa, sz aumentará en 1, lo que significa que el número de personas +1, y también se puede usar como subíndice de matriz cuando se agrega por segunda vez.

③: Aquí debe prestar atención y comprender la relación correspondiente entre cada variable de estructura y miembro, así como el operador '.' y el operador '->'.

3. Mostrar información de contacto:

Para facilitar la prueba de si el código es incorrecto, podemos implementar la operación de visualización primero después de implementar la operación de suma. De esta manera podemos verificar si la operación de suma es incorrecta y cada vez que se completa una función posterior, podemos usar la función de visualización. verificar.

Creamos la función ShowContact para implementar la función de visualización, el código fuente es el siguiente:


//展示联系人信息
void ShowContact(Contact* p)
{
	//显示标题
	printf("%-5s\t%-5s\t%-12s\t%-10s\n", "姓名", "性别", "电话号码", "地址");
    //显示信息
	for (int i = 0; i < p->sz; i++)
	{
		printf("%-5s\t%-5s\t%-12s\t%-10s\n",
			p->data[i].name,
			p->data[i].sex,
			p->data[i].tala,
			p->data[i].addr);
	}
}

①: Primero imprimimos el título para verlo fácilmente.

②: Solo necesitamos usar un bucle for y luego usar la estructura de suma para encontrar el valor correspondiente e imprimirlo.

③: Lo que vale la pena señalar aquí es el problema de la tipografía. Algunas sangrías y tipografías afectan la apariencia. Puede configurarlo usted mismo o puede consultar el código fuente de la apelación.

4. Eliminar información de contacto:

Creamos la función DelContact para implementar la operación de eliminación, el código fuente es el siguiente:

//删除指定联系人信息
void DelContact(Contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	char name1[Max_name] = { 0 };
	printf("请输入你要删除的联系人姓名:>");
	scanf("%s", name1);
	int del = Findname(p, name1);
	if (del == -1)
	{
		printf("该通讯录不存在这个人!\n");
		return;
	}
	int i = 0;
	for (i = del; i < p->sz - 1; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	p->sz--;
	printf("删除联系人成功!\n");
}

①: Dado que se trata de una eliminación, primero debemos determinar si la libreta de direcciones está vacía;

②: Luego cree una matriz temporal char name1 [] para que el usuario ingrese el nombre del contacto que desea eliminar;

③: Luego necesitamos determinar si esta persona existe en la libreta de direcciones, por lo que aquí creamos la función Buscar nombre para encontrar el contacto especificado. El código fuente es el siguiente:
 

//查找联系人
int Findname(Contact* p, char name1[])
{
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name1))
		{
			return i;
		}
	}
	//没找到
	return -1;
}

Lo que vale la pena señalar aquí es la declaración if en el bucle. A muchas personas les gusta usar "==" en las condiciones de juicio, pero debemos prestar atención al hecho de que el nombre es una cadena. Aquí estamos comparando dos cadenas, por lo que No podemos usar "==" directamente.", por lo que aquí se usa la función de cadena strcmp. Para un uso específico, consulte: http://t.csdn.cn/qD0LQ

④: Cuando no se encuentra, regresa directamente después de que se le solicite; si lo encuentra, se realiza la operación de eliminación;

Debido a que estamos usando una matriz, la operación de eliminación es simple. Solo necesitamos encontrar la posición del contacto primero y luego sobrescribir el contenido detrás de la posición en secuencia. Finalmente, el número existente de personas sz se puede disminuir en uno. , entonces aquí usamos un bucle for.

5. Ver la información de contacto designada:

Creamos la función SearchContact para implementar esta operación, el código fuente es el siguiente:

//查找指定联系人
void SearchContact(const Contact* p)
{
	char name[Max_name] = { 0 };
	printf("请输入你要查看的联系人的姓名:>");
	while (getchar()!= '\n');
	scanf("%s", name);
	int i = Findname(p, name);
	if (i == -1)
	{
		printf("该通讯录不存在该联系人\n");
	}
	else
	{
		//显示标题
		printf("%-5s\t%-5s\t%-12s\t%-10s\n", "姓名", "性别", "电话号码", "地址");
		printf("%-5s\t%-5s\t%-12s\t%-10s\n",
				p->data[i].name,
				p->data[i].sex,
				p->data[i].tala,
				p->data[i].addr);
	}
}

①: Primero cree una matriz temporal para facilitar que el usuario ingrese el nombre del contacto especificado y luego use un bucle while para eliminar el exceso de contenido en el búfer para que scanf pueda leerlo normalmente;

②: Luego llame a la función Findname y realice operaciones basadas en el valor de retorno

Si se devuelve -1, el contacto no existe y se devuelve directamente;

Si no es -1, significa que se encontró y luego podemos imprimir la información del contacto.

6. Modificar la información de contacto:

Creamos la función ModifyContact para implementar esta operación, el código fuente es el siguiente:

//修改联系人信息
void ModifyContact(Contact* p)
{
	char name[Max_name] = { 0 };
	printf("请输入你要修改的联系人的姓名:>");
	while (getchar() != '\n');
	scanf("%s", name);
	int i = Findname(p, name);
	if (i == -1)
	{
		printf("该通讯录不存在该联系人\n");
	}
	else
	{
		printf("请重新输入该联系人的姓名:>");
		scanf("%s", p->data[i].name);
		printf("请重新输入该联系人的性别:>");
		scanf("%s", p->data[i].sex);
		printf("请重新输入该联系人的电话号码:>");
		scanf("%s", p->data[i].tala);
		printf("请重新输入该联系人的地址:>");
		scanf("%s", p->data[i].addr);
	}
	printf("修改成功!\n");
}

①: El paso anterior es el mismo que buscar contactos, el usuario primero debe ingresar el nombre del contacto a modificar y luego determinar si existe;

②: Si existe, simplemente devuelva el subíndice y luego vuelva a ingresar los datos para la información del subíndice, lo cual es relativamente simple.

Resumir

Esta vez, el editor simplemente implementa una libreta de direcciones para facilitar que todos encuentren ideas y métodos. Hay muchas lagunas y mejoras que puede implementar usted mismo. Este conocimiento termina aquí. ¡Espero que sea útil para todos!

Supongo que te gusta

Origin blog.csdn.net/hffh123/article/details/133252675
Recomendado
Clasificación