C语言实现简单通讯录功能

本文实例为大家分享了C语言实现简单通讯录功能的具体代码,供大家参考,具体内容如下

1.存放联系人信息

2.信息:名字+年龄+性别+电话+住址

3.增加联系人

4.删除联系人

5.查找联系人

6.修改联系人

7.排序

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");

}

//创建一个枚举类型,分别对应菜单选项

enum Option

{

EXIT,

ADD,

DEL,

SEARCH,

MODIFY,

SHOW,

SORT,

};

int main()

{

int input = 0;

//创建一个通讯录

struct Contact con;

//初始化通讯录

InitContact(&con);

//最多可以放3个联系人信息

//空间不够再增容

do

{

menu();//进入循环,先打印菜单

printf("请选择:>");

scanf("%d", &input);//用户选择操作

switch (input)

{

case ADD:

AddContact(&con);

break;

case DEL:

DelContact(&con);

break;

case SEARCH:

SearchContact(&con);

break;

case MODIFY:

ModifyContact(&con);

break;

case SHOW:

ShowContact(&con);

break;

case SORT:

SortContact(&con);

break;

case EXIT:

SaveContact(&con);

//销毁通讯录

DestroyContact(&con);

printf("退出\n");

break;

default:

printf("选择错误\n");

break;

}

} while (input);

return 0;

}

contact.c源文件代码如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

//检测通讯录容量

void CheckCapacity(struct Contact* pc)

{

//断言

assert(pc);

if (pc->sz == pc->capacity)//如果有效联系人等于最大容纳量

{

//增加容量

struct PeoInfo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));

if (ptr != NULL)//如果不为空,表示增容成功

{

pc->data = ptr;

pc->capacity += 2;

printf("增容成功\n");

}

else

{

perror("AddContact::realloc");

return;

}

}

}

//加载有效联系人信息

void LoadContact(struct Contact* pc)

{

assert(pc);

struct PeoInfo tmp = { 0 };//临时空间

FILE* pfRead = fopen("contact.txt", "rb");//打开文件,读取数据

if (NULL == pfRead)

{

perror("open file for reading");

return;

}

//加载数据

//每次读取一个联系人信息,直到frea返回值小于1,表示读取完毕,循环结束

while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))

{

CheckCapacity(pc);

pc->data[pc->sz] = tmp;

pc->sz++;

}

//关闭文件

fclose(pfRead);

pfRead = NULL;//置空,防止变成野指针

}

//初始化通讯录

void InitContact(struct Contact* pc)

{

assert(pc);

pc->sz = 0;

pc->capacity = DEFAULT;

pc->data = (struct PeoInfo*)malloc(DEFAULT * sizeof(struct PeoInfo));//动态申请空间

if (pc->data == NULL)

{

perror("InitContact::malloc");

return;

}

LoadContact(pc);//加载通讯录的信息

}

//增加联系人

void AddContact(struct Contact* pc)

{

assert(pc);

CheckCapacity(pc);//检查容量是否为满,是则进行增容

//输入增加指定联系人的信息

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);

printf("添加成功\n");

pc->sz++;//有效联系人加1

}

//销毁通讯录

void DestroyContact(struct Contact* pc)

{

assert(pc);

free(pc->data);//释放申请的动态内存空间

pc->data = NULL;//置为空指针

pc->capacity = 0;//容量置0

pc->sz = 0;//有效联系人置0

}

//显示通讯录信息

void ShowContact(const struct Contact* pc)

{

assert(pc);

int i = 0;

printf("%20s\t%5s\t%10s\t%12s\t%50s\n\n", "name", "age", "sex", "tele", "addr");

for (i = 0; i < pc->sz; i++)

{

//打印每一个数据

printf("%20s\t%5d\t%10s\t%12s\t%50s\n",

pc->data[i].name,

pc->data[i].age,

pc->data[i].sex,

pc->data[i].tele,

pc->data[i].addr);

}

}

//查找指定联系人

int FindContactByName(const struct Contact* pc, const char* name)

{

assert(pc && name);

int i = 0;

for (i = 0; i < pc->sz; i++)

{

if (strcmp(pc->data[i].name, name) == 0)

{

return i;

}

}

//找不到

return -1;

}

//删除指定联系人

void DelContact(struct Contact* pc)

