5分钟学会怎么用C语言实现一个通讯录
小标 2018-07-25 来源 : 阅读 497 评论 0

摘要:本文主要向大家介绍了怎么用C语言实现一个通讯录,通过具体的内容向大家展示,希望对大家学习C语言有所帮助。

本文主要向大家介绍了怎么用C语言实现一个通讯录,通过具体的内容向大家展示,希望对大家学习C语言有所帮助。

实现一个通讯录

要求:

通讯录可以用来存储1000个人的信息,每个人的信息包括:

姓名、性别、年龄、电话、住址

提供方法:

1. 添加联系人信息

2. 删除指定联系人信息

3. 查找指定联系人信息

4. 修改指定联系人信息

5. 显示所有联系人信息

6. 清空所有联系人

7. 以名字排序所有联系人

思路:

TDD(测试驱动开发)思想,模块化编程!

代码实现

头文件Contact的实现

#ifndef _CONTACT_H__

#define _CONTACT_H__

 

#define MAX_NAME 20

#define MAX_SEX 5

#define MAX_PHONE 20

#define MAX_ADDR 30

#define MAX_PEO 1000

 

enum OPTION //通讯录的功能选项

{

    EXIT, //退出

    ADD, //添加联系人信息

    DELETE, //删除指定联系人信息

    SEARCH, //查找指定联系人信息

    MODIFY, //修改指定联系人信息

    SHOW, //显示所有联系人信息

    EMPTY, //清空所有联系人

    SORT, //以名字排序所有联系人

};

 

enum Mod_list//修改联系人信息的选项

{

    EXITMODIFY,

    NAME,

    SEX,

    AGE,

    PHONE,

    ADDRESS,

};

 

enum Sort_list//排序方式的选项

{

    EXIT_SORT,

    NAME_SORT,

    AGE_SORT,

    PHONE_SORT,

    ADDRESS_SORT,

};

 

typedef struct PeoInfo

{

    char name[MAX_NAME];//名字

    char sex[MAX_SEX];//性别

    int age;//年龄

    char phone[MAX_PHONE];//电话

    char address[MAX_ADDR];//地址

}PeoInfo;

 

typedef struct Contact

{

    PeoInfo data[MAX_PEO];//通讯录

    int count;//通讯录人数

}Contact,*pContact;

 

 

void menu();

void InitContact(pContact pc);//初始化通讯录函数

void AddContact(pContact pc);//添加联系人信息函数

void DeleteContact(pContact pc);//删除指定联系人信息函数

void SearchContact(pContact pc);//查找指定联系人信息函数

void ModifyContact(pContact pc);//修改指定联系人信息函数

void ShowContact(pContact pc);//显示所有联系人信息函数

void EmptyContact(pContact pc);//清空所有联系人函数

void SortContact(pContact pc);//排序所有联系人函数

 

#endif

   

头文件Bubble_sort的实现

   

#ifndef _BUBBLE_SORT_H__

#define _BUBBLE_SORT_H__

 

void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2));

int cmp_name(const void* e1, const void* e2);

int cmp_age(const void* e1, const void* e2);

int cmp_phone(const void* e1, const void* e2);

int cmp_address(const void* e1, const void* e2);

 

#endif

   

Contact定义函数的实现

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include

#include "Contact.h"

#include "Bubble_sort.h"

 

void menu()//功能选择菜单

{

    printf("*****************************************\n");

    printf("*********  1.ADD      2.DELETE  *********\n");

    printf("*********  3.SEARCH   4.MODIFY  *********\n");

    printf("*********  5.SHOW     6.EMPTY   *********\n");

    printf("*********  7.SORT     0.EXIT    *********\n");

    printf("*****************************************\n");

}

 

void Mod_list()//修改信息选择菜单

{

    printf("*****************************************\n");

    printf("*********   1.name     2.sex    *********\n");

    printf("*********   3.age      4.phone  *********\n");

    printf("*********   5.address  0.exit  *********\n");

    printf("*****************************************\n");

}

 

void Sort_list()//排序方式选择菜单

