如何用C语言实现渣男通讯录

注意:纯属玩笑,博大家一乐,切勿当真

📖首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能

1.你的通讯录要装多少个女朋友你得规定吧;

2.每个女朋友的姓名,年龄,电话,爱好这些要有吧

3.这个通讯录也要有以下功能吧:

增加女朋友,删除女朋友,查找女朋友,修改指定女朋友的信息,显示女朋友们的信息,排序女朋友们(按年龄来排序或者按姓名来排序);

那我们怎样来实现这个渣男通讯录呢。

首先,我们得在屏幕上打印一个通讯录的菜单呀,那我们写一个叫menu的函数,函数的实现放在:contact.c 这个文件中,函数的声明放在contact.h 这里面。

// 打印通讯录的菜单
void menu(void)
{
    printf("***********************************************\n");
    printf("*****   1.add         2.del        ************\n");
    printf("*****   3.search      4.modify     ************\n");
    printf("*****   5.show        6.sort       ************\n");
    printf("*****   0.exit                     ************\n");
    printf("***********************************************\n");
}

菜单打印完了之后,那菜单上面不是有一些选项吗。那我们要根据你所输入的选项来执行相应的功能呀,这个时候我们想到了switch 语句。但是如果你用case1,case2.......这种方式也有弊端,它不容易让我们想到case1 是什么功能,所以要是有 case add 这种形式就好了,我们就知道了add 是增加联系人的那个选项,所以这个时候我们可以用枚举常量:enum来实现我们的目的。

int main()
{
    int input = 0;
    do
    {

        menu();
        printf("请选择:>");
        scanf("%d", &input);
        enum Option
        {
            EXIT,
            ADD,
            DEL,
            SEARCH,
            MODIFY,
            SHOW,
            SORT,
        };
        switch(input)
        {
        case ADD:
            break;
        case DEL:
            break; 
        case SEARCH:
            break;
        case MODIFY:
            break;
        case SHOW:
            break;
        case SORT:
            break;
        case EXIT:
            break;
        default:
            break;
        }
    } while (input);

📌

好了,这个时候要思考我们该如何处理联系人的信息了,我们之前举例了一个联系人包含了姓名,年龄,电话,爱好这些信息。那我们最好用一个结构体来从存这些信息嘛,

所以我们可以在contact.h这个头文件中定义一个存联系人信息的结构体——PeoInfo

#include<stdio.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_LOVE 20
#define MAX_TELE 12
#define MAX_ADDR 30


// 打印通讯录的菜单
void menu(void);
// 定义一个用来存储联系人信息的结构体——PeoInfo

typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char love[MAX_LOVE];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;

为了让我们的通讯录可以存放100个女朋友的信息,所以我们要定义一个结构体类型的数组—— PeoInfo data[100]; 但我们也要知道通讯录中实际上有多少个人吧,所以我们可以用一个计数器来记录:int sz = 0;

为了表示方便,我们可以将PeoInfo data[100] 和 sz 整合到一起,即:再定义一个结构体,

  // 为了方便表示而封装的一个结构体
typedef struct Contact
{
    PeoInfo data[MAX];// 存放联系人的信息
    int sz;// 记录通讯录中有效信息的个数
}Contact;

📌

通讯录的形式已经大致弄好了,我们再来定义Contact类型的变量——con,这个时候就和你创造变量要初始化变量一样,我们也要初始化这个Contact类型的变量con;我们可以写一个函数来初始化它,函数的实现放在:contact.c 这个文件中,函数的声明放在contact.h 这里面。起个名字——InitContact

// 初始化通讯录
void InitContact(Contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));//用memset将数组的所有元素初始化为0;

}

📌接下来是对具体通讯录功能的实现;

💡增加女朋友

