contente
2. Análise das funções do livro de endereços
(3) Adicione contatos e imprima
(4) Excluir o contato especificado
(5) Encontre o contato especificado e imprima
(6) Modificar as informações da pessoa designada
(7) Imprima todas as informações
(8) Classificar informações do catálogo de endereços
1. Requisitos básicos
- O catálogo de endereços pode armazenar as informações de 1000 pessoas, incluindo (nome + idade + sexo + telefone + endereço)
- Características incluem:
- adicionar informações da pessoa
- Excluir as informações da pessoa especificada
- Modificar informações do designador
- Encontrar informações do responsável
- Classificar informações do catálogo de endereços
- Nota: Este código precisa usar três arquivos para ser concluído, as funções são as seguintes:
- arquivo test.c: módulo para testar o catálogo de endereços
- arquivo contact.h: definição de tipo, declaração de função
- arquivo contact.c: implementação da função
2. Análise das funções do livro de endereços
(1) Implementação do menu
- arquivo teste.c:
#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"); }
- Neste ponto, o código geral de test.c:
#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"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT }; int main() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: //增加 break; case DEL: //删除 break; case SEARCH: //查找 break; case MODIFY: //修改 break; case SORT: //排序 break; case PRINT: //打印 break; case EXIT: //退出 break; default: break; } } while (input); return 0; }
- Perceber:
Quando o menu é impresso, é necessário selecionar um número para implementar a função correspondente.Para facilitar aos codificadores saber qual é o número correspondente, a palavra-chave enumeration type enum é usada acima.
(2) Função de inicialização
Antes de inicializar o catálogo de endereços, você deve primeiro criar um catálogo de endereços:
- arquivo contact.h:
#pragma once #include<stdio.h> #define MAX_NAME 20 #define MAI_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000 //存放每一个联系人的信息内容 typedef struct PeoInfo { char name[MAX_NAME]; char sex[MAI_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //创建通讯录 typedef struct Contact { PeoInfo data[MAX]; //存放添加进来人的信息 int sz; //记录当前通讯录中有效信息的个数 }Contact;
Após criar o catálogo de endereços, o próximo passo é inicializar
- arquivo contact.c:
void InitContact(Contact* pc) { pc->sz = 0; //memset(); 内存设置 memset(pc->data, 0, sizeof(pc->data)); }
- arquivo contact.h:
void InitContact(Contact* pc);
- arquivo teste.c:
(3) Adicione contatos e imprima
- arquivo contact.h
void AddContact(Contact* pc);
- arquivo contact.c
void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%s", &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"); }
Depois de adicionar um contato, não sei se a adição foi bem-sucedida, então precisamos imprimi-lo para ver
- arquivo contact.h
void PrintContact(const Contact* pc);
- arquivo contact.c
//打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } }
- O efeito da operação é o seguinte:
(4) Excluir o contato especificado
- Antes de excluir o contato especificado, devemos primeiro descobrir se a pessoa a ser excluída existe.
//1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; }
- Em seguida, o processo de implementação da função FindByName é o seguinte:
//查找要删除的联系人 static int FindByName(Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; //找不到 }
- Após encontrar a pessoa a ser excluída, o próximo passo é realizar a operação de exclusão. O código total é o seguinte:
- arquivo contact.c
//删除联系人信息 void DelContact(Contact* pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无需删除\n"); return; } printf("请输入要删除人的名字:>"); scanf("%s", name); //1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } //2、删除 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }
- Os resultados do teste são os seguintes:
(5) Encontre o contato especificado e imprima
- arquivo contact.h:
void SearchContact(Contact* pc);
- arquivo contact.c:
//查找指定联系人 void SearchContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } else { int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } }
- Os resultados são os seguintes:
(6) Modificar as informações da pessoa designada
- arquivo contact.h:
void ModifyContact(Contact* pc);
- arquivo contact.c:
//修改指定联系人 void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } else { 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"); } }
- Os resultados são os seguintes:
(7) Imprima todas as informações
- Na verdade, este código já apareceu antes, e então revise-o:
//打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } }
(8) Classificar informações do catálogo de endereços
- arquivo contact.c
//通过姓名排序 int CmpByName(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } //通过年龄排序 int CmpByAge(const void* e1, const void* e2) { return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age; } //排序通讯录中联系人的先后顺序 void SortContact(Contact* ps) { int input = 0; printf("1、姓名\t2、年龄\n"); printf("请选择你要排序的方式:>"); scanf("%d", &input); switch (input) { case 1: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByName);//排序 printf("排序成功\n"); break; case 2: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByAge);//排序 printf("排序成功\n"); break; default: printf("请输入有效数字\n"); } }
3. Código geral
- arquivo contact.h:
#pragma once #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_NAME 20 #define MAI_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000 //存放每个人的信息 typedef struct PeoInfo { char name[MAX_NAME]; char sex[MAI_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //创建通讯录 typedef struct Contact { PeoInfo data[MAX]; //存放添加进来人的信息 int sz; //记录当前通讯录中有效信息的个数 }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc); //打印联系人信息 void PrintContact(const Contact* pc); //删除联系人信息 void DelContact(Contact* pc); //查找指定联系人 void SearchContact(Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //排序联系人 void SortContact(Contact* ps);
- arquivo contact.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" //初始化通讯录 void InitContact(Contact* pc) { pc->sz = 0; //memset(); 内存设置 memset(pc->data, 0, sizeof(pc->data)); } //添加联系人 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"); } //打印联系人信息 void PrintContact(const Contact* pc) { if (pc->sz == 0) { printf("通讯录为空!\n"); return; } int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0; i < pc->sz; i++) { printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); } } //查找要删除的联系人 static int FindByName(Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; //找不到 } //删除联系人信息 void DelContact(Contact* pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无需删除\n"); return; } printf("请输入要删除人的名字:>"); scanf("%s", name); //1、得先查找要删除的人 //有/没有 int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } //2、删除 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } //查找指定联系人 void SearchContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } else { int i = 0; //打印标题 printf("%-12s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-12s\t%-5d\t%-5s\t%-12s\t%-20s\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) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } else { 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 CmpByName(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } //通过年龄排序 int CmpByAge(const void* e1, const void* e2) { return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age; } //排序通讯录中联系人的先后顺序 void SortContact(Contact* ps) { int input = 0; printf("1、姓名\t2、年龄\n"); printf("请选择你要排序的方式:>"); scanf("%d", &input); switch (input) { case 1: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByName);//排序 printf("排序成功\n"); break; case 2: qsort(ps->data, ps->sz, sizeof(PeoInfo), CmpByAge);//排序 printf("排序成功\n"); break; default: printf("请输入有效数字\n"); } }
- arquivo teste.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"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT }; int main() { 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 EXIT: //退出 printf("退出通讯录\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }