通讯录(基础版本)

本文介绍了使用C语言实现的一个基础通讯录程序,包括添加联系人、删除指定联系人、查找联系人、修改联系人以及按名称排序的功能。
摘要由CSDN通过智能技术生成

test.c

#define _CRT_SECURE_NO_WARNINGS 
#include"contact.h"
/*
    实现一个通讯录:人的信息:
    名字+年龄+性别+电话+地址
    1.存放100个人的信息
    2.增加联系人
    3.删除指定联系人
    4.查找联系人
    5.修改联系人
    6.排序
    7.、显示联系人
*/
/*
    test.c 测试功能
    contact.c 通讯录相关的实现
    contact.h 通讯录相关的声明d

*/
enum option
{
    EXIT,
    ADD,
    DEL,
    CHANGE,
    CHECK,
    SHOW,
    SORT,
};
void meau()
{
    printf("***********************************\n");
    printf("******** 0.exit   1.add    ********\n");
    printf("******** 2.del    3.change ********\n");
    printf("******** 4.check  5.show   ********\n");
    printf("******** 6.sort            ********\n");
    printf("***********************************\n");
}
int main()
{
    contact pc = {0};
    //初始化pc
    inti(&pc);
    int input = 0;
    do
    {
        meau();
        printf("请输入您要选择的模式:>\n");
        scanf("%d", &input);
        switch (input)
        {
        case EXIT:
            printf("退出成功\n");
            break;
        case ADD:
            addContact(&pc);
            break;
        case DEL:
            delContact(&pc);
            break;
        case CHECK:
            checkContact(&pc);
            break;
        case CHANGE:
            changeContact(&pc);
            break;
        case SHOW:
            showContact(&pc);
            break;
        case SORT:
            sortContact(&pc);
            break;
        default:
            printf("对不起,您选择的模式不合法\n");
            break;
        }
    } while (input);
    return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 

#include"contact.h"

//初始化pc
void inti(contact* pc)
{
    assert(pc);
    memset(pc->inFo, 0, sizeof(pc->inFo));
    pc->count = 0;
}

//增加联系人
void addContact(contact* pc)
{
    assert(pc);
    if (pc->count == MAX_INFOPEOPLE)
    {
        printf("对不起,通讯录已满\n");
        return;
    }
    printf("请输入姓名:>\n");
    scanf("%s", pc->inFo[pc->count].name);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->inFo[pc->count].age));
    printf("请输入性别:>\n");
    scanf("%s", pc->inFo[pc->count].sex);
    printf("请输入电话:>\n");
    scanf("%s", pc->inFo[pc->count].tele);
    printf("请输入地址:>\n");
    scanf("%s", pc->inFo[pc->count].addr);
    //记录通讯录中联系人的个数
    (pc->count)++;
    printf("增加成功!\n");
    return;
}

//显示通讯录
void showContact(const contact* pc)
{
    assert(pc);
    if (pc->count == 0)
    {
        printf("通讯录为空\n");
        return;
    }
    printf("%-20s\t%-6s\t%-12s\t%-14s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
    for (int i = 0; i < pc->count; i++)
    {
        printf("%-20s\t%-6d\t%-12s\t%-14s\t%-50s\n",
            pc->inFo[i].name,
            pc->inFo[i].age,
            pc->inFo[i].sex,
            pc->inFo[i].tele,
            pc->inFo[i].addr);
    }
}

//删除指定联系人
void delContact(contact* pc)
{
    assert(pc);
    if (pc->count == 0)
    {
        printf("通讯录为空,无联系人可删\n");
        return;
    }

    int ret = findPeopleByName(pc);
    if (ret == -1)
    {
        printf("该联系人不存在\n");
        return;
    }
    for (int i = ret; i < (pc->count) - 1; i++)
    {
        pc->inFo[i] = pc->inFo[i + 1];
    }
    (pc->count)--;
    printf("删除成功\n");
}

//通过姓名查找联系人,无此人返回-1,否则返回下标。
int findPeopleByName(const contact* pc)
{
    //接收联系人的姓名
    char name[MAX_NAME];
    printf("请输入联系人的姓名:>\n");
    scanf("%s", &name);
    for (int i = 0; i < pc->count; i++)
    {
        if (strcmp(name, pc->inFo[i].name) == 0)
        {
            return i;
        }
    }
    return -1;
}

//查找指定联系人并显示其全部信息
void checkContact(const contact* pc)
{
    assert(pc);
    if (pc->count == 0)
    {
        printf("通讯录为空\n");
        return;
    }
    int ret = findPeopleByName(pc);
    if (ret == -1)
    {
        printf("该联系人不存在\n");
        return;
    }
    printf("%-20s\t%-6s\t%-12s\t%-14s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");

        printf("%-20s\t%-6d\t%-12s\t%-14s\t%-50s\n",
            pc->inFo[ret].name,
            pc->inFo[ret].age,
            pc->inFo[ret].sex,
            pc->inFo[ret].tele,
            pc->inFo[ret].addr);
}

//查找指定联系人并修改其信息
void changeContact(contact* pc)
{
    assert(pc);
    if (pc->count == 0)
    {
        printf("通讯录为空\n");
        return;
    }
    int ret = findPeopleByName(pc);
    if (ret == -1)
    {
        printf("该联系人不存在\n");
        return;
    }
    printf("已查找到联系人\n");

    printf("请输入修改后的姓名:>\n");
    scanf("%s", pc->inFo[ret].name);
    printf("请输入修改后的年龄:>\n");
    scanf("%d", &(pc->inFo[ret].age));
    printf("请输入修改后的性别:>\n");
    scanf("%s", pc->inFo[ret].sex);
    printf("请输入修改后的电话:>\n");
    scanf("%s", pc->inFo[ret].tele);
    printf("请输入修改后的地址:>\n");
    scanf("%s", pc->inFo[ret].addr);

    printf("修改成功\n");
}


int compareByName(void* e1,void* e2)
{
    return strcmp(((struct peopleInFo*)e1)->name, ((struct peopleInFo*)e2)->name);
}
//对通讯录中的内容按照名字进行排序
void sortContact(contact* pc)
{
    assert(pc);
    if (pc->count == 0)
    {
        printf("通讯录为空\n");
        return;
    }
    // compareByName,其中的e1与e2一定是被即将排序的所包含的
    qsort(pc->inFo,pc->count,sizeof(struct peopleInFo), compareByName);
    printf("排序成功\n");
}

contact.h

#pragma once

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

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 50
#define MAX_INFOPEOPLE 100

struct peopleInFo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
};

typedef struct contact
{
    struct peopleInFo inFo[MAX_INFOPEOPLE];
    int count;
}contact;

//初始化pc
void inti(contact* pc);

//增加联系人
void addContact(contact* pc);

//显示通讯录
void showContact(contact* pc);

//删除指定联系人
void delContact(contact* pc);

//查找指定联系人并显示其全部信息
void checkContact(contact* pc);

//查找指定联系人并修改其信息
void changeContact(contact* pc);

//对通讯录中的内容按照名字进行排序
void sortContact(contact* pc);

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值