// 增加联系人
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].love);
    printf("请输入电话:>");
    scanf("%d", pc->data[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;//添加成功后,人数要加上去
    printf("添加成功\n");
}

💡显示女朋友们的信息

// 显示通讯录
void SHOWcontact(const Contact* pc)
{
    int i = 0;
    printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    for (i = 0; i < pc->sz; i++)
    {

        printf("%-10s %-5d %-5s %-5s %-5s\n", pc->data[i].name, pc->data[i].age, pc->data[i].love, pc->data[i].tele, pc->data[i].addr);
    }

}

💡删除已经分手的女友

//为了避免代码冗余我们定义一个找名字的函数
int findname(Contact* pc, char name[])
{
    int i = 0;
    int pos = 0;
    // 用一个循环来找你想要找的那个名字
    for (i = 0; i < pc->sz; i++)
    {
        if (0 == strcmp(pc->data[i].name, name))
        {
            return i;
        }
    }
    //有可能根本没有你要找的名字,所以我们判断一下;
    if (i == pc->sz)
    {
        return -1;
    }
}

// 删除联系人
void DELEcontact(Contact* pc)
{
    char name[MAX_NAME] = {0};
    if (pc->sz == 0)
    {
        printf("通讯录为空,无法删除\n");
        return;
    }
    //找到你要删除人的位置——就是他的下标
    printf("输入删除人的名字:>");
    scanf("%s", name);

    int pos = findname(pc, name);
    if (-1 == pos)
    {
        printf("要删除的人不存在\n");
        return;
    }

    // 删除 - 删除pos位置上的数据
    int i = 0;
    for (i = pos; i < pc->sz - 1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功了\n");

}

💡查找明天即将约会的女朋友的信息

//查找联系人
void sercontact(const Contact* pc)
{

    char name[MAX_NAME] = { 0 };
    printf("请输入要查找人的名字:>");
    scanf("%s", name);
    //查找
    int pos = findname(pc, name);
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    }
    //打印- - 这次打印的是一个人的信息就不要用循环了
    printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    printf("%-10s %-5d %-5s %-5s %-5\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].love, pc->data[pos].tele, pc->data[pos].addr);
}

💡修改相关女朋友的信息

// 修改联系人的信息
void modifycontact(Contact* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改人的名字:>");
    scanf("%s", name);
    //查找
    int pos = findname(pc, name);
    if (pos == -1)
    {
        printf("你要修改的人不存在\n");
        return;
    }
    //修改
    printf("请输入名字:>");
    scanf("%s", pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", pc->data[pos].age);
    printf("请输入性别:>");
    scanf("%s", pc->data[pos].love);
    printf("请输入电话:>");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pos].addr);
    pc->sz++;


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

💡将女朋友们排序


//将联系人按名字排序
int cmp_byname(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_byname);
}

📖代码汇总

📌test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"

int main()
{
    int input = 0;
    Contact con;// 通讯录 
    int sz = 0; // 用sz来记录我们通讯录中到底有多少个人;
    // 初始化通讯录
    InitContact(&con); 
    
    
    do
    {

        menu();
        printf("请选择:>");
        scanf("%d", &input);
        enum Option
        {
            EXIT,
            ADD,
            DEL,
            SEARCH,
            MODIFY,
            SHOW,
            SORT,
        };
        switch(input)
        {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DELEcontact(&con);
            break; 
        case SEARCH:
            sercontact(&con);
            break;
        case MODIFY:
            modifycontact(&con);
            break;
        case SHOW:
            SHOWcontact(&con);
            break;
        case SORT:
            Sortcontact(&con);
            break;
        case EXIT:
            printf("退出通讯录\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);


    return 0;
}

📌contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"


// 打印通讯录的菜单
void menu(void)
{
    printf("***********************************************\n");
    printf("*****   1.add         2.del        ************\n");
    printf("*****   3.search      4.modify     ************\n");
    printf("*****   5.show        6.sort       ************\n");
    printf("*****   0.exit                     ************\n");
    printf("***********************************************\n");
}


// 初始化通讯录
void InitContact(Contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));//用memset将数组的所有元素初始化为0;

}

// 增加联系人
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].love);
    printf("请输入电话:>");
    scanf("%d", pc->data[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;//添加成功后,人数要加上去
    printf("添加成功\n");
}



// 显示联系人的信息
void SHOWcontact(const Contact* pc)
{
    int i = 0;
    // 打印一行标题:
    printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "爱好", "电话", "地址");
    // 打印具体信息;
    for (i = 0; i < pc->sz; i++)
    {

        printf("%-10s %-5d %-5s %-5s %-5s\n", pc->data[i].name, pc->data[i].age, pc->data[i].love, pc->data[i].tele, pc->data[i].addr);
    }

}
 

//为了避免代码冗余我们定义一个找名字的函数
// static 可以保护findname这个函数,这样的话findname就只能在这个.c文件中使用
static int findname(Contact* pc, char name[])
{
    int i = 0;
    int pos = 0;
    // 用一个循环来找你想要找的那个名字
    for (i = 0; i < pc->sz; i++)
    {
        if (0 == strcmp(pc->data[i].name, name))
        {
            return i;
        }
    }
    //有可能根本没有你要找的名字,所以我们判断一下;
    if (i == pc->sz)
    {
        return -1;
    }
}

