Lenguaje C: libreta de direcciones detallada (versión estática)

Prefacio:

Hoy haremos una libreta de direcciones simple y, al mismo tiempo, podemos profundizar nuestra comprensión del lenguaje C.
Para implementar una libreta de direcciones, necesitamos guardar la información de las personas en la libreta de direcciones:
nombre, edad, sexo, número de teléfono, dirección.
También necesitamos saber el proceso de escribir una libreta de direcciones:

  1. Almacene la información de 100 personas en la libreta de direcciones
  2. añadir contactos
  3. borrar contacto
  4. editar contacto
  5. Encuentra un contacto
  6. Mostrar información de todos los contactos
  7. Función de clasificación
    Primero cree tres archivos y luego escriba:

test.c——libro de direcciones de prueba
contact.h——declaración de funciones y tipos
contact.c——realización de funciones

1. Almacene la información de 100 personas en la libreta de direcciones

1.1 Establecer la estructura de la información del ahorrador

//定义一个结构体
typedef struct Communication
{
    
    
    char name[20];//姓名
    int age;//年龄
    char sex[5];//性别
    char tele[12];//电话
    char addr[30];//地址
}com;

Si el contenido anterior se usa con frecuencia, #define para definir el identificador
Después del cambio:

#define MAX 100//可以增加的人数
#define NAME_MAX 20//姓名
#define SEX_MAX 5//性别
#define TELE_MAX 12//电话
#define ADDR_MAX 20//地址
//定义一个结构体
typedef struct Communication
{
    
    
    char name[NAME_MAX];//姓名
    int age;//年龄
    char sex[SEX_MAX];//性别
    char tele[TELE_MAX];//电话
    char addr[ADDR_MAX];//地址
}com;

1.2 Configurar una libreta de direcciones e inicializarla

Al construir una estructura, defina una libreta de direcciones

//定义一个通讯录
typedef struct Comcation
{
    
    
    com data[100];//可以存100个人的信息
    int sz;//记录存放人的位置
}contact;

Deje que la libreta de direcciones se inicialice

//通讯录初始化
void initCantact(contact* pc)
{
    
    
    memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0
    pc->sz = 0;
}

Hacer un menú:

void menu(void)
{
    
    
    printf("————————————————————\n");
    printf("|***************************************|\n");
    printf("|*****1.增加联系人     2.删除联系人*****|\n");
    printf("|*****3.修改联系人     4.查找联系人*****|\n");
    printf("|*****5.显示所有联系人 6.排序      *****|\n");
    printf("|*****7.清除所有联系人 0.退出程序   ****|\n");
    printf("|***************************************|\n");
    printf("————————————————————\n");
}

2. Agregar contactos

Almacenamiento estático, cuando el almacenamiento está lleno, no se puede aumentar

//增加联系人
void Addcontact(contact* 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");
}

3. Eliminar contactos

Primero encuentre el subíndice sz de la persona que se va a eliminar, luego recorra hacia atrás desde el subíndice encontrado, mueva el último valor al frente y finalmente reste 1 del número total de sz, por supuesto, preste atención al caso especial cuando el el subíndice es 0 Condición.

//删除联系人
void Delcontact(contact* pc)
{
    
    
    if (pc->sz == 0)
    {
    
    
        printf("没有联系人,无需删除\n");
        return;
    }
    char arr[20] = {
    
    0};
    assert(pc);
    printf("请输入要删除的人的名字:");
    scanf("%s",arr);//名字
    int n;
   n= Findcontact(pc,arr);
   if (n == -1)
   {
    
    
       printf("没找到\n");
       return;
   }
   else//找到了
   {
    
    
       int i = 0;
       for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位
       {
    
    
           pc->data[i] = pc->data[i + 1];
       }
       pc->sz--;
   }
   printf("成功删除联系人\n");
}

4. Modificar la persona de contacto

Primero juzgue que el contacto es 0 y luego ingrese el nombre de la persona a modificar, encuentre la ubicación de la persona a modificar y cambie toda la información en la ubicación para lograr el propósito de la modificación.

//修改联系人
void Modfycontatc( contact* pc)
{
    
    
    assert(pc);
    char name[20] = {
    
     0 };
    if (pc->sz == 0)
    {
    
    
        printf("没有联系人,无需修改\n");
        return;
    }
    printf("请输入要修改人的名字;");
    scanf("%s", name);
    int n=0;
    n = Findcontact( pc,  name);
    if (n == -1)
    {
    
    
        printf("要修改的人不存在\n");
    }
    else
    {
    
    
        printf("请输入修改后的名字:");
        scanf("%s", pc->data[n].name);
        printf("请输入修改后的年龄:");
        scanf("%d", &(pc->data[n].age));
        printf("请输入修改后的性别:");
        scanf("%s", pc->data[n].sex);
        printf("请输入修改后的电话号码:");
        scanf("%s", pc->data[n].tele);
        printf("请输入修改后的地址:");
        scanf("%s", pc->data[n].addr);
        printf("修改成功\n");
    }
}

