通讯录--文件存储

功能要求

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

实现思想

  1. 采用多文件实现功能,避免程序混乱
  2. 利用转移表(函数指针数组)减少代码量
  3. 采用动态内存,节省了内存空间
  4. 使用结构体保存通讯录信息
  5. 使用I/O流的概念,并使用IO函数,完成通讯录的文件存储

具体代码:

contact.h

#ifndef    __CONTACT_H__
#define    __CONTACT_H__


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<windows.h>



#define   NAME_NUM  20
#define   SEX_NUM   3
#define   ADDR_NUM  30
#define   TEL_NUM 20

#define   NUMBER  5  //通讯录开始的容量
#define   RESET_NUMNER  5  //每次扩展的容量



typedef struct  contact_people
{
    char name[NAME_NUM];
    char sex[SEX_NUM];
    int age;
    char addr[ADDR_NUM];
    char  phone[TEL_NUM];
}peo;

 typedef struct contact
{
    struct contact_people *arr;  //录通讯录的大小,动态内存开辟
    int count;    //通讯录人数记录
    int sum;   //通讯录容量

}con;

typedef struct contact *p;


void menu();
void isfull(p contact);
void init_contact(p contact);
void  add_contact(p contact);
void  delete_contact(p contact);
void   find_contact(p contact);
void  amend_contact(p contact);
void  display_contact(p contact);
void  clear_contact(p contact);
void  sort_contact(p contact);
void  Free(p contact);

void save_contact(p conatct);
void show_file(p contact);

#endif

contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"
#include<stdio.h>

void  menu()
{
    printf("****************************************************\n");
    printf("****************************************************\n");
    printf("*                1.添加联系人                      *\n");
    printf("*                2.删除联系人                      *\n");
    printf("*                3.查找联系人                      *\n");
    printf("*                4.修改联系人                      *\n");
    printf("*                5.显示联系人                      *\n");
    printf("*                6.清空联系人                      *\n");
    printf("*                7.排序联系人                      *\n");
    printf("*                8.保存联系人                      *\n");
    printf("*                9.打开文件                        *\n");
    printf("****************************************************\n");
    printf("****************************************************\n");
}



//初始化通讯录
void init_contact(p contact)
{
    contact->count = 0;//人数
    contact->arr = (struct contact_people *)malloc(sizeof(struct contact_people)*NUMBER);//开辟动态内存
    memset(contact->arr, 0, NUMBER*sizeof(peo));
    contact->sum = NUMBER;//通讯录容量

}


//判断通讯录满
void isfull(p contact)
{
    if (contact->sum < contact->count)
    {
        contact->arr = (struct contact_people *)realloc(contact->arr, sizeof(struct contact_people)*RESET_NUMNER);
        contact->sum = NUMBER + RESET_NUMNER;
    }

}


//添加联系人
void  add_contact(p contact)
{

    isfull(contact);
    fflush(stdin);
    system("cls");
    printf("\n请输入姓名:>");
    scanf("%s", contact->arr[contact->count].name);

    printf("\n请输入性别:>");
    scanf("%s", contact->arr[contact->count].sex);

    printf("\n请输入年龄:>");
    scanf("%d", &contact->arr[contact->count].age);

    printf("\n请输入地址:>");
    scanf("%s", contact->arr[contact->count].addr);

    printf("\n请输入电话:>");
    scanf("%s", contact->arr[contact->count].phone);


    contact->count++;
    system("cls");

}


//删除联系人
void delete_contact(p contact)
{
    int i = 0;    //数组下标
    int ret = 0;
    char  name[NAME_NUM];
    fflush(stdin);
    system("cls");
    printf("请输入你要删除的联系人:");

    scanf("%s", name);
    while (i < contact->count)
    {
        if (strcmp(contact->arr[i].name, name) == 0)
        {
            contact->arr = 0;
            ret = 1;
        }
        i++;
    }

    if (ret == 1)
    {
        printf("联系人已经删除\n");
    }
    else  if (ret == 0)
    {
        printf("联系人不存在\n");
    }
    system("cls");

}

//查找联系人
void   find_contact(p contact)
{
    int i = 0;
    int ret = 0;
    char name[NAME_NUM];
    fflush(stdin);
    system("cls");
    printf("请输入你要查找的联系人:");

    scanf("%s", name);
    while (i < contact->count)
    {
        if (strcmp(contact->arr[i].name, name) == 0)
        {
            printf("\tname\tsex\tage\ttel\t\taddr\n");

            printf("\t%s", contact->arr[i].name);

            printf("\t%s", contact->arr[i].sex);

            printf("\t%d", contact->arr[i].age);

            printf("\t%s", contact->arr[i].phone);

            printf("\t\t%s", contact->arr[i].addr);
            printf("\n\n");
            ret = 1;

        }
        i++;
    }
    if (ret != 1)
    {
        printf("联系人不存在\n");
    }



}