// 删除联系人
void DELEcontact(Contact* pc)
{
    char name[MAX_NAME] = {0};
    if (pc->sz == 0)
    {
        printf("通讯录为空,无法删除\n");
        return;
    }
    //找到你要删除人的位置——就是他的下标
    printf("输入删除人的名字:>");
    scanf("%s", name);

    int pos = findname(pc, name);
    if (-1 == pos)
    {
        printf("要删除的人不存在\n");
        return;
    }

    // 删除 - 删除pos位置上的数据
    int i = 0;
    for (i = pos; i < pc->sz - 1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功了\n");

}




//查找指定联系人
void sercontact(const Contact* pc)
{

    char name[MAX_NAME] = { 0 };
    printf("请输入要查找人的名字:>");
    scanf("%s", name);
    //查找
    int pos = findname(pc, name);
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    }
    //打印- - 这次打印的是一个人的信息就不要用循环了
    printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    printf("%-10s %-5d %-5s %-5s %-5\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].love, pc->data[pos].tele, pc->data[pos].addr);
}




// 修改联系人的信息
void modifycontact(Contact* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改人的名字:>");
    scanf("%s", name);
    //查找
    int pos = findname(pc, name);
    if (pos == -1)
    {
        printf("你要修改的人不存在\n");
        return;
    }
    //修改
    printf("请输入名字:>");
    scanf("%s", pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", pc->data[pos].age);
    printf("请输入性别:>");
    scanf("%s", pc->data[pos].love);
    printf("请输入电话:>");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pos].addr);
    pc->sz++;


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



//将联系人按名字排序
int cmp_byname(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_byname);
}

📌contact.h

#pragma once

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_LOVE 20
#define MAX_TELE 12
#define MAX_ADDR 30


// 打印通讯录的菜单
void menu(void);



// 定义一个用来存储联系人信息的结构体——PeoInfo
typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char love[MAX_LOVE];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;


// 为了方便表示而封装的一个结构体
typedef struct Contact
{
    PeoInfo data[MAX];// 存放联系人的信息
    int sz;// 记录通讯录中有效信息的个数
}Contact;



// 初始化通讯录
void InitContact(Contact* pc);

// 增加联系人
void AddContact(Contact* pc);

// 显示通讯录
void SHOWcontact(const Contact* pc);

// 删除联系人
void DELEcontact(Contact* pc);

//查找联系人
void sercontact(const Contact* pc);

// 修改联系人的信息
void modifycontact(Contact* pc);

//将联系人按名字排序
void Sortcontact(Contact* pc);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2541.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第29次CCFCSP认证经验总结

鄙人有幸参加了由中国计算机学会举办的第29次计算机软件能力认证考试&#xff0c;在此进行一些考试细节和经验的总结。 如果没有仔细了解过的小白去网上搜索CCFCSP&#xff0c;可能出现的是CSP-J/S&#xff0c;但是详细了解会发现&#xff0c;首先CSP-J/S分初试和复试&#xff…

.NET/C#/GC与内存管理(含深度解析)

详情请看参考文章&#xff1a;.NET面试题解析(06)-GC与内存管理 - 不灬赖 - 博客园 (cnblogs.com)一、对象创建及生命周期一个对象的生命周期简单概括就是&#xff1a;创建>使用>释放&#xff0c;在.NET中一个对象的生命周期&#xff1a;new创建对象并分配内存对象初始化…

【Linux】浅谈shell命令以及运行原理

前言&#xff1a;上篇博文把linux下的基本指令讲解完了。本期我们聊聊Linux下【shell】命令及其运行原理。 目录 Shell的基本概念与作用 原理图展示 shell命令执行原理 Shell的基本概念与作用 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;ker…

文心一言 VS ChatGPT,国产大模型和国外的差距有多大?

3月16号&#xff0c;百度正式发布了『文心一言』&#xff0c;这是国内公司第一次发布类ChatGPT的产品。大家一定非常好奇文心一言和chatgpt之间的差距有多大&#xff1f;国产大模型还有多少路可走&#xff1f;本文就全面测评这两款产品&#xff01; 目录 体验网址 1、旅游攻…

【vue2】vue2中的性能优化(持续更新中)

⭐ v-for 遍历避免同时使用 v-if ⭐ v-for 中的key绑定唯一的值 ⭐ v-show与v-if对性能的影响 ⭐ 妙用计算属性 ⭐ 使用防抖与节流控制发送频率 ⭐ 路由守卫处理请求避免重复发送请求 ⭐ 使用第三方UI库的引入方式 【前言】 该系列是博主在使用vue2开发项目中常用上的一…

这些IT行业趋势,将改变2023

上一周&#xff0c;你被"AI"刷屏了吗&#xff1f; 打开任何一家科技媒体&#xff0c;人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码&#xff0c;到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…

【Linux】Linux基本指令(下)

前言&#xff1a; 紧接上期【Linux】基本指令&#xff08;上&#xff09;的学习&#xff0c;今天我们继续学习基本指令操作&#xff0c;深入探讨指令的基本知识。 目录 &#xff08;一&#xff09;常用指令 &#x1f449;more指令 &#x1f449;less指令&#xff08;重要&…

【动手学深度学习】(task1)注意力机制剖析

