博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通讯录(动态内存、文件)
阅读量:2242 次
发布时间:2019-05-09

本文共 9436 字,大约阅读时间需要 31 分钟。

C语言实现通讯录

功能:
  1. 增加联系人信息
  2. 删除联系人信息
  3. 修改联系人信息
  4. 查询联系人信息
  5. 显示所有联系人信息
  6. 清空联系人
  7. 将联系人按照名字进行排序
  8. 联系人信息包括姓名、年龄、性别、电话、住址
要求:
  1. 运用动态内存开辟的方法,而不是运用数组给定一个确定大小的空间
  2. 可以将联系人储存在文件中,当下一次打开时,上一次录入的联系人依旧存在
头文件

Contact.h

#ifndef __CONTACT_H__    #define __CONTACT_H__    #include 
#include
#include
#include
#define NAME_MAX 30 #define SEX_MAX 5 #define TEL_MAX 12 #define ADDR_MAX 30 #define CAPACITY 3 //第一次所开辟的空间能够储存联系人的个数 #define ADD_CAP 2 //每次开辟空间增加所能存储联系人的个数(每次增加两个) typedef struct PeoInfo //联系人信息 { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tel[TEL_MAX]; char addr[ADDR_MAX]; }PeoInfo; typedef struct contact //定义一个结构体 { PeoInfo *data; //联系人信息 int sz; //联系人个数 int capacity; //目前的容量 }contact, *pContact; void init_contact(pContact pc); //初始化通讯录 void load_contact(pContact pc); //加载通讯录 void add_contact(pContact pc); //添加联系人信息 void del_contact(pContact pc); //删除联系人信息 void modify_contact(pContact pc); //修改联系人信息 void sel_contact(pContact pc); //查询联系人信息 void show_contact(pContact pc); //显示所有联系人的信息 void empty_contact(pContact pc); //清空通讯录 void sort_contact(pContact pc); //排序 void destory_contact(pContact pc); //销毁通讯录 void save_contact(pContact pc); //将联系人保存在文件中 #endif
源文件:

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1    #include "Contact.h"    void init_contact(pContact pc)    {        PeoInfo *tmp = NULL;        assert(pc);        pc->sz = 0;        pc->capacity = CAPACITY;        tmp = (PeoInfo *)calloc(pc->capacity, sizeof(PeoInfo));        if (tmp == NULL)        {            perror("use calloc");            system("pause");            exit(EXIT_FAILURE);        }        pc->data = tmp;        load_contact(pc);    }    int espand(pContact pc)    {        PeoInfo *tmp = { 0 };        assert(pc);        if (pc->sz == CAPACITY)        {            tmp = (PeoInfo *)realloc(pc->data, (pc->sz + ADD_CAP) * sizeof(PeoInfo));            if (tmp == NULL)            {                printf("增容失败\n");                return 0;            }            else            {                pc->data = tmp;                pc->capacity += ADD_CAP;                printf("增容成功\n");                return 1;            }        }        return 1;    }    void load_contact(pContact pc)    {        PeoInfo tmp = { 0 };        assert(pc);        FILE *pf = fopen("contact.txt", "rb");        if (pf == NULL)        {            perror("open file for read");            system("pause");            exit(EXIT_FAILURE);        }        while (fread(&tmp, sizeof(PeoInfo), 1, pf))        {            if (espand(pc) == 0)            {                system("pause");                exit(EXIT_FAILURE);            }            pc->data[pc->sz] = tmp;            pc->sz++;        }        fclose(pf);        pf = NULL;    }    void add_contact(pContact pc)    {        int judge = 0;        assert(pc);        judge = espand(pc);        if (!judge)        {            return;        }        assert(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].tel);        printf("请输入住址:");        scanf("%s", pc->data[pc->sz].addr);        pc->sz++;        printf("增加成功\n");    }    int find_data(pContact pc, char name[])    {        for (int i = 0; i < pc->sz; i++)        {            if (strcmp(pc->data[i].name, name) == 0)            {                return i;            }        }        return -1;    }    void del_contact(pContact pc)    {        char name[NAME_MAX] = { 0 };        int ret = 0;        assert(pc);        if (pc->sz == 0)        {            printf("通讯录为空,无法删除\n");            return;        }        printf("请输入要删除人的姓名: ");        scanf("%s", name);        ret = find_data(pc, name);        if (ret == -1)        {            printf("要删除的人不存在\n");            return;        }        else        {            for (int i = ret; i < pc->sz - 1; i++)            {                pc->data[i] = pc->data[i + 1];            }            pc->sz--;            printf("删除成功\n");        }    }    void modify_contact(pContact pc)    {        char name[NAME_MAX] = { 0 };        int ret = 0;        assert(pc);        if (pc->sz == 0)        {            printf("通讯录为空,无法修改\n");            return;        }        printf("请输入要修改人的名字:");        scanf("%s", name);        ret = find_data(pc, name);        if (ret == -1)        {            printf("要修改的人不存在\n");            return;        }        else        {            int input = 0;            printf("1. name   2. age   3.sex   4.tel   5.addr   0.exit\n");            printf("请输入要修改的选项:");            scanf("%d", &input);            switch (input)            {                case 1:                {                    printf("请输入修改后的名字:");                    scanf("%s", pc->data[ret].name);                }                break;                case 2:                {                    printf("请输入修改后的年龄:");                    scanf("%d", &pc->data[ret].age);                }                break;                case 3:                {                    printf("请输入修改后的性别:");                    scanf("%s", pc->data[ret].sex);                }                break;                case 4:                {                    printf("请输入修改后的电话:");                    scanf("%s", pc->data[ret].tel);                }                break;                case 5:                {                    printf("请输入修改后的住址:");                    scanf("%s", pc->data[ret].addr);                }                break;                case 0:                    printf("修改成功\n");                    break;                default:                    printf("请重新输入:");                    break;            }        }    }    void sel_contact(pContact pc)    {        char name[NAME_MAX] = { 0 };        int ret = 0;        assert(pc);        if (pc->sz == 0)        {            printf("通讯录为空,无法查询\n");            return;        }        printf("请输入要查询人的名字:");        scanf("%s", name);        ret = find_data(pc, name);        if (ret == -1)        {            printf("要查询的人不存在\n");            return;        }        else        {            printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址");            printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[ret].name,                pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tel, pc->data[ret].addr);        }    }    void show_contact(pContact pc)    {        assert(pc);        printf("%6s\t%4s\t%3s\t%11s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "住址");        for (int i = 0; i < pc->sz; i++)        {            printf("%6s\t%4d\t%3s\t%11s\t%15s\t\n", pc->data[i].name,                pc->data[i].age, pc->data[i].sex, pc->data[i].tel, pc->data[i].addr);        }    }    void empty_contact(pContact pc)    {        assert(pc);        pc->sz = 0;        printf("已清空\n");    }    void sort_contact(pContact pc)    {        for (int i = 0; i < pc->sz - 1; i++)        {            for (int j = 0; j < pc->sz - 1 - i; j++)            {                PeoInfo tmp = pc->data[j];                pc->data[j] = pc->data[j + 1];                pc->data[j + 1] = tmp;            }        }        printf("排序成功\n");    }    void destory_contact(pContact pc)    {        assert(pc);        free(pc->data);        pc->data = NULL;        pc->capacity = 0;        pc->sz = 0;    }    void save_contact(pContact pc)    {        FILE *pf = fopen("contact.txt", "wb");        assert(pc);        if (pf == NULL)        {            perror("open file of write");            system("pause");            exit(EXIT_FAILURE);        }        for (int i = 0; i < pc->sz; i++)        {            fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);        }        fclose(pf);        pf = NULL;    }
测试代码:

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "Contact.h"void menu(){    printf("******************************************\n");    printf("****    1.增加              2.删除    ****\n");    printf("****    3.修改              4.查询    ****\n");    printf("****    5.显示              6.清空    ****\n");    printf("****    7.排序              0.退出    ****\n");    printf("******************************************\n");}enum option{    EXIT,    ADD,    DEL,    MODIFY,    SEL,    SHOW,    EMPTY,    SORT};void test(){    int input = 0;    contact Con;    init_contact(&Con);    do    {        menu();        printf("请选择: ");        scanf("%d", &input);        switch (input)        {        case ADD:            add_contact(&Con);            break;        case DEL:            del_contact(&Con);            break;        case MODIFY:            modify_contact(&Con);            break;        case SEL:            sel_contact(&Con);            break;        case SHOW:            show_contact(&Con);            break;        case EMPTY:            empty_contact(&Con);            break;        case SORT:            sort_contact(&Con);            break;        case EXIT:            save_contact(&Con); //退出之前将联系人保存在文件中            destory_contact(&Con);             break;        default:            printf("输入选项不存在,请重新输入: \n");            break;        }    } while (input);}int main(){    test();    system("pause");    return 0;}

转载地址:http://qbwdb.baihongyu.com/

你可能感兴趣的文章
【MyBatis学习10】高级映射之多对多查询
查看>>
【MyBatis学习11】MyBatis中的延迟加载
查看>>
【MyBatis学习12】MyBatis中的一级缓存
查看>>
【MyBatis学习13】MyBatis中的二级缓存
查看>>
【MyBatis学习14】MyBatis和Spring整合
查看>>
【MyBatis学习15】MyBatis的逆向工程生成代码
查看>>
Java 中 final、finally 和 finalize 使用总结
查看>>
volatile关键字解析
查看>>
单例模式的八种写法比较
查看>>
比较常见的数据库SQL面试题以及答案
查看>>
MySQL与Oracle的区别
查看>>
关于Oracle数据库优化的几点总结
查看>>
69道Spring面试题和答案
查看>>
40个Java多线程问题总结
查看>>
Oracle数据库面试题
查看>>
java面试中的智力题
查看>>
本地如何连接hbase数据库
查看>>
Maven出错-Missing artifact org.apache.openejb:openejb-core:jar:4.1.0-SNAPSHOT:test
查看>>
dubbo配置文件xml校验报错
查看>>
eclipse生成export生成jar详解
查看>>