4.2 contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" 数组初始化 //void InitContacts(Con* con) //{ // con->sz = 0; // memset(con, 0, sizeof(con->data)); //} //数组初始化 void InitContacts(Con* con) { //默认申请三个空间 PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM); if (tem == NULL) { perror("InitContacts::malloc:"); return; } con->capcity = DEFA_NUM; con->sz = 0; con->data = tem; memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM); } //销毁通讯录 void DestoryContacts(Con* con) { free(con->data); con->data = NULL; printf("销毁成功!\n"); } //查 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 CheckCapcity(Con* con) { if (con->sz == con->capcity) { //增容(注意格式别写错误) PeoInfo* tem = (PeoInfo*)realloc(con->data, (con->capcity + 2) * sizeof(PeoInfo)); if (tem == NULL) { perror("AddCapcity::realloc:"); return; } con->data = tem; con->capcity += 2; printf("增容成功!\n"); } } void AddContacts(Con* con) { //if (con->sz == Max) //{ // printf("增加失败,通讯录满了。\n"); // return; //} CheckCapcity(con); 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(const void* p1,const void* p2) //{ // Con* e1 = (Con*)p1; // Con* e2 = (Con*)p2; // // return strcmp(e1->data->name, e2->data->name); //} int cmp(const PeoInfo* p1, const PeoInfo* p2) { return strcmp(p1->name, p2->name); } void SortContactsByName(Con* con) { qsort(con->data, con->sz, sizeof(con->data[0]), cmp); } //清除 void ClearContacts(Con* con) { con->sz = 0; printf("清除成功!\n"); }
4.3 Text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.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: { DestoryContacts(&con); printf("退出成功!\n"); break; } default: printf("输入错误,请重新输入:"); break; } } while (inpute); return 0; }
5.完整代码(文件版本)
5.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 CheckCapcity(Con* con); //删 void DeleContactsByName(Con* con); //打印 void Print(const Con* con); //改 void ReviseContacts(Con* con); //排序 void SortContactsByName(Con* con); //清除通讯录 void ClearContacts(Con* con); //保存通讯录数据 void SaveContactData(Con* con); //加载通讯录信息 void LoadContact(Con *con);
5.2 contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" 数组初始化 //void InitContacts(Con* con) //{ // con->sz = 0; // memset(con, 0, sizeof(con->data)); //} //数组初始化(动态) //void InitContacts(Con* con) //{ // //默认申请三个空间 // PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM); // if (tem == NULL) // { // perror("InitContacts::malloc:"); // return; // } // con->capcity = DEFA_NUM; // con->sz = 0; // con->data = tem; // memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM); //} // 文件版本初始化 void InitContacts(Con* con) { //默认申请三个空间 PeoInfo* tem = (PeoInfo*)malloc(sizeof(PeoInfo) * DEFA_NUM); if (tem == NULL) { perror("InitContacts::malloc:"); return; } con->capcity = DEFA_NUM; con->sz = 0; con->data = tem; memset(con->data, 0, sizeof(PeoInfo) * DEFA_NUM); //加载信息 LoadContact(con); } //加载通讯录信息 void LoadContact(Con* con) { //打开文件 FILE *pf = fopen("Contact.dat", "rb"); PeoInfo tem = { 0 }; while (fread(&tem, sizeof(PeoInfo), 1, pf) != 0) { CheckCapcity(con); con->data[con->sz] = tem; con->sz++; } fclose(pf); pf = NULL; } //销毁通讯录 void DestoryContacts(Con* con) { free(con->data); con->data = NULL; printf("销毁成功!\n"); } //查 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 CheckCapcity(Con* con) { if (con->sz == con->capcity) { //增容(注意格式别写错误) PeoInfo* tem = (PeoInfo*)realloc(con->data, (con->capcity + 2) * sizeof(PeoInfo)); if (tem == NULL) { perror("AddCapcity::realloc:"); return; } con->data = tem; con->capcity += 2; printf("增容成功!\n"); } } void AddContacts(Con* con) { //if (con->sz == Max) //{ // printf("增加失败,通讯录满了。\n"); // return; //} CheckCapcity(con); 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(const void* p1,const void* p2) //{ // Con* e1 = (Con*)p1; // Con* e2 = (Con*)p2; // // return strcmp(e1->data->name, e2->data->name); //} int cmp(const PeoInfo* p1, const PeoInfo* p2) { return strcmp(p1->name, p2->name); } void SortContactsByName(Con* con) { qsort(con->data, con->sz, sizeof(con->data[0]), cmp); } //清除 void ClearContacts(Con* con) { con->sz = 0; printf("清除成功!\n"); } void SaveContactData(Con* con) { //打开文件 FILE* pf = fopen("Contact.dat", "wb"); //以二进制的方式打开 if (pf == NULL) { perror("SaveContactData::fopen:"); return; } //保存数据 fwrite(con->data, sizeof(PeoInfo), con->sz, pf); //关闭文件 fclose(pf); pf = NULL; printf("保存成功!"); }
5.3 text.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.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: { SaveContactData(&con); DestoryContacts(&con); printf("退出成功!\n"); break; } default: printf("输入错误,请重新输入:"); break; } } while (inpute); return 0; }
以上是通讯录的详细介绍,后续还会继续更新,如有问题,恳请大佬指点💖