一.通讯录简介
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
二.分模块实现
1.添加联系人信息
(1)静态版本
//添加联系人 void Addcontact(Contact* pc) { assert(pc); if (pc->sz == Max) { printf("通讯录已满,无法添加\n"); return; } printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:>"); scanf("%d", &pc->data[pc->sz].age); printf("请输入号码:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("添加成功\n"); }
(2)动态版本
void Addcontact(Contact* pc) { // 动态版本 assert(pc); if (pc->sz == pc->Capacity) { PeoInfo* tmp = realloc(pc->data, (pc->Capacity + 2) * sizeof(PeoInfo)); if (tmp != NULL) { pc->data = tmp; } else { perror("realloc:pc->data"); return; } pc->Capacity += 2; printf("增容成功\n"); printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:>"); scanf("%d", &pc->data[pc->sz].age); printf("请输入号码:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("添加成功\n"); } }
(3)文件操作版本
//加载文件到通讯录中 void Loadcontact(Contact* pc) { FILE* pf = fopen("contact.dat", "rb"); if (pf == NULL) { perror("Loadcontact::fopen"); return; } PeoInfo tmp = { 0 }; while (fread(&tmp, sizeof(PeoInfo), 1, pf)) { Checkcontact(pc); //增容 pc->data[pc->sz] = tmp; pc->sz++; } fclose(pf); pf = NULL; } //文件保存版本 初始化通讯录 void InitContact(Contact* pc) { assert(pc); PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo)); if (tmp != NULL) { pc->data = tmp; } else { perror("PeoInfo*)malloc:"); return; } memset(pc->data, 0, Default_Max * sizeof(PeoInfo)); pc->sz = 0; pc->Capacity = Default_Max; //加载文件信息到通讯录 Loadcontact(pc); } void Addcontact(Contact* pc) { Checkcontact(pc); printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:>"); scanf("%d", &pc->data[pc->sz].age); printf("请输入号码:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("添加成功\n"); }
2.删除指定联系人信息
//删除联系人 void Deletecontact(Contact* pc) { assert(pc); char name[Name_Max]; if (pc->sz == 0) { printf("通讯录已空,无法删除\n"); } printf("请输入要删除联系人的名字:>"); scanf("%s", name); int pos = FindByname(pc, name); if (pos == -1) { printf("未找到指定联系人\n"); return; } else { int i = pos; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } }
3.查找指定联系人信息
//查找联系人 void Searchcontact(Contact* pc) { assert(pc); char name[Name_Max]; printf("请输入要查找的联系人名字:>"); scanf("%s", name); int pos = FindByname(pc, name); if (pos == -1) { printf("未找到指定联系人\n"); return; } printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "号码", "住址"); printf("%-20s %-5s %-5d %-12s %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr); }
4.修改指定联系人信息
//修改菜单 void menu1() { printf("***********************\n"); printf("****1.姓名 2.性别 ****\n"); printf("****3.年龄 4.号码 ****\n"); printf("****5.住址 0.返回 ****\n"); printf("***********************\n"); } //修改联系人 void Modifycontact(Contact* pc) { assert(pc); char name[Name_Max]; int input = 0; printf("请输入修改联系人的名字:>"); scanf("%s", name); int pos = FindByname(pc, name); if (pos == -1) { printf("未找到指定联系人\n"); return; } printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "号码", "住址"); printf("%-20s %-5s %-5d %-12s %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr); do { menu1(); printf("请选择要修改的内容:>"); scanf("%d", &input); switch (input) { case 1: printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("修改成功\n"); break; case 2: printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("修改成功\n"); break; case 3: printf("请输入年龄:>"); scanf("%d", &pc->data[pos].age); printf("修改成功\n"); break; case 4: printf("请输入号码:>"); scanf("%s", pc->data[pos].tele); printf("修改成功\n"); break; case 5: printf("请输入住址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); break; case 0: printf("退出修改\n"); break; default: printf("选择错误\n"); break; } } while (input); }
5.显示所有联系人信息
//打印通讯录 void Printcontact(Contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } int i = 0; printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性别", "年龄", "号码", "住址"); for (i = 0; i < pc->sz; i++) { printf("%-20s %-5s %-5d %-12s %-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } }
6.清空所有联系人
(1)静态版本
//通讯录初始化 void InitContact(Contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; } //清空联系人 void Emptycontact(Contact* pc, void(*p)(Contact*)) { InitContact(pc); printf("清空成功\n"); }
(2)动态版本
void InitContact(Contact* pc) { assert(pc); PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo)); if (tmp != NULL) { pc->data = tmp; } else { perror("PeoInfo*)malloc:"); return; } memset(pc->data, 0, Default_Max * sizeof(PeoInfo)); pc->sz = 0; pc->Capacity = Default_Max; } //清空联系人 void Emptycontact(Contact* pc, void(*p)(Contact*)) { InitContact(pc); printf("清空成功\n"); }
7.以名字排序所有联系人
//排序联系人 int cmp_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void Sortcontact(Contact* pc) { int sz = pc->sz; qsort(pc->data, sz, sizeof(pc->data[0]), cmp_name); printf("排序成功\n"); }
8.销毁通讯录(释放)
(1)非文件操作版本
void Freecontact(Contact* pc) { free(pc->data); pc->Capacity = 0; pc->sz = 0; printf("销毁成功\n"); }
(2)文件操作版本
//保存文件 void Savecontact(Contact* pc) { //打开文件 FILE* pf = fopen("contact.dat", "wb"); if (pf == NULL) { perror("Savecontact::contact.dat"); return; } //写入文件 int i = 0; for (i = 0; i < pc->sz; i++) { fwrite(pc->data + i, sizeof(PeoInfo), 1, pf); } //关闭文件 fclose(pf); pf = NULL; } void Freecontact(Contact* pc) { free(pc->data); pc->Capacity = 0; pc->sz = 0; printf("销毁成功\n"); }
三.菜单界面
#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void menu() { printf("*****************************\n"); printf("**** 1.add 2.delete ****\n"); printf("**** 3.search 4.modify ****\n"); printf("**** 5.print 6.empty ****\n"); printf("**** 7.sort 0.exit ****\n"); printf("*****************************\n"); } void test() { Contact Con;//通讯录 InitContact(&Con); //初始化通讯录 int input = 0; do { input = 0; menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case add: Addcontact(&Con); break; case delete: Deletecontact(&Con); break; case search: Searchcontact(&Con); break; case modify: Modifycontact(&Con); break; case print: Printcontact(&Con); break; case empty: Emptycontact(&Con, InitContact); break; case sort: Sortcontact(&Con); break; case 0: Savecontact(&Con); Freecontact(&Con); printf("退出通讯录\n"); break; default: printf("选择错误\n"); break; } } while (input); } int main() { test(); return 0; }
四.头文件声明
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> //常量定义 enum Option { //exit, add=1, delete, search, modify, print, empty, sort }; #define Max 1000 #define Name_Max 20 #define Sex_Max 5 #define Tele_Max 12 #define Addr_Max 30 #define Default_Max 3 //类型声明 //联系人结构体 typedef struct PeoInfo { char name[Name_Max]; char sex[Sex_Max]; int age; char tele[Tele_Max]; char addr[Addr_Max]; }PeoInfo; //动态版本 typedef struct Contact { PeoInfo* data; int sz; int Capacity; }Contact; //静态版本 //1000个联系人 与已存个数结构体 //typedef struct Contact //{ // PeoInfo data[Max]; // int sz; //}Contact; //函数声明 //初始化通讯录 void InitContact(Contact* pc); //添加联系人 void Addcontact(Contact* pc); //打印通讯录 void Printcontact(Contact* pc); //删除联系人 void Deletecontact(Contact* pc); //查找联系人 void Searchcontact(Contact* pc); //修改联系人 void Modifycontact(Contact* pc); //清空联系人 void Emptycontact(Contact* pc,void(*p)(Contact*)); //排序联系人 void Sortcontact(Contact* pc); //销毁通讯录 void Freecontact(Contact* pc); //保存文件 void Savecontact(Contact* pc);