C语言实现简易版通讯录

1、整体思路

实现一个通讯录:

通讯录可以用存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

实现的功能:

  1. 添加联系人的信息

  1. 删除指定联系人信息

  1. 查找指定联系人信息

  1. 修改指定联系人信息

  1. 显示所有联系人信息

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

同时,使用一个头文件(contact.h)编写自己所创的功能函数,用一个源文件编写函数的实现,用另一个源文件(text.c)实现通讯录的主体。

2.text.c的创建

2.1打印菜单

创建一个函数menu(),把通讯录的功能打印出来。

void menu()
{
    printf("*************************************\n");
    printf("******   1.add      2.del     *******\n");
    printf("******   3.rearch   4.modify  *******\n");
    printf("******   5.show     6.sort    *******\n");
    printf("******         0.exit         *******\n");
    printf("*************************************\n");
}

2.2main函数主体

用do.....while()循环来实现通讯录,用switch语句实现通讯录功能,

int main()
{
    //创建数组
    Contact con = { 0 };
    //初始化
    InitContact(&con);
    int input;
    do {
        menu();
        printf("请选择执行的操作>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            AddContact(&con);
            break;
        case 2:
            DelContact(&con);
            break;
        case 3:
            SearchContact(&con);
            break;
        case 4:
            ModifyContact(&con);
            break;
        case 5:
            ShowContact(&con);
            break;
        case 6:
            SortNameContact(&con);
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

3.contact文件的定义和实现

3.1contact函数的声明及结构体的声明

在头文件中创建一个结构体用于存放一个人的信息(姓名、性别等信息),同时可以宏定义一些使用频繁的常量,

然后存放100个人的信息,要用数组来存放这100个人的信息(注意这个数组的类型是刚刚创建的结构体类型),当我们还没有添加联系人的时候,通讯录中没有联系人,我们要添加的第一个人信息应该放到数组下标为0的地方,第二个人的信息应该放到数组下标为1的地方,所以我们需要另外一个变量来记录下标的位置,也就是说需要一个变量存放联系人的个数,所以完整的描述这个通讯录的信息需要两个变量,因此另一个结构体来存放。

之后,要创建所需要功能的函数的声明

3.2函数功能的实现

3.2.1通讯录初始化

在实现通讯录功能之前初始化通讯录,记录下标位置的变量相当于记录当前联系人的个数(sz),将联系人的个数置为0,当添加成功一个联系人的时候sz++,通讯录中内容也要初始化

3.2.2添加功能

既然要添加一个联系人的信息,肯定要修改数组中的内容,所以我们传通讯录的地址更好一些,即使我们不修改信息,传递地址的效率更高一些(以下为什么传递地址就不加以说明)

我们要添加一个联系人首先要判断这个通讯录满没满,满了添加失败,没满我们添加联系人

添加成功联系人之后sz++(联系人的个数)

3.2.3删除功能

删除联系人的时候我们要判断一下,这个联系人存不存在,如果存在我们才能将联系人删除

如果存在,首先要实现查找功能,

3.2.4查找功能

同样的,要先判断是否存在,然后打印信息,

3.2.5修改功能

先判断是否存在,在使用查找函数进行查找,在修改。

3.2.6排序功能(按名字)

使用qsort函数进行排序

整体代码如下:

contact.h

#pragma once
#include<stdio.h>
#include<string.h>
#include <assert.h>

#include<stdlib.h>
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
typedef struct PeoInfor
{
    char name[SEX_MAX];
    int age;
    char sex[SEX_MAX];
    char addr[ADDR_MAX];
    char tele[TELE_MAX];
}PeoInfor;
typedef struct Contact
{
    PeoInfor data[MAX];//人的信息
    int sz;//已经存放的信息
}Contact;
//初始化
void InitContact(Contact* pc);
//添加功能
void AddContact(Contact* pc);
//展示
void ShowContact(const Contact* pc);
//删除
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);
//排序
void SortNameContact(Contact* pc);
int CmpName(const void* str1, const void* str2);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//函数的实现
//初始化
void InitContact(Contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}
//添加功能
void AddContact(Contact* pc)
{
    if (pc->sz == MAX)
    {
        printf("通讯录已经满了\n");
        return;
    }
    //增加信息
    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].addr);
    printf("请输入电话");
    scanf("%s", pc->data[pc->sz].tele);

    pc->sz++;
}
展示
void ShowContact(const Contact* pc)
{
    printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "姓名", "年龄", "性别", "地址", "电话");
    int i;
    for (i = 0;i < pc->sz;i++)
    {
        printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,
                                                    pc->data[i].age,
                                                    pc->data[i].sex,
                                                    pc->data[i].addr,
                                                    pc->data[i].tele);
    }
}
int FindByName(const Contact* pc, char name[])
{
    assert(pc);

    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

//删除
void DelContact(Contact* pc) 
{
    char name[NAME_MAX];
    if (pc->sz == 0)
    {
        printf("无数据删除\n");
        return;
    }
    printf("请输入要删除的名字:>");
    scanf("%s", name);
    int ret = FindByName(pc, name);
    if (-1 == ret)
    {
        printf("要删除的人不存在\n");
        return;
    }

    int i = 0;
    //删除
    for (i = ret; i < pc->sz - 1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功\n");
}
void SearchContact(const Contact* pc)
{
    assert(pc);
    char name[NAME_MAX] = { 0 };
    printf("请输入要查找人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (-1 == pos)
    {
        printf("要查找的人不存在\n");
        return;
    }
    //打印信息
    printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
    printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
        pc->data[pos].age,
        pc->data[pos].sex,
        pc->data[pos].addr,
        pc->data[pos].tele);
}


void ModifyContact(Contact* pc)
{
    assert(pc);
    char name[NAME_MAX] = { 0 };
    printf("请输入要修改人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (-1 == pos)
    {
        printf("要修改的人不存在\n");
        return;
    }

    printf("请输入名字:>");
    scanf("%s", pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", &(pc->data[pos].age));
    printf("请输入性别:>");
    scanf("%s", pc->data[pos].sex);
    printf("请输入地址:>");
    scanf("%s", pc->data[pos].addr);
    printf("请输入电话:>");
    scanf("%s", pc->data[pos].tele);

    printf("修改完成\n");
}
//排序
int CmpName(const void* str1, const void* str2)
{
    return strcmp(((struct PeoInfor*)str1)->name, ((struct PeoInfor*)str2)->name);
}
void SortNameContact(Contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(struct PeoInfor), CmpName);
}

text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"contact.h"

void menu()
{
    printf("*************************************\n");
    printf("******   1.add      2.del     *******\n");
    printf("******   3.rearch   4.modify  *******\n");
    printf("******   5.show     6.sort    *******\n");
    printf("******         0.exit         *******\n");
    printf("*************************************\n");
}
int main()
{
    //创建数组
    Contact con = { 0 };
    //初始化
    InitContact(&con);
    int input;
    do {
        menu();
        printf("请选择执行的操作>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            AddContact(&con);
            break;
        case 2:
            DelContact(&con);
            break;
        case 3:
            SearchContact(&con);
            break;
        case 4:
            ModifyContact(&con);
            break;
        case 5:
            ShowContact(&con);
            break;
        case 6:
            SortNameContact(&con);
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值