{

assert(pc);

if (pc->sz == 0)

{

printf("通讯录为空,无法删除\n");

return;

}

char name[NAME_MAX] = { 0 };

printf("请输入要删除联系人的名字:>");

scanf("%s", name);

//查找到删除的人

int pos = FindContactByName(pc, name);

if (pos == -1)

printf("指定联系人不存在\n");

else

{

//删除

int i = 0;

for (i = pos; i < pc->sz-1; i++)

{

pc->data[i] = pc->data[i + 1];

}

pc->sz--;

printf("成功删除\n");

}

}

//查找指定联系人

void SearchContact(const struct Contact* pc)

{

assert(pc);

char name[NAME_MAX] = { 0 };

if (pc->sz == 0)

{

printf("通讯录为空,无法查找\n");

return;

}

printf("请输入要查找的联系人名字:>");

scanf("%s", name);

int pos = FindContactByName(pc, name);

if (-1 == pos)

printf("查无此人\n");

else

{

printf("%15s\t%5s\t%8s\t%15s\t%30s\n\n", "name", "age", "sex", "tele", "addr");

printf("%15s\t%5d\t%8s\t%15s\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(struct Contact* pc)

{

assert(pc);

char name[NAME_MAX] = { 0 };

if (pc->sz == 0)

{

printf("通讯录为空,无法修改\n");

return;

}

printf("请输入要修改的联系人名字:>");

scanf("%s", name);

int pos = FindContactByName(pc, name);

if (-1 == pos)

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);

}

}

//按照名字排序->升序

int cmp_by_name(const void* e1, const void* e2)

{

return strcmp((((struct PeoInfo*)e1)->name), (((struct PeoInfo*)e2)->name));

}

//按照年龄排序->升序

int cmp_by_age(const void* e1, const void* e2)

{

return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;

}

//排序通讯录

void SortContact(struct Contact* pc)

{

assert(pc);

int input = 0;

if (pc->sz == 0)

{

printf("通讯录为空,无法排序\n");

return;

}

printf("按名字排序请输入1,年龄排序请输入2:>");

scanf("%d", &input);

if (1 == input)

{

//名字排序

qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_name);

}

else

{

//年龄排序

qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_age);

}

}

//保存通讯录

void SaveContact(struct Contact* pc)

{

assert(pc);

int i = 0;

FILE* pfWrite = fopen("contact.txt", "wb");把当前程序的有效联系人写入文件

if (NULL == pfWrite)//判断是否为空指针

{

perror("open file for writting");

return;

}

//写数据

for (i = 0; i < pc->sz; i++)

{

fwrite(pc->data+i, sizeof(struct PeoInfo), 1, pfWrite);//进行写入

}

fclose(pfWrite);//关闭文件

pfWrite = NULL;//置为空指针

}

contact.h头文件代码如下:

#pragma once

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#define DEFAULT 3

#define NAME_MAX 20

#define SEX_MAX 10

#define TELE_MAX 12

#define ADDR_MAX 50

#define MAX 1000

//描述联系人的信息

struct PeoInfo

{

char name[NAME_MAX];

int age;

char sex[SEX_MAX];

char tele[TELE_MAX];

char addr[ADDR_MAX];

};

//通讯录-动态增长版本

struct Contact

{

struct PeoInfo* data;

int sz;//通讯录中当前有效元素个数

int capacity;//通讯录的当前最大容量

};

//增容

void CheckCapacity(struct Contact* pc);

//初始化通讯录

void InitContact(struct Contact* pc);

//销毁通讯录

void DestroyContact(struct Contact* pc);

//增加联系人

void AddContact(struct Contact* pc);

//显示通讯录

void ShowContact(const struct Contact* pc);

//删除指定联系人

void DelContact(struct Contact* pc);

//查找指定联系人

void SearchContact(const struct Contact* pc);

//修改指定联系人

void ModifyContact(struct Contact* pc);

//排序通讯录

void SortContact(struct Contact* pc);

//保存通讯录到文件

void SaveContact(struct Contact* pc);

//加载通讯录

void LoadContact(struct Contact* pc);

程序运行:

重新运行程序并显示

之前添加的联系人会存放在指定文件中,再次运行程序会加载进去,增容成功是因为默认容纳的联系人有3位,要加载4位联系人,所以自动进行增容。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C语言实现简单通讯录功能 的全部内容, 来源链接: utcz.com/p/247292.html

回到顶部