5. Encuentra la persona de contacto designada

Primero busque el contacto, para juzgar el caso cuando el subíndice es 0, devuelva la posición i del contacto,

//查找联系人
int Findcontact( contact* pc, char arr[20])
{
    
    
    int i = 0;

    for (i = 0; i < pc->sz; i++)
    {
    
    
        if (strcmp(pc->data[i].name, arr)==0)//找到了
        {
    
    
            return i;
        }
    }
    return -1;//没找到
}

Encuentre el contacto especificado: busque la ubicación del contacto de acuerdo con la información devuelta i, y luego juzgue si se encuentra e imprime.

//查找指定联系人
void Searchcontact(contact* pc)
{
    
    
    assert(pc);
    char p[20] = {
    
    0};
    printf("请输入要查找人的姓名:");
        scanf("%s", p);
        int n = Findcontact(pc, p);
        if (n == -1)
        {
    
    
            printf("要查找的人不存在\n");
        }
        else
        {
    
    
            printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址");
            //打印数据
            printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",  
                pc->data[n].name,
                pc->data[n].age,
                pc->data[n].sex,
                pc->data[n].tele,
                pc->data[n].addr);
        }
}

Sexto, mostrar la información de todos los contactos

Recorra e imprima los contactos agregados directamente

//显示联系人
void Showcontact(const contact* pc)
{
    
    
        int i = 0;
        for (i = 0; i < pc->sz; i++)
        {
    
    
            printf("%s\t%d\t%s\t%s\t%s\n", 
                pc->data[i].name,
                pc->data[i].age,
                pc->data[i].sex,
                pc->data[i].tele,
                pc->data[i].addr);
        }
}

7. Función de clasificación

Aquí uso ordenación rápida y luego uso la función de devolución de llamada comper para comparar

int comper(const void* p1, const void* p2)//字符比较
{
    
    
    return strcmp(((com*)p1)->name, ((com*)p2)->name);
}
//按名字进行排序
void Sortcontact(contact* pc)
{
    
    
    qsort(pc->data, pc->sz, sizeof(com), comper);
}

8. Borrar todos los contactos

Solo deja que sz asigne un valor de 0

//清空联系人
void Emptycontact(contact* pc)
{
    
    
    assert(pc);
    if (pc->sz == 0)
    {
    
    
        printf("联系人为空,无需清空\n");
    }
    else
    {
    
    
        pc->sz = 0;
        printf("清空成功\n");
    }
}

Nueve, código completo

Se completa una versión estática de la libreta de direcciones. Después de escribir, puede profundizar la comprensión del lenguaje C. Los amigos que estén interesados ​​​​pueden probarlo

9.1 archivo de encabezado cantact.h

Declaración y definición de funciones:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 100//可以增加的人数
#define NAME_MAX 20//姓名
#define SEX_MAX 5//性别
#define TELE_MAX 12//电话
#define ADDR_MAX 20//地址
//定义一个结构体
typedef struct Communication
{
    
    
    char name[NAME_MAX];//姓名
    int age;//年龄
    char sex[SEX_MAX];//性别
    char tele[TELE_MAX];//电话
    char addr[ADDR_MAX];//地址
}com;
//定义一个通讯录
typedef struct Comcation
{
    
    
    com data[MAX];//可以存100个人的信息
    int sz;//记录存放人的位置
}contact;
//给通讯录赋初值
void initCantact(contact* pc);
//菜单
void menu(void);
//增加联系人
void Addcontact(contact* pc);
//显示联系人
void Showcontact(const contact* pc);
//删除联系人
void Delcontact(contact* pc);
//查找联系人
int Findcontact(contact* pc, char arr[20]);
//查找指定联系人
void Searchcontact(contact* pc);
//修改联系人
void Modfycontatc(contact* pc);
//联系人按名字进行排序
void Sortcontact(contact* pc);
//清空联系人
void Emptycontact(contact* pc);

9.2canactact.c archivo fuente

Implementación de la función:

