C语言通讯录系统

来源:互联网 发布:七武士知乎 编辑:程序博客网 时间:2024/05/22 13:52

实现一个通讯录:
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 保存所有联系人
8. 打印所有联系人信息

以下是具体代码:

person_info.h

#pragma once#include <stddef.h>#define NAME_SIZE 200   //姓名#define PHONE_SIZE 200   //电话号码#define ADDR_SIZE 200    //住址//联系人typedef struct PersonInfo{    char name[NAME_SIZE];    char phone[PHONE_SIZE];    char addr[ADDR_SIZE];}PersonInfo;

addr_book.h

#pragma once#include "person_info.h"#define FILE_PATH "./data.txt"enum{    DISPLAY = 1,    ADD = 2,    ERASE = 3,    FIND = 4,    MODIFY = 5,    DESTROY = 6,    EXIT = 0};typedef struct AddrBook{    PersonInfo* data;    size_t size;           //联系人个数    size_t capacity;        //容量}AddrBook;void AddrBookInit(AddrBook* addr_book);          //初始化通讯录void AddrBookDisplay(AddrBook* addr_book);       //打印通讯录所有信息void AddrBookAdd(AddrBook* addr_book);           //在通讯录中增加条目void AddrBookErase(AddrBook* addr_book);         //删除通讯录中指定条目void AddrBookFind(AddrBook* addr_book);          //查找指定条目void AddrBookModify(AddrBook* addr_book);        //修改指定条目void AddrBookDestroy(AddrBook* addr_book);       //销毁通讯录void AddrBookSave(AddrBook* addr_book);          //保存通讯录void AddrBookLoad(AddrBook* addr_book);          //加载回内存

addr_book.c

