初级通讯录的实现详细攻略

news2024/11/22 22:48:41

我们设计的要求

存储多少个人的信息我们使用宏,这样方便修改

建立三个文件

先从主函数入手

为了持续多次,实现操作,我们利用循环,循环次数未知,我们只能选择while循环,do-while循环,我们始终要进行一次判断操作,所以我们使用do while循环

进入循环我们首先要打印菜单

根据菜单选择操作,所以还有一个输入

void menu()
{
    printf("***************************************\n");
    printf("*****    1.add      2.del         *****\n");
    printf("*****    3.search   4.alter       *****\n");
    printf("*****    5.show     6.empty       *****\n");
    printf("*****    7.sort     0.exit        *****\n");
    printf("***************************************\n");

}

int main()
{
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1: 
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            
            break;
        case 0:
            break;
        default:
            break;
        }

    } while (input);
}

输入对应菜单的数字,然后实现功能,输入错误,重新输入

我们通讯录联系人的信息各种各样,类型不同,所以我们想到了,结构体可以存储不同的变量

那么我们就来先进行结构体的声明,还有结构体变量的创建

声明

#define num 1000
#define num_name 20
#define num_sex 5
#define num_tel 20
#define num_address 30

typedef struct PeoInfo
{
    char name[num_name];
    char sex[num_sex];
    int age;
    char tel[num_tel];
    char address[num_address];
}PeoInfo;

typedef struct Contact
{
    PeoInfo data[num];//联系人数量
    int sz;//存有联系人数量
}Contact;

变量的创建

//创建结构体
    Contact con;

创建好结构体我们要对结构体进行初始化

利用一个函数IntiContact进行初始化,我们函数的参数传什么,我们首选传地址的方式,因为直接传内容,要对内容进行临时的拷贝,这样会降低性能,我们考虑传结构体的地址,结构体的名字叫con

函数设计

函数的实现

void IntiContact(Contact* pc)//初始化电话簿
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}

函数的形参我们利用一个结构体指针来接收

memset函数进行内容的设置

我们来一步一步的实现功能

  1. add,增加联系人

我们输入了1,进行增加联系人的选项,我们创建一个函数AddContact进行增加,

所以我们函数这样设计

函数内容我们放到address_book.c内封装

进入函数我们要判断电话簿满了没有

如果不满,我们进行添加

函数的实现代码

void AddContact(Contact* pc)//增加联系人
{
    if (pc->sz == num)
    {
        printf("通讯录已经满了\n");
        return;
    }

    printf("请输入姓名\n");
    scanf("%s", pc->data[pc->sz].name);

    printf("请输入性别\n");
    scanf("%s", pc->data[pc->sz].sex);

    printf("请输入年龄\n");
    scanf("%d", &(pc->data[pc->sz].age));

    printf("请输入电话\n");
    scanf("%s", pc->data[pc->sz].tel);

    printf("请输入地址\n");
    scanf("%s", pc->data[pc->sz].address);

    pc->sz++;

}

最后sz要++,因为联系人多了一个

我们写程序的时候不一定要循规蹈矩,我们添加完联系人,我们就看看,有没有添加进去

我们先实现输入5的功能,显示电话簿

创建函数

我们电话簿联系人很多所以我们要通过循环进行打印

函数的实现

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

在开头我们打印"姓名", "性别", "年龄", "电话", "地址",让读者明白以后打印完下面对应的东西是什么。

然后我们得到了

好像有模有样了

下面实现输入2,删除功能

删除联系人前,还要判断电话簿是否有联系人

我们删除联系人,需要输入联系人,然后在电话簿查找联系人是否存在,功能2,3,4都需要查找联系人,我们可以封装一个函数来专门查找联系人,需要查找联系人的时候,调用这个函数就可以了

查找联系人的函数