note 将注意力汇聚的输出计算可以作为值的加权平均&#xff0c;选择不同的注意力评分函数会带来不同的注意力汇聚操作。当查询和键是不同长度的矢量时&#xff0c;可以使用可加性注意力评分函数。当它们的长度相同时&#xff0c;使用缩放的“点&#xff0d;积”注意力评分函数…

【问题系列】vue当编辑框被触发就出现保存按钮

目录 问题描述&#xff1a; 解决方案&#xff1a; 1.方案一 2.方案二 3.方案三 问题描述&#xff1a; 一个表单用vue的事件实现当点击编辑按钮(或图标)出现保存按钮&#xff0c;当要编辑的时候只出现编辑按钮&#xff0c;此时保存按钮隐藏 解决方案&#xff1a; 1.方案一…

C++演讲比赛流程管理系统_黑马

任务 学校演讲比赛&#xff0c;12人&#xff0c;两轮&#xff0c;第一轮淘汰赛&#xff0c;第二轮决赛 选手编号 [ 10001 - 10012 ] 分组比赛 每组6人 10个评委 去除最高分 最低分&#xff0c;求平均分 为该轮成绩 每组淘汰后三名&#xff0c;前三名晋级决赛 决赛 前三名胜出 …

KDGX-A光缆故障断点检测仪

一、产品概述 KDGX-A光纤寻障仪是武汉凯迪正大为光纤网络领域施工、测试、维护所设计的一款测试仪表。可实现对光纤链路状态和故障的快速分析&#xff0c;适用于室外维护作业&#xff0c;是现场光纤网络测试与维护中替代OTDR的经济型解决方案。 二、主要特点 1)一键式光纤链路…

基于文心一言的底层视觉理解,百度网盘把「猫」换成了「黄色的猫」

随着移动互联网的一路狂飙&#xff0c;手机已经成为人们的新器官。出门不带钥匙可以&#xff0c;不带手机却是万万不可以的。而手机上&#xff0c;小小的摄像头也越来越成为各位「vlogger」的口袋魔方。每天有超过数亿的照片和视频被上传到百度网盘中&#xff0c;这些照片和视频…

【机器学习算法复现】随机森林,以又放回的方式构建的决策树为基础的集成学习方法,可回归可分类不同任务注意评价指标。

随机森林就是通过集成学习的Bagging思想将多棵树集成的一种算法&#xff1a;它的基本单元就是决策树。随机森林的名称中有两个关键词&#xff0c;一个是“随机”&#xff0c;一个就是“森林”。“森林”很好理解&#xff0c;一棵叫做树&#xff0c;那么成百上千棵就可以叫做森林…

CSS 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…

Docker基础篇——最全讲解

文章目录一、CentOS安装docker二、启动帮助类命令三、镜像命令1.名词概念2.常用命令2.1 镜像命令2.2 容器命令2.2.1&#xff1a;常用参数2.2.2&#xff1a;常用指令2.3 安装单机mysql、redis一、CentOS安装docker docker官网 1&#xff09;yum安装gcc相关&#xff1a; yum -y…

【Spring从成神到升仙系列 五】从根上剖析 Spring 循环依赖

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

经典七大比较排序算法 ·上

经典七大比较排序算法 上1 选择排序1.1 算法思想1.2 代码实现1.3 选择排序特性2 冒泡排序2.1 算法思想2.2 代码实现2.3 冒泡排序特性3 堆排序3.1 堆排序特性&#xff1a;4 快速排序4.1 算法思想4.2 代码实现4.3 快速排序特性5 归并排序5.1 算法思想5.2 代码实现5.3 归并排序特性…

QT的使用3:鼠标事件

鼠标事件0 事件1 需求2 查看控件的事件处理函数3 UI设计4 新建一个类&#xff0c;继承QLabel5 对已有对象进行类型提升6 重写事件处理函数7 项目进一步拓展&#xff08;1&#xff09;获取鼠标按键&#xff08;2&#xff09;鼠标移动&#xff08;3&#xff09;显示多个按键&…

【数据结构】Java实现栈

目录 1. 概念 2. 栈的使用 3. 自己动手实现栈&#xff08;使用动态数组实现栈&#xff09; 1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整体实现 4.1 MyStack类 4.2 Test类 4.3 测试结果 1.…

计算机网络笔记——物理层

计算机网络笔记——物理层2. 物理层2.1 通信基础2.1.1 信号2.1.2 信源、信道及信宿2.1.3 速率、波特及码元2.1.4 带宽2.1.5 奈奎斯特定理采样定理奈奎斯特定理2.1.6 香农定理2.1.7 编码与调制调制数字信号调制为模拟信号模拟数据调制为模拟信号编码数字数据编码为数字信号模拟数…