100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C语言实现动态通讯录版本二

C语言实现动态通讯录版本二

时间:2022-01-11 03:53:25

相关推荐

C语言实现动态通讯录版本二

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、通讯录的实现

1.通讯录需要的库函数以及各种功能的自定义函数声明(contact.h)

2.自定义函数实现模块(contact.c)

2.通讯录测试模块(text.c)

前言

接上次的动态通讯录,实现通讯录信息的长期存储

一、通讯录的实现

1.通讯录需要的库函数以及各种功能的自定义函数声明(contact.h)

代码如下:

#pragma once#define DEFAULT_SZ 3#define INC_SZ 2#define NAME 20#define SEX 5#define BIRTHDAY 9#define PHONE 11#define ADDRESS 20#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>//通讯录成员信息结构体typedef struct Peo {char name[NAME];char sex[SEX];char birthday[BIRTHDAY];char phone[PHONE];char address[ADDRESS];}Peo_inma;//通讯录结构体静态版本//typedef struct Contact {//Peo_inma data[MAX_COUNT];//int count;//}Contact;//通讯录结构体动态版本typedef struct Contact {Peo_inma* data;int count;int MAX;}Contact;//打印菜单void menu();//加载文件信息到通讯录int LoadContact(Contact* p);//通讯录的初始化int InitContact(Contact* p);//通讯录增容int IncreaseContact(Contact* p);//增加联系人void AddContact(Contact* p);//删除联系人void DelContact(Contact* p);//查找当前联系人void FindContact(Contact* p);//修改联系人void ModifyContact(Contact* p);//显示当前通讯录信息void ShowContact(Contact* p);//对当前通讯录信息进行升序排序void SortContact(Contact* p);//存储通讯录void SaveContact(const Contact* p);//销毁通讯录,释放内存空间void Destroy(Contact* p);

2.自定义函数实现模块(contact.c)

代码如下:

#define _CRT_SECURE_NO_WARNINGS#include "contact.h"//通讯录增容int IncreaseContact(Contact* p) {if (p->count == p->MAX) {Peo_inma* ptr = NULL;ptr = realloc(p->data, (p->MAX + INC_SZ) * sizeof(Peo_inma));if (ptr == NULL) {perror("IncreaseContact");return 1;}else {p->data = ptr;ptr = NULL;p->MAX += INC_SZ;printf("增容成功\n");return 0;}}}//加载文件信息到通讯录int LoadContact(Contact* p) {FILE* pfr = fopen("test.txt", "r");if (pfr == NULL) {perror("InitContact");return 1;}//读取失败时会返回EOF,不返回0while (fscanf(pfr, "%s %s %s %s %s", p->data[p->count].name,p->data[p->count].sex,p->data[p->count].birthday,p->data[p->count].phone,p->data[p->count].address) != EOF){p->count++;IncreaseContact(p);}fclose(pfr);pfr = NULL;return 0;}//打印菜单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");}//通讯录的初始化int InitContact(Contact* p) {assert(p);p->count = 0;p->data = (Peo_inma*)calloc(DEFAULT_SZ, sizeof(Peo_inma));if (p->data == NULL) {printf("InitContact : %s\n", strerror(errno));return 1;}p->MAX = DEFAULT_SZ;//加载文件的信息到通讯录if (LoadContact(p) == 1) {return 1;}return 0;}//增加联系人void AddContact(Contact* p) {assert(p);//增容if (IncreaseContact(p) == 1){return;}printf("请输入姓名:>");scanf("%s", p->data[p->count].name);printf("请输入性别:>");scanf("%s", p->data[p->count].sex);printf("请输入年龄:>");scanf("%s", p->data[p->count].birthday);printf("请输入电话:>");scanf("%s", p->data[p->count].phone);printf("请输入地址:>");scanf("%s", p->data[p->count].address);p->count++;}//删除联系人void DelContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空,删除失败\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;int j = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来删除联系人:>");scanf("%d", &peo);printf("请输入被删除人信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);for (j = i; j < p->count - 1; j++) {p->data[j] = p->data[j + 1];}i--;p->count--;}}printf("以上联系人信息均被删除\n");}//查询联系人void FindContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来查找联系人:>");scanf("%d", &peo);printf("请输入被搜索人信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);}}//Search(p,Peo[peo],sizeof(p->data[0]));}//修改联系人信息void ModifyContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;int input = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来修改联系人:>");scanf("%d", &peo);printf("请输入被修改人原信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);printf("请选择是否修改: 1.是 0.否 :>");scanf("%d", &input);if (input) {printf("请输入姓名:>");scanf("%s", p->data[i].name);printf("请输入性别:>");scanf("%s", p->data[i].sex);printf("请输入年龄:>");scanf("%s", p->data[i].birthday);printf("请输入电话:>");scanf("%s", p->data[i].phone);printf("请输入地址:>");scanf("%s", p->data[i].address);}}}}//显示当前通讯录信息void ShowContact(Contact* p) {assert(p);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");int i = 0;for (i = 0; i < p->count; i++) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);}}int compar(const void* e1, const void* e2) {return strcmp((char*)e1, (char*)e2);}//对当前通讯录进行升序排序void SortContact(Contact* p) {assert(p);qsort(p->data, p->count, sizeof(p->data[0]), compar);printf("升序排序完成\n");}//存储通讯录void SaveContact(const Contact* p) {assert(p);FILE* pfw = fopen("test.txt","w");if (pfw == NULL) {perror("SaveContact:");return;}//写文件-以结构化的形式写int i = 0;for (; i < p->count; i++) {fprintf(pfw,"%s %s %s %s %s\n",p->data[i].name, p->data[i].sex, p->data[i].birthday, p->data[i].phone, p->data[i].address);}fclose(pfw);pfw = NULL;}//销毁通讯录void Destroy(Contact* p) {free(p->data);p->data = NULL;}

2.通讯录测试模块(text.c)

#define _CRT_SECURE_NO_WARNINGS#include "contact.h"//枚举enum Peo_con_option {Exit,Add, //增加DEL, //删除SEARCH, //搜索MODIFY, //修改SHOW, //打印SORT //排序};int main() {int input = 0;Contact Con;if (InitContact(&Con) == 1)return 1;do {menu();printf("请选择:>");scanf("%d", &input);switch (input) {case Add:AddContact(&Con);break;case DEL:DelContact(&Con);break;case SEARCH:FindContact(&Con);break;case MODIFY:ModifyContact(&Con);break;case SHOW:ShowContact(&Con);break;case SORT:SortContact(&Con);break;case Exit:SaveContact(&Con);Destroy(&Con);printf("退出\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。