通讯录实现(C语言版)静态

我们来用c语言模拟实现一个通讯录,用来保存一个人的姓名、性别、年龄、电话、住址。

在通讯录中还要实现增删查改等功能来管理通讯录。

一、设计思路

  1. 通讯录成员:

我们使用结构体来定义一个人员信息,结构体包括成员姓名、性别、年龄、电话、住址。

typedef struct PeoInfo {
    char name[32];          //姓名
    char sex[8];            //性别
    int age;                //年龄
    char phonenumber[12];   //电话
    char adress[20];        //住址
}PeoInfo;
  1. 通讯录实现:

同样我们需要定义一个通讯录结构,我们使用一个结构体数组来保存人员信息,在定义成员size和capacity来记录当前通讯录已储存人员数量和通讯录最大存储数量。

typedef struct Contact {
    PeoInfo con[MAXNUM];          //1000个大小的数组来保存人员信息
    int size;                     //当前数组大小
    int capacaty ;                //数组最大容量
}Contact;

二、工程设计

我们需要三个工程文件来实现通讯录

1.contact.h //用来引入库函数和声明通讯录实现函数
2.contact.c //通讯录实现函数的定义
3.test.c //用来测试通讯录功能

三、代码,分模块实现

    • 主函数部分

int main() {
    Contact contact;
    InitContact(&contact);
    while (1) {
        int choose = memu();
        switch (choose)
        {
        case 1:
            AddContact(&contact);        //增加联系人
            break;
        case 2:
            DeleContact(&contact);        //删除联系人
            break;
        case 3:
            FindContact(&contact);         //查找联系人   
            break;
        case 4:
            ChangeContact(&contact);        //修改联系人信息
            break;
        case 5:
            ShowContact(&contact);            //打印通讯录
            break;
        case 6:
            CleanContact(&contact);        //清空通讯录
            break;
        case 7:
            SortContact(&contact);        //按姓名排序
            break;
        case 0:
            printf("退出成功\n");
            exit(0);
        default:
            printf("请输入正确选项\n");
            system("pause");
        }

    }
    return 0;
}
    • memu()菜单函数部分:

int memu() {
    system("cls");
    printf("*****************************************\n");
    printf("*********        通讯录         *********\n");
    printf("*********   1.ADD    2.DELETE   *********\n");
    printf("*********   3.FIND   4.CHANGE   *********\n");
    printf("*********   5.SHOW   6.CLEAN    *********\n");
    printf("*********   7.SORT   0.EXIT     *********\n");
    printf("*****************************************\n");
    int input;
    printf("请输入选项\n");
    scanf_s("%d", &input);
    getchar();
    return input;
}

这里输入的选项和switch-case函数对应起来实现选择功能。

效果如下:

    • 通讯录初始化函数部分:

void InitContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
    ps->capacaty = MAXNUM;                //通讯录最大容量这里是1000.
}

因为我们是静态实现的通讯录最大容量是固定的,我们实现的是1000.

    • 添加联系人函数部分:

void AddContact(Contact* ps) {
    assert(ps);
    if (ps->size == MAXNUM) {
        printf("通讯录已满\n");
        exit(-1);
    }
    printf("请输入被添加人的姓名\n");
    scanf("%s", ps->con[ps->size].name);
    printf("请输入被添加人的性别\n");
    scanf("%s", ps->con[ps->size].sex);
    printf("请输入被添加人的年龄\n");
    scanf("%d",& ps->con[ps->size].age);
    printf("请输入被添加人的电话\n");
    scanf("%s", ps->con[ps->size].phonenumber);
    printf("请输入被添加人的住址\n");
    scanf("%s", ps->con[ps->size].adress);
    getchar();
    ps->size++;
    printf("输入成功,请按回车继续\n");
    getchar();
}
注意:我们在添加联系人之前需要判断通讯录是否满员,这里用size和capacity比较,如果相等就表示满员,直接退出。判断后没有满员,则录入成员的信息,再使size++表示添加成功。
    • 显示通讯录信息函数部分:

void ShowContact(Contact* ps) {
    assert(ps);
    system("cls");
    printf("%-7s\t%-5s\t%-5s\t%-11s\t%-32s\t\n","姓名","性别","年龄"," 电话","住址");
    for (int i = 0; i < ps->size; i++) {
        printf("%-7s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[i].name,
                                                            ps->con[i].sex,
                                                            ps->con[i].age,
                                                            ps->con[i].phonenumber,
                                                            ps->con[i].adress);    
    }
    printf("输入回车继续\n");
    getchar();
}

我们只需要遍历通讯录打印信息即可

    • 删除联系人函数部分:

在删除联系人之前我们需要查找要删除的联系人是否存在,存在则返回他的下标不存在返回-1,
我们通过查找联系人姓名来查找
int FindByName(Contact* ps, char* name) {
    for (int i = 0; i < ps->size; i++) {
        if (strcmp(name, ps->con[i].name) == 0) {
            return i;
        }
    }
    return -1;
}
我们使用变量pos来接收FindName()函数返回值,-1就是不存在此人,存在则删除该联系人,size--
void DeleContact(Contact * ps) {
        assert(ps);
        char name[32];
        printf("请输入要删除的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        for (int j = pos; j < ps->size; j++) {
            ps->con[j] = ps->con[j + 1];
        }
        ps->size--;
        printf("删除完毕按回车继续\n");
        getchar();
    }
    • 查找联系人函数部分:

void FindContact(Contact* ps) {
        assert(ps);
        char name[32];
        printf("请输入要查找的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        system("cls");
        printf("查找成功\n");
        printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
        printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
            ps->con[pos].sex,
            ps->con[pos].age,
            ps->con[pos].phonenumber,
            ps->con[pos].adress);
        printf("输入回车继续\n");
        getchar();
}
同样我们使用FindbyName()函数来查找联系人,查找到之后返回下标来打印联系人信息
    • 修改联系人函数部分:

void ChangeContact(Contact* ps) {
    assert(ps);
    char name[32];
    printf("请输入要修改的姓名\n");
    scanf("%s", name);
    getchar();
    int pos = FindByName(ps, name);
    if (pos == -1) {
        printf("查无此人\n");
        return;
    }
    printf("请输入要修改的年龄\n");
    scanf("%d", &ps->con[pos].age);
    printf("请输入要修改的电话\n");
    scanf("%s", ps->con[pos].phonenumber);
    printf("请输入要修改的住址\n");
    scanf("%s", ps->con[pos].adress);
    printf("修改完成\n");
    printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
    printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
        ps->con[pos].sex,
        ps->con[pos].age,
        ps->con[pos].phonenumber,
        ps->con[pos].adress);
    printf("输入回车继续\n");
    getchar();
}

这里都使用了FindbyName()来定位要修改的联系人,从而修改联系人信息

    • 按名字排序部分:

void SortContact(Contact* ps)
{
    if (ps->size == 0)
    {
        printf("通讯录中没有联系人\n");
    }
    else
    {
        for (int i = 0; i < ps->size - 1; i++)
        {
            for (int j = 0; j < ps->size - 1 - i; j++)
            {
                if ((strcmp(ps->con[j].name, ps->con[j + 1].name)) > 0)
                {
                    PeoInfo temp = ps->con[j];
                    ps->con[j] = ps->con[j + 1];
                    ps->con[j + 1] = temp;
                }
            }
        }
        printf("排序成功!\n");
    }
}
    • 清空通讯录部分:

void CleanContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
    printf("清除完毕按回车继续\n");
    getchar();
}
清空通讯录只需要将size置为0这样就表示清除了所有联系人

四、完整代码

contact.h

#pragma once
#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <assert.h>
#define MAXNUM 1000
typedef struct PeoInfo {
    char name[32];
    char sex[8];
    int age;
    char phonenumber[12];
    char adress[20];
}PeoInfo;

typedef struct Contact {
    PeoInfo con[MAXNUM];
    int size;
    int capacaty ;
}Contact;


void InitContact(Contact* ps);
void DestoryContact(Contact* ps);
void AddContact(Contact* ps);
void DeleContact(Contact* ps);
void FindContact(Contact* ps);
void ChangeContact(Contact* ps);
void CleanContact(Contact* ps);
void ShowContact(Contact* ps);
void SortContact(Contact* ps);
void SortContact(Contact* ps);

contact.c

