一、通讯录的概念
通讯录一般指在日常生活中用笔记录,也在手机,电脑,电子字典等电子产品中拥有这个功能。通讯录作为通讯录地址的书本,当今的通讯录可以涵盖多项内容。
二、通讯录制作(静态版)
(1)通讯录准备工作阶段
1.菜单制作界面
void menu() { printf("***********************************\n"); printf("******1.add 2.del *********\n"); printf("******3.search 4.modify***********\n"); printf("******5.show 6.sort ************\n"); printf("****** 0.exit ***********\n"); printf("***********************************\n"); }
2. 类型声明
//类型的声明 //设计保存人的信息的这个结构体 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo;
3.通讯录的建立
typedef struct Contact { PeoInfo data[MAX];//data要增加sz就加, int sz;//data要减少sz减少(两个必定是联动的) }Contact;
4.初始化通讯录
//初始化通讯录 void InitContact(Contact* pc);
初始化实现
静态版本 void InitContact(Contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data)); pc->sz=0; }
5.利用枚举来定义
enum OPTION { EXIT,//默认0开始 ADD, DEL, SEARCH, MODIFY, SHOW, SORT };
枚举用于:对于用户使用会更加的方便简洁
do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SerchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: //SortContact(&con); break; case EXIT: //释放通讯录 DestroyContact(&con); printf("退出通讯录"); break; default: printf("选择错误,重新选择"); break; } } while (input); }
(2)功能的实现
1.增加联系人
函数声明:
//增加联系人 void AddContact(Contact* pc);
增加联系人的实现:
静态版本 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"); }
成果展示:
2.显示联系人信息
函数声明:
//显示所有联系人的信息 void ShowContact(const Contact* pc);
显示所以联系人的信息实现:
void ShowContact(const Contact* pc) { int i = 0; //打印列标题 printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0;i < pc->sz;i++) { printf("%-10s\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); } }
成果展示:
3.删除指定联系人
函数声明:
//删除指定联系人 void DelContact( Contact* pc);
删除指定联系人实现:
void DelContact(Contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[MAX_NAME] = { 0 }; assert(pc); //删除 printf("请输入要删除的人的名字:>"); scanf("%s", name); 找到要删除的人 //int i = 0; //int del = 0; //int flag = 0; //for (i = 0;i < pc->sz;i++) //{ // //pc->data[i].name==name这样不能比较是错误的 // if (strcmp(pc->data[i].name, name) == 0) // { // del = i; // flag = 1; // break; // } //} //if (flag == 0) //{ // printf("要删除的人不存在\n"); // return; //} // int del=FindByName(pc, name); if (del == -1) { printf("要删除的人不存在\n"); return; } int i = 0; //删除坐标为del的联系人 for (i = del;i < pc->sz - 1;i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); }
成果展示:
4.查找指定联系人
函数声明:
//查找指定联系人 void SerchContact(const Contact* pc);
查找指定联系人实现:
void SerchContact(const Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要查找的人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name);//pos=position if (pos == -1) { printf("要查找的人不存在\n"); } else { printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } }
5.修改指定联系人
函数声明:
//修改指定联系人 void ModifyContact(Contact* pc);
函数实现:
void ModifyContact(Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要修改的人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name);//pos=position if (pos == -1) { printf("要修改的人不存在\n"); } 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"); } }
6.释放通讯录
函数声明:
void DestroyContact(Contact * pc);
函数实现:
void DestroyContact(Contact* pc) { free(pc->data); pc->data = NULL; pc->capacity = 0; pc->sz = 0; }
三、通讯录制作(动态版)
1.结构体优化
//动态版本 typedef struct Contact { PeoInfo *data;//指向了存放数据的空间 int sz;//记录当前放的有效元素个数 int capacity;//通讯录当前的最大容量 }Contact;
2.初始化
//动态版本 void InitContact(Contact* pc) { assert(pc); pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact"); return; } pc->sz = 0; pc->capacity = DEFAUL_SZ; }
3.增加联系人+增容(优化)
//动态版本 int CheckCapacity(Contact* pc) { if (pc->sz == pc->capacity) { PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo)); if (ptr == NULL) { perror("CheckCapacity"); return 0; } else { pc->data = ptr; pc->capacity += INC_SZ; printf("增容成功\n"); return 1; } } return 1; } void AddContact(Contact* pc) { assert(pc); if (0==CheckCapacity(pc)) { 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"); }
四、总代码
1.Contact.h
#pragma once #include<string.h> #include<assert.h> #include<stdio.h> #include<stdlib.h> #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 #define DEFAUL_SZ 3 #define INC_SZ 2 enum OPTION { EXIT,//默认0开始 ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; //类型的声明 //设计保存人的信息的这个结构体 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //通讯录 // 静态版本 //typedef struct Contact //{ // PeoInfo data[MAX];//data要增加sz就加, // int sz;//data要减少sz减少(两个必定是联动的) //}Contact; //动态版本 typedef struct Contact { PeoInfo *data;//指向了存放数据的空间 int sz;//记录当前放的有效元素个数 int capacity;//通讯录当前的最大容量 }Contact; //函数声明 //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc); //显示所以联系人的信息 void ShowContact(const Contact* pc); //删除指定联系人 void DelContact( Contact* pc); //查找指定联系人 void SerchContact(const Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); // void DestroyContact(Contact * pc);
2.Contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"Contact.h" //静态版本 //void InitContact(Contact* pc) //{ // assert(pc); // memset(pc->data, 0, sizeof(pc->data)); // pc->sz=0; //} //动态版本 void InitContact(Contact* pc) { assert(pc); pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact"); return; } pc->sz = 0; pc->capacity = DEFAUL_SZ; } //静态版本 //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"); // //} //动态版本 int CheckCapacity(Contact* pc) { if (pc->sz == pc->capacity) { PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo)); if (ptr == NULL) { perror("CheckCapacity"); return 0; } else { pc->data = ptr; pc->capacity += INC_SZ; printf("增容成功\n"); return 1; } } return 1; } void AddContact(Contact* pc) { assert(pc); if (0==CheckCapacity(pc)) { 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) { int i = 0; //打印列标题 printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 for (i = 0;i < pc->sz;i++) { printf("%-10s\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 FindByName(const Contact*pc,char name[]) { int i = 0; for (i = 0;i < pc->sz;i++) { //pc->data[i].name==name这样不能比较是错误的 if (strcmp(pc->data[i].name, name) == 0) { return 1;//找到了 } } return -1;//找不到 } void DelContact(Contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[MAX_NAME] = { 0 }; assert(pc); //删除 printf("请输入要删除的人的名字:>"); scanf("%s", name); 找到要删除的人 //int i = 0; //int del = 0; //int flag = 0; //for (i = 0;i < pc->sz;i++) //{ // //pc->data[i].name==name这样不能比较是错误的 // if (strcmp(pc->data[i].name, name) == 0) // { // del = i; // flag = 1; // break; // } //} //if (flag == 0) //{ // printf("要删除的人不存在\n"); // return; //} // int del=FindByName(pc, name); if (del == -1) { printf("要删除的人不存在\n"); return; } int i = 0; //删除坐标为del的联系人 for (i = del;i < pc->sz - 1;i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); } void SerchContact(const Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要查找的人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name);//pos=position if (pos == -1) { printf("要查找的人不存在\n"); } else { printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-10s\t%-4d\t%-5s\t%-12s\t%-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); char name[MAX_NAME] = { 0 }; printf("请输入要修改的人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name);//pos=position if (pos == -1) { printf("要修改的人不存在\n"); } 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"); } } void DestroyContact(Contact* pc) { free(pc->data); pc->data = NULL; pc->capacity = 0; pc->sz = 0; }
3.test.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.show 6.sort ************\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: SerchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: //SortContact(&con); break; case EXIT: //释放通讯录 DestroyContact(&con); printf("退出通讯录"); break; default: printf("选择错误,重新选择"); break; } } while (input); } int main() { test(); return 0; }
❤️结语:
本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!