{

    printf("*****************************************\n");

    printf("*********   1.name   2.age     *********\n");

    printf("*********   3.phone  4.address *********\n");

    printf("*********        0.exit        *********\n");

    printf("*****************************************\n");

}

 

int find_person(pContact pc)//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1

{

    char person_name[MAX_NAME];

    int i = 0;

    assert(pc);

    printf("请输入要查找人的姓名:");

    assert(1 == scanf("%s", person_name));

    for (i = 0; i < pc->count; i++)

    {

        if (strcmp(person_name, pc->data[i].name)==0)

            return i;//所查找联系人存在

    }

    return -1;//不存在

}

 

void InitContact(pContact pc)//初始化通讯录

{

    assert(pc);

    pc->count = 0;

    memset(pc->data, 0, sizeof(pc->data));

}

 

void AddContact(pContact pc)//添加联系人

{

    assert(pc);

    if (pc->count == MAX_PEO)

    {

        printf("请注意,通讯录已满!\n");

        return;

    }

    printf("-----------------------------------------\n");

    printf("请输入名字:");

    scanf("%s", pc->data[pc->count].name);

    printf("请输入性别:");

    scanf("%s", pc->data[pc->count].sex);

    printf("请输入年龄:");

    scanf("%d", &(pc->data[pc->count].age));

    printf("请输入电话:");

    scanf("%s", pc->data[pc->count].phone);

    printf("请输入地址:");

    scanf("%s", pc->data[pc->count].address);

    pc->count++;

    printf("-----------------------------------------\n");

}

 

void DeleteContact(pContact pc)//删除联系人

{

    assert(pc);

    if (pc->count == 0)

    {

        printf("通讯录为空\n");

        return;

    }

    else

    {

        int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。

        if (ret == -1)

        {

            printf("无该联系人!\n");

            return;

        }

        else

        {

            int i = 0;

            for (i = ret; i < pc->count; i++)//删除指定联系人后,将后续联系人往前移动

            {

                pc->data[i] = pc->data[i + 1];

            }

            pc->count--;

            printf("删除联系人成功!\n");

        }

    }

}

 

void SearchContact(pContact pc)//查找指定联系人

{

    assert(pc);

    if (pc->count == 0)

    {

        printf("通讯录为空\n");

        return;

    }

    int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。

    if (ret == -1)

    {

        printf("无该联系人!\n");

        return;

    }

    else

    {

        printf("-----------------------------------------\n");

        printf("该联系人信息:\n");//打印该联系人信息

        printf("名字: %s\n性别: %s\n年龄: %d\n电话: %s\n地址: %s\n", pc->data[ret].name, pc->data[ret].sex,

            pc->data[ret].age, pc->data[ret].phone, pc->data[ret].address);

        printf("-----------------------------------------\n");

    }

}

 

void ModifyContact(pContact pc)//修改指定联系人信息

{

    assert(pc);

    if (pc->count == 0)

    {

        printf("通讯录为空\n");

        return;

    }

    int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。

    if (ret == -1)

    {

        printf("无该联系人!\n");

        return;

    }

    else

    {

        int input = 0;

        Mod_list();//修改联系人信息的选项

        printf("请选择要修改的信息:");

        assert(1 == scanf("%d", &input));

        switch (input)

        {

        case NAME:

            printf("请输入修改后的名字:");

            scanf("%s", pc->data[ret].name);

            break;

        case SEX:

            printf("请输入修改后的性别:");

            scanf("%s", pc->data[ret].sex);

            break;

        case AGE:

            printf("请输入修改后的年龄:");

            scanf("%s", pc->data[ret].age);

            break;

        case PHONE:

            printf("请输入修改后的电话:");

            scanf("%s", pc->data[ret].phone);

            break;

        case ADDRESS:

            printf("请输入修改后的地址:");

            scanf("%s", pc->data[ret].address);

            break;

        default:

            printf("选择错误,请重新选择\n");

            break;

        }

    }

}

 

void ShowContact(pContact pc)//显示

