静态的通讯录(C语言)

实现的一个静态的通讯录,我这里采取的是数组的形式来存我的每一个联系人,废话不多,我来一步步的解释我的代码。
  1. 第一个给大家的是我的头文件

    Message.h

#ifndef __Message_H__   
#define __Message_H__

#include<stdio.h>   
#include<assert.h>  
#include<stdlib.h>  
#include<string.h>  
#include<ctype.h>  

#define MAX 1000   //最大1000位联系人
#define NAME_MAX 20   //名字最长
#define GENDER_MAX 5     //性别
#define ADDR_MAX 30   //地址
#define TELE_MAX 12   //电话('\0')

typedef struct Person{     //定义一个联系人的所有信息
    char name[NAME_MAX];
    char gender[GENDER_MAX];
    char address[ADDR_MAX];
    char tele[TELE_MAX];
    int  age;
}Person;

typedef struct Message   //定义一个数组存所有联系人
{
    Person data[MAX];
    int sz;             //给联系人编号
}Message, *pMessage;   

void InitMessage(pMessage mess);  //初始化通讯录
void AddMessage(pMessage mess);   //增加联系人
void ShowMessage(const pMessage mess); //展示所存的所有联系人
void DelMessage(pMessage mess);  //删除联系人
void SearchMessage(pMessage mess);  //查找联系人
void ModifyMessage(pMessage mess);  //修改联系人
void SortMessage(pMessage mess);  //对联系人分类(按名字分类)
void ClearMessage(pMessage mess);  //清除所有联系人
void ExitMessage(pMessage mess);  //退出
#endif
以上的头文件中我定义的或者声明的变量和结构体我都有详细的介绍。下面在来看看我的函数文件,那可是重点。
  • 在来看看我的主函数是怎么写的

test.c

这里我使用了枚举来将代码更加形象话,别的就没有什么说的了。

#include"Message.h"

enum  {
    EXIT,  //0
    ADD,  //1
    DEL,   //2
    SEARCH,   //3
    MODIFY,   //4
    SHOW,   //5
    SORT,   //6
    CLEAR,   //7
};

void meau()
{
    printf("        *********************************************\n");
    printf("        *********************************************\n");
    printf("        ###############My address book###############\n");
    printf("        * 1-add          2-del         3-search     *\n");
    printf("        * 4-modify       5-show        6-Sort       *\n");
    printf("        * 0-Exit                       7-clear      *\n");
    printf("        *********************************************\n");
    printf("        *********************************************\n");
}

void test()
{
    int input = 0;
    Message my_con;
    InitMessage(&my_con);
    do
    {
        meau();
        printf("请选择:");
        scanf_s("%d", &input);
        switch (input)
        {
        case ADD://添加  
            AddMessage(&my_con);
            break;
        case SHOW://显示  
            ShowMessage(&my_con);
            break;
        case DEL://删除  
            DelMessage(&my_con);
            break;
        case SEARCH://查找  
            SearchMessage(&my_con);
            break;
        case MODIFY://修改  
            ModifyMessage(&my_con);
            break;
        case SORT://排序  
            SortMessage(&my_con);
            break;
        case CLEAR://清除  
            ClearMessage(&my_con);
            break;
        case EXIT://退出  
            exit(0);
            break;
        default:
            printf("输入有误");
            break;
        }
    } while (input);
}

void main(void)
{
    test();
    return 0;
}
功能函数的编写
咋们一个函数一个函数的进行分析吧。
  • 这是我对于我定义的结构体进行初始化的函数。memset这个函数的功能我简单的给大家介绍一下,
  • void *memset(void *s, int ch, size_t n);将s所指向的某一块内存中的后n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。
  • 然后我就没有什么说的了。这时初始化我的结构体。
void InitMessage(pMessage mess)  //初始化结构体
{
    mess->sz = 0;
    memset(mess->data, 0, sizeof(mess->data));
}
  • 增加联系人
void AddMessage(pMessage mess)   //增添联系人
{
    char name[20] = { 0 };
    assert(mess);
    if (mess->sz == MAX)
    {
        printf("通讯录满了!\n");
        return;
    }
    printf("请输入名字:");
    scanf("%s", (mess->data[mess->sz].name));
    printf("请输入性别:");
    scanf("%s", (mess->data[mess->sz].gender));
    printf("请输入地址:");
    scanf("%s", (mess->data[mess->sz].address));
    printf("请输入电话:");
    scanf("%s", (mess->data[mess->sz].tele));
    printf("请输入年龄:");
    scanf("%d", &(mess->data[mess->sz].age));//年龄 取地址  
    mess->sz++;
    printf("添加成功 !\n");
}
  • 显示所有联系人