#include"contact.h"
void InitContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
    ps->capacaty = MAXNUM;
}
void DestoryContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
}
void AddContact(Contact* ps) {
    assert(ps);
    if (ps->size == MAXNUM) {
        printf("通讯录已满\n");
        exit(-1);
    }
    printf("请输入被添加人的姓名\n");
    scanf("%s", ps->con[ps->size].name);
    printf("请输入被添加人的性别\n");
    scanf("%s", ps->con[ps->size].sex);
    printf("请输入被添加人的年龄\n");
    scanf("%d",& ps->con[ps->size].age);
    printf("请输入被添加人的电话\n");
    scanf("%s", ps->con[ps->size].phonenumber);
    printf("请输入被添加人的住址\n");
    scanf("%s", ps->con[ps->size].adress);
    getchar();
    ps->size++;
    printf("输入成功,请按回车继续\n");
    getchar();
}
void ShowContact(Contact* ps) {
    assert(ps);
    system("cls");
    printf("%-7s\t%-5s\t%-5s\t%-11s\t%-32s\t\n","姓名","性别","年龄"," 电话","住址");
    for (int i = 0; i < ps->size; i++) {
        printf("%-7s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[i].name,
                                                            ps->con[i].sex,
                                                            ps->con[i].age,
                                                            ps->con[i].phonenumber,
                                                            ps->con[i].adress);    
    }
    printf("输入回车继续\n");
    getchar();
}
void SortContact(Contact* ps);
int FindByName(Contact* ps, char* name) {
    for (int i = 0; i < ps->size; i++) {
        if (strcmp(name, ps->con[i].name) == 0) {
            return i;
        }
    }
    return -1;
}
void DeleContact(Contact * ps) {
        assert(ps);
        char name[32];
        printf("请输入要删除的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        for (int j = pos; j < ps->size; j++) {
            ps->con[j] = ps->con[j + 1];
        }
        ps->size--;
        printf("删除完毕按回车继续\n");
        getchar();
    }
void FindContact(Contact* ps) {
        assert(ps);
        char name[32];
        printf("请输入要查找的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        system("cls");
        printf("查找成功\n");
        printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
        printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
            ps->con[pos].sex,
            ps->con[pos].age,
            ps->con[pos].phonenumber,
            ps->con[pos].adress);
        printf("输入回车继续\n");
        getchar();
}
void ChangeContact(Contact* ps) {
    assert(ps);
    char name[32];
    printf("请输入要修改的姓名\n");
    scanf("%s", name);
    getchar();
    int pos = FindByName(ps, name);
    if (pos == -1) {
        printf("查无此人\n");
        return;
    }
    printf("请输入要修改的年龄\n");
    scanf("%d", &ps->con[pos].age);
    printf("请输入要修改的电话\n");
    scanf("%s", ps->con[pos].phonenumber);
    printf("请输入要修改的住址\n");
    scanf("%s", ps->con[pos].adress);
    printf("修改完成\n");
    printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
    printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
        ps->con[pos].sex,
        ps->con[pos].age,
        ps->con[pos].phonenumber,
        ps->con[pos].adress);
    printf("输入回车继续\n");
    getchar();
}
void CleanContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
    printf("清除完毕按回车继续\n");
    getchar();
}
void SortContact(Contact* ps)
{
    if (ps->size == 0)
    {
        printf("通讯录中没有联系人\n");
    }
    else
    {
        for (int i = 0; i < ps->size - 1; i++)
        {
            for (int j = 0; j < ps->size - 1 - i; j++)
            {
                if ((strcmp(ps->con[j].name, ps->con[j + 1].name)) > 0)
                {
                    PeoInfo temp = ps->con[j];
                    ps->con[j] = ps->con[j + 1];
                    ps->con[j + 1] = temp;
                }
            }
        }
        printf("排序成功!\n");
    }
}

test.c

#include "contact.h"

int memu() {
    system("cls");
    printf("*****************************************\n");
    printf("*********        通讯录         *********\n");
    printf("*********   1.ADD    2.DELETE   *********\n");
    printf("*********   3.FIND   4.CHANGE   *********\n");
    printf("*********   5.SHOW   6.CLEAN    *********\n");
    printf("*********   7.SORT   0.EXIT     *********\n");
    printf("*****************************************\n");
    int input;
    printf("请输入选项\n");
    scanf_s("%d", &input);
    getchar();
    return input;
}
int main() {
    Contact contact;
    InitContact(&contact);
    while (1) {
        int choose = memu();
        switch (choose)
        {
        case 1:
            AddContact(&contact);
            break;
        case 2:
            DeleContact(&contact);
            break;
        case 3:
            FindContact(&contact);
            break;
        case 4:
            ChangeContact(&contact);
            break;
        case 5:
            ShowContact(&contact);
            break;
        case 6:
            CleanContact(&contact);
            break;
        case 7:
            SortContact(&contact);
            break;
        case 0:
            DestoryContact(&contact);
            printf("退出成功\n");
            exit(0);
        default:
            printf("请输入正确选项\n");
            system("pause");
        }

    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶丨之秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值