1. 通讯录介绍
通讯录记录着一个人的基本信息,比如:姓名、年龄、性别、电话、地址等信息。
本博客将要实现一个通讯录,记录着一个人的基本信息,并且有增删改查排序等功能。
2. 通讯录实现
2.1 结构体定义
//类型的声明 typedef struct PeoInfo { char sex[SEX_MAX]; //性别 int age; //年龄 char name[NAME_MAX]; //姓名 char tele[TELE_MAX]; //电话 char adress[ADRESS_MAX]; // 地址 }PeoInfo; typedef struct Con { PeoInfo data[Max]; int sz; //通讯录大小 }Con; Con con;
2.2 初始化信息
//数组初始化 void InitContacts(Con* con) { con->sz = 0; memset(con, 0, sizeof(con->data)); }
2.3 添加信息
//增 void AddContacts(Con* con) { if (con->sz == Max) { printf("增加失败,通讯录满了。\n"); return; } printf("请输入 姓名,性别,年龄,电话,住址:"); //增加信息 scanf("%s %s %d %s %s", con->data[con->sz].name, con->data[con->sz].sex, &(con->data[con->sz].age), con->data[con->sz].tele, con->data[con->sz].adress); //sz++ con->sz++; printf("添加成功\n"); return; }
2.4 删除信息
//删除 //查找函数 int FindByName(const Con* con) { assert(con); char Name[NAME_MAX] = { 0 }; printf("请输入姓名:"); scanf("%s", Name); int i = 0; for (i = 0; i < con->sz; i++) { if (0 == strcmp(con->data[i].name, Name)) { return i; } } return -1; } void DeleContactsByName(Con* con) { assert(con); if (0 == con->sz) //通讯录为空 { printf("通讯录为空,删除失败\n"); return; } int pos=FindByName(con); int j = 0; for (j = pos; j < con->sz - 1; j++) { con->data[j] = con->data[j + 1]; } con->sz--; printf("删除成功\n"); }
2.5 更改信息
//改 void ReviseContacts(Con* con) { int pos = FindByName(con); if (pos == -1) { printf("修改失败\n"); return; } printf("请输入修改的姓名、性别、年龄、电话、地址\n"); scanf("%s %s %d %s %s", con->data[pos].name, con->data[pos].sex, &(con->data[pos].age), con->data[pos].tele, con->data[pos].adress); printf("修改成功!\n"); return; }
2.6 查找信息
//查 void Find(const Con* con) { int pos=FindByName(con); if (pos == -1) { printf("未查到!\n"); return; } printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址"); printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[pos].name, con->data[pos].sex, con->data[pos].age, con->data[pos].tele, con->data[pos].adress); }
2.7 排序
//排序 int cmp(Con* p1, Con* p2) { return strcmp(p1->data->name, p2->data->name); } void SortContactsByName(Con* con) { qsort(con, con->sz, sizeof(con->data[0]), cmp); }
2.8 打印信息
//打印 void Print(const Con* con) { printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址"); for (int i = 0; i < con->sz; i++) { printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[i].name, con->data[i].sex, con->data[i].age, con->data[i].tele, con->data[i].adress); } }
2.9 清除信息
//清除 void ClearContacts(Con* con) { con->sz = 0; printf("清除成功!\n"); }
3.全部代码(静态)
3.1 Contacts.h
#pragma once #include<stdio.h> #include<assert.h> #include<string.h> #define Max 1000 #define SEX_MAX 5 #define TELE_MAX 20 #define ADRESS_MAX 20 #define NAME_MAX 20 enum Option { EXIT, ADD, DELE, REVISE, SERACH, PRINT, SORT, CLEAR }; //类型的声明 typedef struct PeoInfo { char sex[SEX_MAX]; //性别 int age; //年龄 char name[NAME_MAX]; //姓名 char tele[TELE_MAX]; //电话 char adress[ADRESS_MAX]; // 地址 }PeoInfo; typedef struct Con { PeoInfo data[Max]; int sz; //通讯录大小 }Con; Con con; //函数声明 //数组初始化 void InitContacts(Con* con); //查 int FindByName(const Con* con); void Find(const Con* con); //增 void AddContacts(Con* con); //删 void DeleContactsByName(Con* con); //打印 void Print(const Con* con); //改 void ReviseContacts(Con* con); //排序 void SortContactsByName(Con *con); //清除通讯录 void ClearContacts(Con* con);
3.2 Contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contacts.h" //类型定义 //数组初始化 void InitContacts(Con* con) { con->sz = 0; memset(con, 0, sizeof(con->data)); } //查 int FindByName(const Con* con) { assert(con); char Name[NAME_MAX] = { 0 }; printf("请输入姓名:"); scanf("%s", Name); int i = 0; for (i = 0; i < con->sz; i++) { if (0 == strcmp(con->data[i].name, Name)) { return i; } } return -1; } //查 void Find(const Con* con) { int pos=FindByName(con); if (pos == -1) { printf("未查到!\n"); return; } printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址"); printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[pos].name, con->data[pos].sex, con->data[pos].age, con->data[pos].tele, con->data[pos].adress); } //增 void AddContacts(Con* con) { if (con->sz == Max) { printf("增加失败,通讯录满了。\n"); return; } printf("请输入 姓名,性别,年龄,电话,住址:"); //增加信息 scanf("%s %s %d %s %s", con->data[con->sz].name, con->data[con->sz].sex, &(con->data[con->sz].age), con->data[con->sz].tele, con->data[con->sz].adress); //sz++ con->sz++; printf("添加成功\n"); return; } //删除 void DeleContactsByName(Con* con) { assert(con); if (0 == con->sz) //通讯录为空 { printf("通讯录为空,删除失败\n"); return; } int pos=FindByName(con); int j = 0; for (j = pos; j < con->sz - 1; j++) { con->data[j] = con->data[j + 1]; } con->sz--; printf("删除成功\n"); } //打印 void Print(const Con* con) { printf("%-20s %-10s %-5s %-15s %-20s\n", "姓名", "性别", "年龄", "电话", "地址"); for (int i = 0; i < con->sz; i++) { printf("%-20s %-10s %-5d %-15s %-20s\n", con->data[i].name, con->data[i].sex, con->data[i].age, con->data[i].tele, con->data[i].adress); } } //改 void ReviseContacts(Con* con) { int pos = FindByName(con); if (pos == -1) { printf("修改失败\n"); return; } printf("请输入修改的姓名、性别、年龄、电话、地址\n"); scanf("%s %s %d %s %s", con->data[pos].name, con->data[pos].sex, &(con->data[pos].age), con->data[pos].tele, con->data[pos].adress); printf("修改成功!\n"); return; } //排序 int cmp(Con* p1, Con* p2) { return strcmp(p1->data->name, p2->data->name); } void SortContactsByName(Con* con) { qsort(con, con->sz, sizeof(con->data[0]), cmp); } //清除 void ClearContacts(Con* con) { con->sz = 0; printf("清除成功!\n"); }
3.3 Text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contacts.h" void menu() { printf("*******************************\n"); printf("** 1.ADD 2.DELE **\n"); printf("** 3.REVISE 4.SERACH **\n"); printf("** 5.PRINT 6.SORT **\n"); printf("** 7.CLEAR 0.EXIT **\n"); printf("*******************************\n"); } int main() { InitContacts(&con); int inpute; do { menu(); printf("请输入要进行的操作: "); scanf("%d", &inpute); switch (inpute) { case ADD: { AddContacts(&con); break; } case DELE: { DeleContactsByName(&con); break; } case REVISE: { ReviseContacts(&con); break; } case SERACH: { Find(&con); break; } case PRINT: { Print(&con); break; } case SORT: { SortContactsByName(&con); break; } case CLEAR: { ClearContacts(&con); break; } case EXIT: { printf("退出成功!\n"); break; } default : printf("输入错误,请重新输入:"); break; } } while (inpute); return 0; }
4.全部代码(动态版本)
4.1 contact.h
#pragma once #include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #define Max 1000 //静态最大容量 #define SEX_MAX 5 //性别 #define TELE_MAX 20 //电话号码长度 #define ADRESS_MAX 20 //地址长度 #define NAME_MAX 20 //名字长度 #define DEFA_NUM 3 //通讯录默认容量大小 enum Option { EXIT, ADD, DELE, REVISE, SERACH, PRINT, SORT, CLEAR }; //类型的声明 typedef struct PeoInfo { char sex[SEX_MAX]; //性别 int age; //年龄 char name[NAME_MAX]; //姓名 char tele[TELE_MAX]; //电话 char adress[ADRESS_MAX]; // 地址 }PeoInfo; 静态 //typedef struct Con //{ // PeoInfo data[Max]; // int sz; //通讯录大小 //}Con; //动态 typedef struct Con { PeoInfo* data; //指向记录的指针 int sz; //通讯录有多少人的信息 int capcity; //通讯录的容量 }Con; Con con; //函数声明 //数组初始化 void InitContacts(Con* con); //销毁通讯录 void DestoryContacts(Con* con); //查 int FindByName(const Con* con); void Find(const Con* con); //增 void AddContacts(Con* con); //删 void DeleContactsByName(Con* con); //打印 void Print(const Con* con); //改 void ReviseContacts(Con* con); //排序 void SortContactsByName(Con* con); //清除通讯录 void ClearContacts(Con* con);