int FindName(Contact* pc, char name[])//查找某一个联系人
{
    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)//删除联系人
{
    if (pc->sz == 0)
    {
        printf("通讯录没有联系人,无法删除\n");
        return;
    }

    char name[20];
    printf("请输入要删除的名字\n");
    scanf("%s", name);

    int ret=FindName(pc, name);

    if (ret == -1)
    {
        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");
}

接下来实现输入3,搜索功能

搜索一个人,先输入,再通过我们的查找函数在电话簿查找,联系人是否存在,不存在我们就搜索失败,存在就打印出来

函数的实现

void SearchContact(Contact* pc)//搜索联系人
{
    char name[20];
    printf("请输入要查找的联系人\n");
    scanf("%s", name);

    int ret = FindName(pc, name);

    if (ret == -1)
    {
        printf("没有该联系人\n");
        return;
    }

    printf("%-20s\t%-5s\t%-3s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "地址");


    printf("%-20s\t%-5s\t%-3d\t%-12s\t%-20s\n",
        pc->data[ret].name,
        pc->data[ret].sex,
        pc->data[ret].age,
        pc->data[ret].tel,
        pc->data[ret].address);
}

输入4,实现修改联系人功能

修改联系人前,我们也需要搜索联系人,判断联系人是否存在,然后出现输入联系人的信息

函数的实现

void AlterContact(Contact* pc)
{
    printf("请输入要修改人的名字\n");
    char name[20];

    scanf("%s", name);

    int ret = FindName(pc, name);

    if (ret == -1)
    {
        printf("电话簿没有此人\n");
        return;
    }

    printf("请输入新姓名\n");
    scanf("%s", pc->data[ret].name);

    printf("请输入新性别\n");
    scanf("%s", pc->data[ret].sex);

    printf("请输入新年龄\n");
    scanf("%d", &(pc->data[ret].age));

    printf("请输入新电话\n");
    scanf("%s", pc->data[ret].tel);

    printf("请输入新地址\n");
    scanf("%s", pc->data[ret].address);

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

}

输入6,清空电话簿

清空功能,和我们初始化大同小异

void EmptyContact(Contact* pc)//清空电话簿
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));

    printf("清空电话簿成功\n");
}

输入7,我们进行结构体的排序

我们前面也有接受使用qsort排序,链接http://t.csdn.cn/Ur4HK

int Contact_sort_name(void* e1, void* e2)
{
    return strcmp((Contact*)e1, (Contact*)e2);
}

简易通讯录的框架就是这样,后续我还会继续优化

原码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "address_book.h"

void menu()
{
    printf("***************************************\n");
    printf("*****    1.add      2.del         *****\n");
    printf("*****    3.search   4.alter       *****\n");
    printf("*****    5.show     6.empty       *****\n");
    printf("*****    7.sort     0.exit        *****\n");
    printf("***************************************\n");

}

int main()
{
    int input = 0;

    //创建结构体
    Contact con;

    //初始化
    IntiContact(&con);

    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1: AddContact(&con);
            break;
        case 2: DelContact(&con);
            break;
        case 3: SearchContact(&con);
            break;
        case 4: AlterContact(&con);
            break;
        case 5: ShowContact(&con);
            break;
        case 6: EmptyContact(&con);
            break;
        case 7: qsort(&con, con.sz, sizeof(con.data[0]), Contact_sort_name);
                printf("排序成功\n");
            break;
        case 0: printf("退出通讯录\n");
            break;
        default: printf("输入错误请重新输入\n");
            break;
        }

    } while (input);

    return 0;
}

address_book.c

#define _CRT_SECURE_NO_WARNINGS 1


#include "address_book.h"

void IntiContact(Contact* pc)//初始化电话簿
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}

void AddContact(Contact* pc)//增加联系人
{
    if (pc->sz == num)
    {
        printf("通讯录已经满了\n");
        return;
    }

    printf("请输入姓名\n");
    scanf("%s", pc->data[pc->sz].name);

    printf("请输入性别\n");
    scanf("%s", pc->data[pc->sz].sex);

    printf("请输入年龄\n");
    scanf("%d", &(pc->data[pc->sz].age));

    printf("请输入电话\n");
    scanf("%s", pc->data[pc->sz].tel);

    printf("请输入地址\n");
    scanf("%s", pc->data[pc->sz].address);

    pc->sz++;

}

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

int FindName(Contact* pc, char name[])//查找某一个联系人
{
    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)//删除联系人
{
    if (pc->sz == 0)
    {
        printf("通讯录没有联系人,无法删除\n");
        return;
    }

    char name[20];
    printf("请输入要删除的名字\n");
    scanf("%s", name);

    int ret=FindName(pc, name);

    if (ret == -1)
    {
        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(Contact* pc)//搜索联系人
{
    char name[20];
    printf("请输入要查找的联系人\n");
    scanf("%s", name);

    int ret = FindName(pc, name);

    if (ret == -1)
    {
        printf("没有该联系人\n");
        return;
    }

    printf("%-20s\t%-5s\t%-3s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "地址");


    printf("%-20s\t%-5s\t%-3d\t%-12s\t%-20s\n",
        pc->data[ret].name,
        pc->data[ret].sex,
        pc->data[ret].age,
        pc->data[ret].tel,
        pc->data[ret].address);
}

void AlterContact(Contact* pc)
{
    printf("请输入要修改人的名字\n");
    char name[20];

    scanf("%s", name);

    int ret = FindName(pc, name);

    if (ret == -1)
    {
        printf("电话簿没有此人\n");
        return;
    }

    printf("请输入新姓名\n");
    scanf("%s", pc->data[ret].name);

    printf("请输入新性别\n");
    scanf("%s", pc->data[ret].sex);

    printf("请输入新年龄\n");
    scanf("%d", &(pc->data[ret].age));

    printf("请输入新电话\n");
    scanf("%s", pc->data[ret].tel);

    printf("请输入新地址\n");
    scanf("%s", pc->data[ret].address);

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

}

void EmptyContact(Contact* pc)//清空电话簿
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));

    printf("清空电话簿成功\n");
}