{

    assert(pc);

    int i = 0;

    if (pc->count == 0)

    {

        printf("通讯录为空\n");

        return;

    }

    printf("-----------------------------------------\n");

    for (i = 0; i < pc->count; i++)

    {

        printf("名字: %s\n性别: %s\n年龄: %d\n电话: %s\n地址: %s\n", pc->data[i].name, pc->data[i].sex,

            pc->data[i].age, pc->data[i].phone, pc->data[i].address);

    }

    printf("-----------------------------------------\n");

}

 

void EmptyContact(pContact pc)//清空

{

    assert(pc);

    pc->count = 0;

    memset(pc->data, 0, sizeof(pc->data));//初始化函数

    printf("清空通讯录成功!\n");

}

 

 

 

void SortContact(pContact pc)//排序所有联系人函数

{

    assert(pc);

    if (pc->count == 0)

    {

        printf("通讯录为空\n");

        return;

    }

    int input = 0;

    Sort_list();//排序方式的选项

    printf("请选择按什么方式排序:");

    assert(1 == scanf("%d", &input));

    switch (input)

    {

    case NAME_SORT:

        bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_name);//以名字排序

        break;

    case AGE_SORT:

        bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_age);//以年龄排序

        break;

    case PHONE_SORT:

        bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_phone);//以电话排序

        break;

    case ADDRESS_SORT:

        bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_address);//以地址排序

        break;

    default:

        printf("选择错误,请重新选择\n");

        break;

    }

    printf("通讯录排序成功!\n");

}</assert.h></string.h></stdlib.h></stdio.h>

   

Bubble_sort定义函数的实现

   

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include

#include "Contact.h"

#include "Bubble_sort.h"

int cmp_name(const void* e1, const void* e2)//比较名字

{

    assert(e1&&e2);

    return (strcmp(((PeoInfo *)e1)->name, ((PeoInfo *)e2)->name));

}

 

int cmp_age(const void* e1, const void* e2)//比较年龄

{

    assert(e1&&e2);

    return (*(PeoInfo *)e1).age - (*(PeoInfo *)e2).age;

}

 

int cmp_phone(const void* e1, const void* e2)//比较电话

{

    assert(e1&&e2);

    return (strcmp(((PeoInfo *)e1)->phone, ((PeoInfo *)e2)->phone));

}

 

int cmp_address(const void* e1, const void* e2)//比较地址

{

    assert(e1&&e2);

    return (strcmp(((PeoInfo *)e1)->address, ((PeoInfo *)e2)->address));

}

 

void SWAP(char *e1, char *e2, int width)//交换信息

{

    int i = 0;

    assert(e1&&e2);

    for (i = 0; i < width; i++)

    {

        char tmp = *((char*)e1 + i);

        *((char*)e1 + i) = *((char*)e2 + i);

        *((char*)e2 + i) = tmp;

    }

}

void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2))//排序

{

    int i = 0;

    int j = 0;

    assert(base&&cmp);

    for (i = 0; i < sz - 1; i++)

    {

        for (j = 0; j < sz - 1 - i; j++)

        {

            if (cmp((char *)base + width*j, (char *)base + width*(j + 1))>0)

                SWAP((char *)base + width*j, (char *)base + width*(j + 1), width);

        }

    }

}</assert.h></string.h></stdlib.h></stdio.h>

   

main函数的实现

   

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

#include

#include "Contact.h"

#include "Bubble_sort.h"

 

int main()

{

    Contact my_con;

    void(*Opion[8])(pContact) = { 0, AddContact, DeleteContact, SearchContact, ModifyContact, ShowContact, EmptyContact, SortContact };

    int input = 0;

    InitContact(&my_con);//初始化通讯录

    do

    {

        menu();

        printf("请选择操作功能:");

        assert(1==scanf("%d", &input));

        Opion[input](&my_con);//使用函数指针数组选择功能,作用相当于switch选择语句

    } while(input);

    system("pause");

    return 0;

}</assert.h></stdlib.h></stdio.h>

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:13167058313
小职老师的微信号:13167058313

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    ICP许可  沪B2-20190160

站长统计