#include "addr_book.h"#include <stdio.h>#include <stdlib.h>#include <string.h>//初始化通讯录void AddrBookInit(AddrBook* addr_book){    if (addr_book == NULL)                  //判空    {        printf("addr_book is null\n");        return;    }    addr_book->size = 0;    addr_book->capacity = 1;    addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);}//打印通讯录所有信息void AddrBookDisplay(AddrBook* addr_book){    if (addr_book == NULL)                     //判空    {        printf("addr_book is null\n");        return;    }    printf("|----------------|------------------|-----------------|\n");    printf("|     姓  名     |      电  话      |      地  址     |\n");    printf("|----------------|------------------|-----------------|\n");    size_t i = 0;    for (; i < addr_book->size; ++i)    {        printf("|      %s      |    %s   |       %s      |\n",                addr_book->data[i].name,                addr_book->data[i].phone,                addr_book->data[i].addr);        printf("|----------------|------------------|-----------------|\n");    }}void AddrBookRelloc(AddrBook* addr_book){    if (addr_book == NULL)                    //判空    {        printf("addr_book is null\n");        return;    }    addr_book->capacity = addr_book->capacity * 2 + 1;    PersonInfo* new_data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);    size_t i = 0;    for (; i < addr_book->size; ++i)    {        new_data[i] = addr_book->data[i];              //将原来空间的内容拷贝到新的空间中    }    free(addr_book->data);         //释放原来空间    addr_book->data = new_data;}//在通讯录中增加条目void AddrBookAdd(AddrBook* addr_book){    if (addr_book == NULL)            //判空    {        printf("addr_book is null\n");        return;    }    if (addr_book->size >= addr_book->capacity)           //若容量不够需扩容    {        AddrBookRelloc(addr_book);    }    size_t cur = addr_book->size;    ++addr_book->size;    printf("开始插入数据:\n");                   //插入新数据    printf("请输入姓名:");    scanf("%s", addr_book->data[cur].name);    printf("请输入电话号码:");    scanf("%s", addr_book->data[cur].phone);    printf("请输入地址:");    scanf("%s", addr_book->data[cur].addr);    printf("插入成功!\n");    return;}//保存通讯录void AddrBookSave(AddrBook* addr_book)               //判空{    if (addr_book == NULL)    {        printf("addr_book is null\n");        return;    }    FILE* fp = fopen(FILE_PATH, "w");                //以文本方式保存    if (fp == NULL)    {        printf("打开文件失败!%s\n", FILE_PATH);        return;    }    fprintf(fp, "|----------------|-------------------|-----------------|\n");    size_t i = 0;    for (; i < addr_book->size; ++i)    {        fprintf(fp, "|      %s      |    %s    |       %s      |\n",            addr_book->data[i].name,            addr_book->data[i].phone,            addr_book->data[i].addr);        fprintf(fp, "|----------------|-------------------|-----------------|\n");    }    fclose(fp);}//加载回内存void AddrBookLoad(AddrBook* addr_book){    if (addr_book == NULL)                    //判空    {        printf("addr_book is null\n");        return;    }    FILE* fp = fopen(FILE_PATH, "r");    if (fp == NULL)    {        printf("打开文件失败!%s\n", FILE_PATH);        return;    }    while (!feof(fp))    {        if (addr_book->size >= addr_book->capacity)        {            AddrBookRelloc(addr_book);        }        size_t cur = addr_book->size;        fscanf(fp, "%s%s%s\n",            addr_book->data[cur].name,            addr_book->data[cur].phone,            addr_book->data[cur].addr);        ++addr_book->size;    }    fclose(fp);}//删除通讯录中指定条目void AddrBookErase(AddrBook* addr_book)       {    if (addr_book == NULL)                    //判空    {        printf("addr_book is null\n");        return;    }    char to_delete[200] = { 0 };    printf("请输入要删除的联系人名字:");          //根据联系人姓名删除    scanf("%s", &to_delete);    size_t i = 0;    for (; i < addr_book->size; ++i)    {        if (strcmp(addr_book->data[i].name, to_delete) == 0)        {            free(addr_book->data);            addr_book->size--;            printf("删除成功!\n");            return;        }    }    if (i == addr_book->size)    {        printf("无此人,删除失败!\n");        return;    }}//查找指定条目void AddrBookFind(AddrBook* addr_book){    if (addr_book == NULL)                    //判空    {        printf("addr_book is null\n");        return;    }    char name[200] = { 0 };    printf("请输入要查找的联系人名字:");             //通过姓名查找    scanf("%s", &name);    size_t i = 0;    for (; i < addr_book->size; ++i)    {        if (strcmp(addr_book->data[i].name, name) == 0)        {            printf("找到了!\n");            printf("此人信息为:\n 姓名:%s ,电话:%s ,地址:%s\n",                addr_book->data[i].name,                addr_book->data[i].phone,                addr_book->data[i].addr);            return;        }    }    if (i == addr_book->size)    {        printf("无此人!\n");        return;    }}//修改指定条目void AddrBookModify(AddrBook* addr_book){    if (addr_book == NULL)    {        printf("addr_book is null\n");        return;    }    char name[200] = { 0 };    printf("请输入要修改的联系人名字:");    scanf("%s", &name);    size_t i = 0;    for (; i < addr_book->size; ++i)    {        if (strcmp(addr_book->data[i].name, name) == 0)        {            printf("这是第%lu个联系人:\n", i + 1);                    //先判断是第几个联系人            printf("此人信息为:\n 姓名:%s ,电话:%s ,地址:%s\n",                addr_book->data[i].name,                addr_book->data[i].phone,                addr_book->data[i].addr);        }    }    size_t num = 0;    printf("请输入需要修改的联系人编号:");             //通过联系人编号修改    scanf("%lu", &num);    char name2[200];    char phone[200];    char addr[200];    printf("请输入新的姓名:");    scanf("%s", name2);    strcpy(addr_book->data[num - 1].name, name2);    printf("请输入新的电话号码:");    scanf("%s", phone);    strcpy(addr_book->data[num - 1].phone, phone);    printf("请输入新的地址:");    scanf("%s", addr);    strcpy(addr_book->data[num - 1].addr, addr);    printf("修改成功!\n");    return;}//销毁通讯录void AddrBookDestroy(AddrBook* addr_book){    if (addr_book == NULL)                        //判空    {        printf("addr_book is null\n");        return;    }    else    {        addr_book->size = 0;        addr_book->capacity = 0;        free(addr_book->data);        printf("已成功销毁!\n");    }}

Test.c

#include "addr_book.h"#include <windows.h>#include <stdio.h>void Menu(){    AddrBook addr_book;    AddrBookInit(&addr_book);    AddrBookLoad(&addr_book);    while (1)    {        printf("****************************************\n");        printf("*************1.显示所有条目*************\n");        printf("*************2.新增条目*****************\n");        printf("*************3.删除条目*****************\n");        printf("*************4.查找条目*****************\n");        printf("*************5.修改条目*****************\n");        printf("*************6.销毁通讯录***************\n");        printf("*************0.退出通讯录***************\n");        int choice = 0;        printf("请选择:");        scanf("%d", &choice);        switch (choice)        {        case DISPLAY:            AddrBookDisplay(&addr_book);            break;        case ADD:            AddrBookAdd(&addr_book);            AddrBookSave(&addr_book);            break;        case ERASE:            AddrBookErase(&addr_book);            break;        case FIND:            AddrBookFind(&addr_book);            break;        case MODIFY:            AddrBookModify(&addr_book);            break;        case DESTROY:            AddrBookDestroy(&addr_book);            break;        case EXIT:            printf("成功退出!\n");            return 0;            break;        default:            printf("非法输入,请重新输入!\n");            break;        }    }}int main(){    Menu();    system("pause");    return 0;}

效果展示:

1.显示条目
结果

2.新增条目
结果

结果

3.删除条目
结果

结果

结果

4.查找条目
结果

结果

5.修改条目
结果

结果

6.销毁通讯录
结果

结果

7.退出通讯录
结果

8.非法输入
结果

9.文本
结果

此为简易版通讯录,如有错误欢迎大家指正!

原创粉丝点击