C语言实现通讯录

C语言实现通讯录,第1张

contact.h

 #define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include

enum option
{
    EXIT,        //0
    ADD,         //1
    DEL,         //2
    SEARCH,      //3
    MODIFY,      //4
    PRINT,       //5
    CLEAR,       //6
    SORT,        //7
};
enum modoption
{
    NAME=1,
    SEX,   //2
    AGE,    //3
    TEL,    //4
    ADDRESS  //5
};
#define NAME_MAX 20
#define SEX_MAX 5
#define TEL_MAX 12
#define ADDRESS_MAX 30
#define CAP_MAX 3
typedef struct Peoinfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int  age;
    int  tel[TEL_MAX];
    char address[ADDRESS_MAX];
}Peoinfo;
typedef struct Contact
{
    Peoinfo* arr;
    int sz;
    int capacity;
}Contact;
void Initcontact(Contact* pc);//初始化结构体
void AddContact(Contact* pc);//增加联系人
void PrintContact(Contact* pc);//显示联系人
void DelContact(Contact* pc);//删除联系人
void SearchContact(Contact* pc);//查找联系人
void ModifyContact(Contact* pc);//修改联系人
void ClearContact(Contact* pc);//清空所有联系人
void SortContact(Contact* pc);//以名字排序所有联系人
void Savecontact(Contact* pc);//把通讯录信息写入文件中,防止退出通讯录信息丢失

 test.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.print        6.clear****\n");
    printf("*****7.sort         0.exit*****\n");
    printf("*******************************\n");

}
void test()
{
    int  input = 0;
    Contact con;
    Initcontact(&con);      //初始化通讯录
    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 PRINT:
            PrintContact(&con);
            break;
        case CLEAR:
            ClearContact(&con);
            break;
        case SORT:
            SortContact(&con);
            break;
        case EXIT: 
            Savecontact(&con);
            DestoryContact(&con);
            printf("退出通讯录\n");
            break;
        default:
            printf("选择错误,请重新选择\n");
            break;
        }
    } while (input);
}
int main()
{
    test();
    return 0;
}

 contact.c

 #define _CRT_SECURE_NO_WARNINGS
#include "contact.h"