void ShowMessage(const pMessage mess)  //显示联系人
{
    int i = 0;
    printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");

    for (i = 0; i < mess->sz; i++)
    {
        printf("%15s\t%5d\t%5s\t%15s\t%15s\n",
            mess->data[i].name,
            mess->data[i].age,
            mess->data[i].gender,
            mess->data[i].address,
            mess->data[i].tele);
    }
}
  • 删除联系人

这里面嵌套了一个寻找联系人的函数,因为要删除某个联系人,首先要能够找到这个联系人,下一个查找某个联系人的函数也调用了这个函数。

static int FindEntry(pMessage mess, char name[])  //寻找某个联系人
{
    int i = 0;
    for (i = 0; i < mess->sz; i++)
    {
        if (strcmp(mess->data[i].name, name) == 0)
            return i;
    }
    return -1;
}

void DelMessage(pMessage mess)   //删除联系人
{
    int pos = 0;
    char name[NAME_MAX] = { 0 };
    printf("请输入要删除人的名字:\n");
    scanf("%s", name);
    pos = FindEntry(mess, name);
    if (pos == -1)
    {
        printf("要删除的人不存在 !\n");
        return;
    }
    else
    { 
        int j = 0;
        for (j = pos; j < mess->sz; j++)
        {
            mess->data[j] = mess->data[j + 1];
        }
        mess->sz--;
        printf("删除成功 !\n");
    }
}
  • 查找某个联系人
void SearchMessage(pMessage mess)    //查找联系人
{
    int pos = 0;
    char name[NAME_MAX] = { 0 };
    printf("请输入要查找人的名字:\n");
    scanf("%s", name);
    pos = FindEntry(mess, name);
    if (pos == -1)
    {
        printf("要查找的人不存在 !\n");
        return;
    }
    else
    {
        printf("%15s\t%5d\t%5s\t%15s\t%15s\n",
            mess->data[pos].name,
            mess->data[pos].age,
            mess->data[pos].gender,
            mess->data[pos].address,
            mess->data[pos].tele);
    }
}
  • 修改某个联系人
void ModifyMessage(pMessage mess)   //修改联系人
{
    int i = 0;
    char flag = 'Y';
    int mod = -1;   
    char na[20] = { 0 };
    do
    {
        printf("请输入需要修改的人:");
        scanf("%s", na);
        for (i = 0; i < mess->sz; i++)
        {
            if (strcmp(mess->data[i].name, na) == 0)
            {
                mod = i;
            }
        }
        if (mod >= 0)
        {
            printf("请输入修改后的名字:");
            scanf("%s", &(mess->data[mod].name));
            printf("请输入修改后的年龄:");
            scanf("%d", &(mess->data[mod].age));
            printf("请输入修改后的性别:");
            scanf("%s", &(mess->data[mod].gender));
            printf("请输入修改后的地址:");
            scanf("%s", &(mess->data[mod].address));
            printf("请输入修改后的电话号码:");
            scanf("%s", &(mess->data[mod].tele));
            printf("是否继续录入?(继续输入请输入Y,任意键退出):\n");
            getchar();
            scanf("%c", &flag);
            if (toupper(flag) != 'Y')
                break;
        }
        else
        {
            printf("没有你要修改的人!");
            printf("是否继续修改联系人?(继续则输入Y,按任意键退出):");
            getchar();
            scanf("%c", &flag);
            if (toupper(flag) != 'Y')
                break;
        }
    } while (toupper(flag) == 'Y');
}
  • 对联系人进行排序
    这里排序的时候我是根据联系人姓名的首字母的前后顺序进行排序的。
void  SortMessage(pMessage mess)    //排序
{
    int i = 0, j = 0;
    for (i = 0; i < mess->sz - 1; i++)
    {
        for (j = 0; j < mess->sz - 1 - i; j++)
        {
            if (strcmp(mess->data[j].name, mess->data[j + 1].name) > 0)
            {
                Person  peo = mess->data[j];
                mess->data[j] = mess->data[j + 1];
                mess->data[j + 1] = peo;
            }
        }
    }
    printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");
    for (i = 0; i < mess->sz; i++)
    {
        printf("%4s\t%2d\t%2s\t%12s\t%12s\n",
            mess->data[i].name,
            mess->data[i].age,
            mess->data[i].gender,
            mess->data[i].address,
            mess->data[i].tele);
    }
}
  • 清空通讯录中所有联系人信息
void ClearMessage(pMessage mess)  //清空
{
    mess->sz = 0;
}

为方便大家调试,我把功能函数所有代码放在一起吧。如下:

#define  _CRT_SECURE_NO_WARNINGS 1

#include"Message.h"

void InitMessage(pMessage mess)  //初始化结构体
{
    mess->sz = 0;
    memset(mess->data, 0, sizeof(mess->data));
}