int Contact_sort_name(void* e1, void* e2)
{
    return strcmp((Contact*)e1, (Contact*)e2);
}

address_book.h

#pragma once


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

#define num 1000
#define num_name 20
#define num_sex 5
#define num_tel 20
#define num_address 30

typedef struct PeoInfo
{
    char name[num_name];
    char sex[num_sex];
    int age;
    char tel[num_tel];
    char address[num_address];
}PeoInfo;

typedef struct Contact
{
    PeoInfo data[num];//联系人数量
    int sz;//存有联系人数量
}Contact;


void IntiContact(Contact* pc);//初始化

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

void ShowContact(Contact* pc);//展示电话簿

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

void SearchContact(Contact* pc);//搜索联系人

void EmptyContact(Contact* pc);//清空电话簿

int Contact_sort_name(void* e1, void* e2);//qsort



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ORB-SLAM2 --- LoopClosing::Run 回环检测线程解析

目录 1.函数作用 2.code 3.函数解析 3.1 查看是否有待处理的回环关键帧LoopClosing::CheckNewKeyFrames 3.2 检测闭环LoopClosing::DetectLoop 3.3 计算当前关键帧和上一步闭环候选帧的Sim3变换 3.4 闭环矫正 1.函数作用 回环检测&#xff0c;又称闭环检测&#xff0c…

文件操作和IO

一.文件的概念&#xff1a;狭义的文件指&#xff1a;硬盘上的文件和目录广义上的文件指&#xff1a;计算机中的很多软硬件资源路径&#xff1a;绝对路径&#xff1a;以c&#xff1a;d盘符开头的路径&#xff0c;比如c:/Intel/Logs/text.txt相对路径&#xff1a;以当前所在的目录…

Vue - 完美解决小数的四则运算(加减乘除)导致精度丢失问题,提供详细计算示例代码vue数据计算丢失精度

前言 由于 JavaScript 语言的问题,两个小数进行四则运算时,会出现各种问题,一些财务系统是必须要解决的。 本文实现了 完美修复小数计算时,计算错误、精度丢失等问题, 您可以进行任意小数的四则运算,都能保证结果是正确的。 如下图所示,使用了本文提供的方法后,可以形…

ArcGIS修改图斑时替换几何的妙用!不要只会整型要素

我们时常通过整型要素来修改要素的形状&#xff0c;但是有时候我们改变整个要素的形状、位置&#xff0c;还要保留属性不变&#xff0c;那我们就要考虑&#xff0c;高级编辑中的“替换几何”工具了。 01 替换几何原理 1 、“替换几何”工具可以为要素创建全新形状。“替换几何…

【Java】Properties类

文章目录01 初识Properties02 Properties常用方法03 Properties使用案例01 初识Properties 创建这样一个配置文件&#xff1a; 传统方法&#xff1a; public static void main(String[] args) throws IOException {//读取mysql.properties文件&#xff0c;并得到ip、user、pw…

Dubbo集群容错

Dubbo集群容错 1. 集群容错 集群调用失败时&#xff0c;Dubbo 提供的容错方案。 在集群调用失败时&#xff0c;Dubbo 提供了多种容错方案&#xff0c;缺省为 failover 重试。 各节点关系&#xff1a; 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象&#xff0c;I…

n皇后(回溯)

著名的n皇后问题 即在棋盘上任意两个皇后不能在同一行&#xff0c;同一列&#xff0c;或者斜对角线&#xff0c;反斜对角线的位置 以判断&#xff08;5&#xff0c;1&#xff09;位置为例 往右下方&#xff08;斜对角线&#xff09;一连串的位置 &#xff08;5&#xff0c;1&…

Naive-UI自定义TabPane样式

前言前端开发通常使用 第三方 UI 组件库&#xff0c;像大家熟悉的 Element-UI、AntD Vue 等最近发现一个 还比较好用的 组件库 Naive-UI 传送门 &#xff0c;Vue 3 组件库&#xff0c;使用 TypeScript &#xff0c;用起来感觉还不错&#xff0c;它的主题也可以切换 &#xff08…

首款自研成像雷达发布!国产玩家赋能智能驾驶“第四类”感知

