提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在我们的生活中,与人交流必不可少,而在今天这个信息时代,人与人之间联系更加方便,我们有了电话,邮箱等等,所以通讯录这个玩意儿也就应运而生
一、通讯录是什么
通讯录是记录联系人姓名、移动电话、传真号、电子邮件、QQ,地址等等的媒介
二、通讯录的实现
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 InitContact(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);
2.自定义函数实现模块(contact.c)
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#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");
}
//通讯录的初始化
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;
}
//增加联系人
void AddContact(Contact* p) {
assert(p);
//增容
if (p->count == p->MAX) {
Peo_inma* ptr = NULL;
ptr = realloc(p->data, (p->MAX + INC_SZ) * sizeof(Peo_inma));
if (ptr == NULL) {
printf("AddContact : %s\n", strerror(errno));
return;
}
else {
p->data = ptr;
ptr = NULL;
p->MAX += INC_SZ;
printf("扩容成功\n");
}
}
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("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
for (i = 0; i < p->count; i++) {
if (strcmp(Peo[peo] + (i * sz), str) == 0) {
printf("%-12s%-12s%-12s%-12s%-12s\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("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
for (i = 0; i < p->count; i++) {
if (strcmp(Peo[peo] + (i * sz), str) == 0) {
printf("%-12s%-12s%-12s%-12s%-12s\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("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
for (i = 0; i < p->count; i++) {
if (strcmp(Peo[peo] + (i * sz), str) == 0) {
printf("%-12s%-12s%-12s%-12s%-12s\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("\n");
printf("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
int i = 0;
for (i = 0; i < p->count; i++) {
printf("%-12s%-12s%-12s%-12s%-12s\n", p->data[i].name,
p->data[i].sex,
p->data[i].birthday,
p->data[i].phone,
p->data[i].address);
}
printf("\n");
}
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");
}
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 0;
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:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
free(Con.data);
Con.data = NULL;
return 0;
}
总结
该版本仅仅通过动态分配内存的方法在调试控制台简单实现通讯录的增删改查,显示,退出的功能,但是无法将调试窗口的数据移到硬盘文件进行长期存储,在后续作者学习了C语言文件相关的知识之后将对该通讯录方法进行改进。
本文介绍了一个简单的通讯录系统的实现过程,包括使用C语言动态分配内存实现通讯录的增删改查等功能。
5万+

被折叠的 条评论
为什么被折叠?