void ZR_Contact(Contact* pc)      //给通讯录增容,如果通讯录满了你还想加入联系人,就可以进行增容
{
    if (pc->sz == pc->capacity)
    {
        Peoinfo* str = (Peoinfo*)realloc(pc->arr, (pc->capacity + 2) * sizeof(Peoinfo));
        if (str != NULL)
        {
            pc->arr = str;
        }
        else
        {
            printf("ZR_Contact_realloc");
        }
        pc->capacity += 2;
        printf("增容成功:)\n");
    }
}
void Loadcontact(Contact* pc)
{
    FILE* pf = fopen("contact.dat", "rb");
    if (pf == NULL)
    {
        perror("Loadcontact::fopen");
        return;
    }
    Peoinfo tmp = { 0 };
    while (fread(&tmp, sizeof(Peoinfo), 1, pf))
    {
        pc->arr[pc->sz] = tmp;
        pc -> sz++;
        ZR_Contact(pc);
    }
    fclose(pf);
    pf = NULL;
}
void Initcontact(Contact* pc)        //初始化通讯录
{
    assert(pc);
    pc->sz = 0;
    pc-> capacity = CAP_MAX;   // CAP_MAX == 3
    pc-> arr = (Peoinfo*)malloc(pc->capacity* sizeof(Peoinfo));  
    //先开辟一块能存放三个联系人信息的空间,后续不够可以增容,防止空间浪费
    if (pc->arr == NULL)
    {
        perror("Initcontact_malloc");
        return;
    }
    memset(pc->arr, 0, pc->capacity * sizeof(Peoinfo));
    Loadcontact(pc);
}
void Savecontact(Contact* pc)   //退出通讯录时把联系人信息写入到文件中,防止信息丢失
{
    FILE* pf = fopen("contact.dat", "wb");
    if (pf == NULL)
    {
        perror("Savecontact::fopen");
        return;
    }
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        fwrite(pc->arr + i, sizeof(Peoinfo), 1, pf);
    }
    fclose(pf);
    pf = NULL;
}
void  DestoryContact(Contact* pc)      //退出通讯录
{
    free (pc->arr);
    pc->arr = NULL;
    pc->capacity = 0;
    pc->sz = 0;
}
void AddContact(Contact* pc)          //增加联系人
{
    assert(pc);
    ZR_Contact(pc);
    printf("请输入姓名:)");
    scanf("%s", pc->arr[pc->sz].name);
    printf("请输入性别:)");
    scanf("%s", pc->arr[pc->sz].sex);
    printf("请输入年龄:)");
    scanf("%d", &(pc->arr[pc->sz].age));
    printf("请输入电话:)");
    scanf("%d", pc->arr[pc->sz].tel);
    printf("请输入住址:)");
    scanf("%s", pc->arr[pc->sz].address);
    pc->sz++;
    printf("添加成功:)");
}
void PrintContact(Contact* pc)         //显示/打印联系人
{
    printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (int i = 0; i <= pc->sz-1; i++)
    {
        printf("%-20s%-5s%-5d%-12d%-30s\n", pc->arr[i].name, pc->arr[i].sex, 
            pc->arr[i].age, *(pc->arr[i].tel), pc->arr[i].address);
    }
}
int  Findbyname(Contact* pc, char* name)//找到返回下标,找不到返回-1
//因为查找、删除、修改联系人都需要先找到这个联系人,所以先定义一个查找联系人的函数
{
    for (int i = 0; i < pc->sz; i++)
    {
        if(0==strcmp(pc->arr[i].name , name))
            return i;
    }
    return -1;
}
void DelContact(Contact* pc)       //删除联系人
{
    assert(pc);
    char name[20] = { 0 };
    printf("请输入要删除人的姓名:)\n");
    scanf("%s", name);
    if (pc->sz == 0)
    {
        printf("通讯录已空\n");
        return;
    }
    int ret = Findbyname(pc, name);
    if (-1 == ret)
    {
        printf("要删除的人不存在\n");
        return;
    }
    else
    {
        for (int j = ret; j < pc->sz - 1; j++)
        {
            pc->arr[j] = pc->arr[j + 1];
        }
    }
    pc->sz--;
    Peoinfo* str = (Peoinfo*)realloc(pc->arr, (pc->capacity-1) * sizeof(Peoinfo));
    if (str != NULL)
    {
        str = pc->arr;
    }
    pc->capacity -= 1;
}
void SearchContact(Contact* pc)          //查找联系人
{
    char name[20];
    printf("请输入想要查找的联系人:)");
    scanf("%s", name);
    int ret = Findbyname(pc, name);
    if (-1 == ret)
    {
        printf("查找的联系人不存在\n");
        return;
    }
    else
    {
        printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "性别", "年龄", "电话", "住址");
        printf("%-20s%-5s%-5d%-12d%-30s\n", pc->arr[ret].name, pc->arr[ret].sex,
            pc->arr[ret].age, *(pc->arr[ret].tel), pc->arr[ret].address);
    }
}
void menu1()
{
    printf("*****0.exit*****************\n");
    printf("*****1.name*****************\n");
    printf("*****2.sex******************\n");
    printf("*****3.age******************\n");
    printf("*****4.tel******************\n");
    printf("*****5.address**************\n");

}
void ModifyContact(Contact* pc)          //修改联系人信息
{
    char name[20];
    printf("请输入想修改的联系人的姓名:)");
    scanf("%s", name);
    int ret = Findbyname(pc, name);
    if (-1 == ret)
    {
        printf("联系人不存在\n");
        return;
    }
    else
    {
        int input = 0;
        do
        {
            menu1();
            printf("请选择想要修改的选项:)");
            scanf("%d", &input);
            switch (input)
            {
            case NAME:
                printf("请输入想要修改的姓名:)");
                scanf("%s", pc->arr[ret].name);
                break;
            case SEX:
                printf("请输入想要修改的性别:)");
                scanf("%s", pc->arr[ret].sex);
                break;
            case AGE:
                printf("请输入想要修改的年龄:)");
                scanf("%d", &(pc->arr[ret].age));
                break;
            case TEL:
                printf("请输入想要修改的电话:)");
                scanf("%d", pc->arr[ret].tel);
                break;
            case ADDRESS:
                printf("请输入想要修改的住址:)");
                scanf("%s", pc->arr[ret].address);
                break;
            case EXIT:
                printf("退出");
                break;
            default:
                printf("输入错误,请重新输入\n");
                break;    
            }
        } while (input);
    }
}
void ClearContact(Contact* pc)      //清空通讯录
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        memset(pc->arr + i, 0, pc->sz * sizeof(Peoinfo));
    }
}
int  name_cmp(const void* e1, const void* e2)
{
    strcmp( ((Peoinfo*) e1)->name , (( Peoinfo *) e2)->name);
}
void SortContact(Contact* pc)           //按姓名排序联系人
{
    assert(pc);
    qsort(pc->arr, pc->sz, sizeof(pc->arr[0]), name_cmp);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存