4D成像雷达赛道的“战火”正在不断升级。 高工智能汽车研究院预计&#xff0c;4D成像雷达将从2023年初开始小规模前装导入&#xff0c;预计到2024年&#xff0c;定点/搭载量有望突破百万颗&#xff0c;到2025年占全部前向毫米波雷达的比重或超过40%。 伴随着中国自动驾驶的渗…

Java多线程:多线程 Thread 类 中常用的方法的使用

Java多线程&#xff1a;多线程 Thread 类 中常用的方法的使用 每博一文案 日本有一位方丈曾在其寺庙的公告栏上写下一句标语&#xff1a; ”没有失败的人生才最失败。“ 深以为然&#xff0c;不上高山&#xff0c;不知平地&#xff0c;不经大海&#xff0c;不懂宽阔的涵义&…

很少人知道的7个极酷HTML元素

搜索很酷的HTML元素&#xff0c;尤其是当您不知道要查找什么时&#xff0c;通常就像被扔进一堆垃圾中一样动图别担心&#xff0c;我为你做了肮脏的工作&#xff01;在浏览了看似无穷无尽的HTML元素之后&#xff0c;我挖出了一些很少使用的宝石&#xff01;1. meter&progres…

多线程Monitor工作原理

&#x1f34e;1. 什么是Monitor?我们都知道synchronized的作用是用来保证修饰的代码或者方法执行有且只有一个线程执行&#xff0c;也就是锁。那么在执行被锁住的方式时&#xff0c;synchronized就需要通过monitor来记录和保证锁的状态。所以monitor这里的作用其实就是起到了控…

RFID固定资产管理系统实现批量“秒”级盘点

面对成千上万&#xff0c;乃至几十万的固定资产&#xff0c;如何能高效管理&#xff0c;做到管理无漏洞&#xff0c;盘点无错漏呢&#xff1f;很多企业和软件厂商都在考虑这个问题。现如今&#xff0c;随着物联网的发展&#xff0c;企业可批量实现固定资产的秒级盘点&#xff0…

【C++核心编程】C++全栈体系(十一)

C核心编程 第四章 类和对象 七、多态 1. 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数…

打印机共享遇到的常见问题与解决方法

共享打印机提示错误0X000006d9 解决方法: 1、桌面找到计算机或此电脑,然后再图标上右键选择管理选项菜单; 2、在打开的计算机管理对话框中选择服务和应用程序选项; 3、双击服务和应用程序选项就会打开一个对话框,然后再选择服务菜单双击;

01-JDK、JRE、JVM之间的区别?

1.JDK JDK(Java SE Development Kit)&#xff0c;Java标准开发包&#xff0c;它提供了编译、运⾏Java程序所需的各种⼯具和资源&#xff0c;包括Java编译器、Java运⾏时环境&#xff0c;以及常⽤的Java类库等. JDK安装目录中真正在运行java时起作用的是 bin、include、lib、…

一网打尽链表的经典OJ题!链表必考笔试题第二弹

目录 0.前言 1.合并两个排序链表 1.1 实用小妙招 1.2代码书写 2.链表分割 3.链表的回文结构 4.相交链表 4.1 实用小妙招&#xff08;假定指针法&#xff09; 4.2代码书写 5. 复制带随机指针的链表 0.前言 本文代码及分析图片资源都以上传Gitee&#xff0c;可自取&a…

【Java数据结构】堆与优先级队列(堆)的详解

文章目录 目录 文章目录 一、优先级队列(堆) 1.1优先级队列的概念 二、优先级队列的模拟实现 2.1堆的概念 2.2堆的存储方式 2.3堆的创建 2.4建堆的时间复杂度 2.5堆的插入和删除 三.常用的PriorityQueue介绍 3.1PriorityQueue特性 3.2PriorityQueue常用方法 3.3oj练习 一、优…

CANoe-Model Editor介绍以及如何创建一个服务

Model Editor,模型编辑器,可以打开导入的ARXML文件,编辑现有的或定义新的应用层对象(CO、DO) 什么是CO和DO? Model Editor页面的整体布局为: 在左侧的子窗口中,你可以选择要编辑的内容根据你的选择,相应的内容将显示在右侧根据你在此处的选择,你可以使用其他拆分器来…

Vue--》Vue3的setup语法糖到底香不香?你来看看就知道了

目录 setup语法糖 创建Vue3项目 setup语法糖的使用 快速生成setup语法糖模板 setup语法糖新增的API useSlots()和useAttrs() 顶层await setup语法糖 相信在了解过这篇文章的 setup函数讲解 人会觉得Vue3处理数据变得繁琐了&#xff0c;所有的变量都必须return出来才能使…