#include "cantact.h"
//通讯录初始化
void initCantact(contact* pc)
{
    
    
    assert(pc);
    memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0
    pc->sz = 0;
}
//增加联系人
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 Showcontact(const contact* pc)
{
    
    
    assert(pc);
    printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n\n", "名字", "年龄", "性别", "电话", "地址");
        int i = 0;
        for (i = 0; i < pc->sz; i++)
        {
    
    
            printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
                pc->data[i].name,
                pc->data[i].age,
                pc->data[i].sex,
                pc->data[i].tele,
                pc->data[i].addr);
        }
}
//查找联系人
int Findcontact( contact* pc, char arr[20])
{
    
    
    int i = 0;

    for (i = 0; i < pc->sz; i++)
    {
    
    
        if (strcmp(pc->data[i].name, arr)==0)//找到了
        {
    
    
            return i;
        }
    }
    return -1;//没找到
}
//删除联系人
void Delcontact(contact* pc)
{
    
    
    if (pc->sz == 0)
    {
    
    
        printf("没有联系人,无需删除\n");
        return;
    }
    char arr[20] = {
    
    0};
    assert(pc);
    printf("请输入要删除的人的名字:");
    scanf("%s",arr);//名字
    int n;
   n= Findcontact(pc,arr);
   if (n == -1)
   {
    
    
       printf("没找到\n");
       return;
   }
   else//找到了
   {
    
    
       int i = 0;
       for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位
       {
    
    
           pc->data[i] = pc->data[i + 1];
       }
       pc->sz--;
   }
   printf("成功删除联系人\n");
}
//查找指定联系人
void Searchcontact(contact* pc)
{
    
    
    assert(pc);
    char p[20] = {
    
    0};
    printf("请输入要查找人的姓名:");
        scanf("%s", p);
        int n = Findcontact(pc, p);
        if (n == -1)
        {
    
    
            printf("要查找的人不存在\n");
        }
        else
        {
    
    
            printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址");
            //打印数据
            printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",  
                pc->data[n].name,
                pc->data[n].age,
                pc->data[n].sex,
                pc->data[n].tele,
                pc->data[n].addr);
        }
}
//修改联系人
void Modfycontatc( contact* pc)
{
    
    
    assert(pc);
    char name[20] = {
    
     0 };
    if (pc->sz == 0)
    {
    
    
        printf("没有联系人,无需修改\n");
        return;
    }
    printf("请输入要修改人的名字;");
    scanf("%s", name);
    int n=0;
    n = Findcontact( pc,  name);
    if (n == -1)
    {
    
    
        printf("要修改的人不存在\n");
    }
    else
    {
    
    
        printf("请输入修改后的名字:");
        scanf("%s", pc->data[n].name);
        printf("请输入修改后的年龄:");
        scanf("%d", &(pc->data[n].age));
        printf("请输入修改后的性别:");
        scanf("%s", pc->data[n].sex);
        printf("请输入修改后的电话号码:");
        scanf("%s", pc->data[n].tele);
        printf("请输入修改后的地址:");
        scanf("%s", pc->data[n].addr);
        printf("修改成功\n");
    }
}
int comper(const void* p1, const void* p2)//字符比较
{
    
    
    return strcmp(((com*)((contact*)p1)->data)->name, ((com*)((contact*)p2)->data)->name);
}
//按名字进行排序
void Sortcontact(contact* pc)
{
    
    
    qsort(pc, pc->sz, sizeof(pc->data[0]), comper);//快排
}
//清空联系人
void Emptycontact(contact* pc)
{
    
    
    assert(pc);
    if (pc->sz == 0)
    {
    
    
        printf("联系人为空,无需清空\n");
    }
    else
    {
    
    
        pc->sz = 0;
        printf("清空成功\n");
    }
}

Archivo fuente 9.3test.c

Libreta de direcciones de prueba:

#include "cantact.h"
//菜单
void menu(void)
{
    
    
    printf("————————————————————\n");
    printf("|***************************************|\n");
    printf("|*****1.增加联系人     2.删除联系人*****|\n");
    printf("|*****3.修改联系人     4.查找联系人*****|\n");
    printf("|*****5.显示所有联系人 6.排序      *****|\n");
    printf("|*****7.清除所有联系人 0.退出程序   ****|\n");
    printf("|***************************************|\n");
    printf("————————————————————\n");
}
int main()
{
    
    
    int input = 0;
    //通讯录初始化
    contact pc;
    initCantact( &pc);
    do
    {
    
    
        menu();
        printf("请选择:\n");
        scanf("%d", &input);//
        switch (input)
        {
    
    
        case 1:
            Addcontact(&pc);//增加联系人
            break;
        case 2:
            Delcontact(& pc);//删除联系人
            break;
        case 3:
            Modfycontatc(&pc);//修改联系人
            break;
        case 4:
            Searchcontact(&pc);//查找指定联系人
            break;
        case 5:
            Showcontact(&pc);//显示联系人
            break;
        case 6:
            Sortcontact(&pc);//按名字进行排序
            break;
        case 7:
            //清空所以联系人
            Emptycontact(&pc);
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("输入错误,重新输入\n");
     }
    } while (input);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/plj521/article/details/132232684
Recomendado
Clasificación