void AddMessage(pMessage mess)   //增添联系人
{
    char name[20] = { 0 };
    assert(mess);
    if (mess->sz == MAX)
    {
        printf("通讯录满了!\n");
        return;
    }
    printf("请输入名字:");
    scanf("%s", (mess->data[mess->sz].name));
    printf("请输入性别:");
    scanf("%s", (mess->data[mess->sz].gender));
    printf("请输入地址:");
    scanf("%s", (mess->data[mess->sz].address));
    printf("请输入电话:");
    scanf("%s", (mess->data[mess->sz].tele));
    printf("请输入年龄:");
    scanf("%d", &(mess->data[mess->sz].age));//年龄 取地址  
    mess->sz++;
    printf("添加成功 !\n");
}

void ShowMessage(const pMessage mess)  //显示联系人
{
    int i = 0;
    printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");

    for (i = 0; i < mess->sz; i++)
    {
        printf("%15s\t%5d\t%5s\t%15s\t%15s\n",
            mess->data[i].name,
            mess->data[i].age,
            mess->data[i].gender,
            mess->data[i].address,
            mess->data[i].tele);
    }
}

static int FindEntry(pMessage mess, char name[])  //寻找某个联系人
{
    int i = 0;
    for (i = 0; i < mess->sz; i++)
    {
        if (strcmp(mess->data[i].name, name) == 0)
            return i;
    }
    return -1;
}

void DelMessage(pMessage mess)   //删除联系人
{
    int pos = 0;
    char name[NAME_MAX] = { 0 };
    printf("请输入要删除人的名字:\n");
    scanf("%s", name);
    pos = FindEntry(mess, name);
    if (pos == -1)
    {
        printf("要删除的人不存在 !\n");
        return;
    }
    else
    { 
        int j = 0;
        for (j = pos; j < mess->sz; j++)
        {
            mess->data[j] = mess->data[j + 1];
        }
        mess->sz--;
        printf("删除成功 !\n");
    }
}

void SearchMessage(pMessage mess)    //查找联系人
{
    int pos = 0;
    char name[NAME_MAX] = { 0 };
    printf("请输入要查找人的名字:\n");
    scanf("%s", name);
    pos = FindEntry(mess, name);
    if (pos == -1)
    {
        printf("要查找的人不存在 !\n");
        return;
    }
    else
    {
        printf("%15s\t%5d\t%5s\t%15s\t%15s\n",
            mess->data[pos].name,
            mess->data[pos].age,
            mess->data[pos].gender,
            mess->data[pos].address,
            mess->data[pos].tele);
    }
}

void ModifyMessage(pMessage mess)   //修改联系人
{
    int i = 0;
    char flag = 'Y';
    int mod = -1;   
    char na[20] = { 0 };
    do
    {
        printf("请输入需要修改的人:");
        scanf("%s", na);
        for (i = 0; i < mess->sz; i++)
        {
            if (strcmp(mess->data[i].name, na) == 0)
            {
                mod = i;
            }
        }
        if (mod >= 0)
        {
            printf("请输入修改后的名字:");
            scanf("%s", &(mess->data[mod].name));
            printf("请输入修改后的年龄:");
            scanf("%d", &(mess->data[mod].age));
            printf("请输入修改后的性别:");
            scanf("%s", &(mess->data[mod].gender));
            printf("请输入修改后的地址:");
            scanf("%s", &(mess->data[mod].address));
            printf("请输入修改后的电话号码:");
            scanf("%s", &(mess->data[mod].tele));
            printf("是否继续录入?(继续输入请输入Y,任意键退出):\n");
            getchar();
            scanf("%c", &flag);
            if (toupper(flag) != 'Y')
                break;
        }
        else
        {
            printf("没有你要修改的人!");
            printf("是否继续修改联系人?(继续则输入Y,按任意键退出):");
            getchar();
            scanf("%c", &flag);
            if (toupper(flag) != 'Y')
                break;
        }
    } while (toupper(flag) == 'Y');
}

void  SortMessage(pMessage mess)    //排序
{
    int i = 0, j = 0;
    for (i = 0; i < mess->sz - 1; i++)
    {
        for (j = 0; j < mess->sz - 1 - i; j++)
        {
            if (strcmp(mess->data[j].name, mess->data[j + 1].name) > 0)
            {
                Person  peo = mess->data[j];
                mess->data[j] = mess->data[j + 1];
                mess->data[j + 1] = peo;
            }
        }
    }
    printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");
    for (i = 0; i < mess->sz; i++)
    {
        printf("%4s\t%2d\t%2s\t%12s\t%12s\n",
            mess->data[i].name,
            mess->data[i].age,
            mess->data[i].gender,
            mess->data[i].address,
            mess->data[i].tele);
    }
}


void ClearMessage(pMessage mess)  //清空
{
    mess->sz = 0;
}

一个静态的通讯录就完成了,其实代码也不多,只要思路清晰,代码很快就可以写出来了。如有错误,还请大神指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值