//修改联系人信息
void  amend_contact(p contact)
{
    int i = 0;    //数组下标
    int ret = 0;
    char  name[NAME_NUM];
    fflush(stdin);
    system("cls");
    printf("请输入你要修改的联系人:");

    scanf("%s", name);

    while (i < contact->count)
    {
        if (strcmp(contact->arr[i].name, name) == 0)
        {
            printf("\n请输入姓名:>");
            scanf("%s", contact->arr[i].name);

            printf("\n请输入性别:>");
            scanf("%s", contact->arr[i].sex);

            printf("\n请输入年龄:>");
            scanf("%d", &contact->arr[i].age);

            printf("\n请输入电话:>");
            scanf("%s", contact->arr[i].phone);

            printf("\n请输入地址:>");
            scanf("%s", contact->arr[i].addr);
            ret = 1;
        }
        i++;
    }
    if (ret == 1)
    {
        printf("联系人已修改\n");
    }
    else if (ret == 0)
    {
        printf("联系人不存在\n");
    }
    system("cls");
}


//显示所有联系人
void  display_contact(p contact)
{
    int i = 0;
    fflush(stdin);
    system("cls");
    printf("\n\t\tname\t\tsex\t\tage\t\taddr\t\ttel\n");
    for (i = 0; i < contact->count; i++)
    {

        printf("\t\t%s", contact->arr[i].name);

        printf("\t\t%s", contact->arr[i].sex);

        printf("\t\t%d", contact->arr[i].age);

        printf("\t\t%s", contact->arr[i].addr);

        printf("\t\t%s", contact->arr[i].phone);

        printf("\n");
    }

}



//清空联系人
void  clear_contact(p contact)
{


    contact->count = 0;//人数清零
    contact->arr = (struct contact_people *)malloc(sizeof(struct contact_people)*NUMBER);//开辟动态内存
    memset(contact->arr, 0, NUMBER*sizeof(peo));
    contact->sum = NUMBER;//通讯录容量恢复原始记录
}



//排序联系人

void  sort_contact(p contact)
{
    fflush(stdin);
    system("cls");
    if (0 == contact->count)
    {
        printf("通讯录为空\n");

    }
    else
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < contact->count - 1; i++){
            for (j = 0; j < contact->count - 1 - i; j++)
            {
                if (strcmp(contact->arr[j].name, contact->arr[j + 1].name) == 1)
                {
                    struct contact_people  tmp = contact->arr[j];
                    contact->arr[j] = contact->arr[j + 1];
                    contact->arr[j + 1] = tmp;
                }
            }

        }
    }
    system("cls");

}


//释放内存

void Free(p contact)
{
    free(contact->arr);
    contact->arr = NULL;
}


//保存通讯录到桌面

void  save_contact(p contact)
{
    fflush(stdin);
    system("cls");
    FILE *file;
    int i = 0;
    file = fopen("C:\\Users\\lenovo\\Desktop\\通讯录.txt", "w");
    if (file == NULL)
    {
        perror("C:\\Users\\lenovo\\Desktop\\通讯录.txtt");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < contact->count; i++)
    {

        fprintf(file,"姓名:%s\t\t年龄:%d\t\t性别:%s\t\t电话:%s\t\t住址:%s\t\t",contact->arr[i].name,
                                                                                    contact->arr[i].age,
                                                                                    contact->arr[i].sex,
                                                                                    contact->arr[i].phone,
                                                                                    contact->arr[i].addr);

    }
    if (fclose(file) != 0)
    {
        perror("flcose");
        exit(EXIT_FAILURE);
    }
    printf("联系人已保存\n");
    system("cls");
}


//打开文件
void show_file(p contact)
{
    fflush(stdin);
    system("cls");
    FILE * file = fopen("C:\\Users\\lenovo\\Desktop\\通讯录.txt", "r");
    if (file == NULL)
    {
        perror("C:\\Users\\lenovo\\Desktop\\通讯录.txt");
        exit(EXIT_FAILURE);
    }
    while (!feof(file))         //feof 如果到了文件的末尾就返回1  文件还没有结束就返回0  
    {
        char c = fgetc(file);
        putchar(c);
    }
    printf("\n");
    if (fclose(file) != 0)
    {
        perror("fclose");
        exit(0);
    }

}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include"contact.h"

int main()
{
    struct  contact  people;
    int input = 1;
    void(*arr[10])(p) = { ' ',add_contact, delete_contact, find_contact, amend_contact, display_contact, clear_contact, sort_contact, save_contact,show_file };
    init_contact(&people);
    while (input)
    {
        menu();
        printf("plesae select:");
        scanf("%d", &input);
        if (input > 0 && input < 10){
            arr[input](&people);
            printf("\n\n");

        }
        else if (input == 0){
            Free(&people);
            exit(0);
        }
        else{
            printf("Enter error!\n\n\n");
            continue;

        }
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值