C语言使用结构体实现简单通讯录

下面就为您详细讲解使用C语言结构体实现简单通讯录的攻略。

1. 理解结构体和通讯录的概念

通讯录就是记录联系人信息的一种工具,可以用结构体来表示每个联系人的信息,如姓名、手机号码、地址、电子邮件等。

结构体(struct)是C语言的一种自定义数据类型,它可以由不同类型的数据成员组成。比如说,我们可以定义一个包含姓名、电话、地址、邮件四个成员的结构体类型:

struct Contact {
    char name[20];
    char phone[20];
    char address[50];
    char email[30];
};

以上代码定义了一个名为Contact的结构体,包含四个成员:name、phone、address、email。其中,每个成员都是一个字符数组。

2. 实现通讯录的基本功能

有了结构体之后,我们可以定义一个数组来存储多个联系人的信息。下面是一个通讯录程序的示例,它可以添加联系人、显示联系人以及删除联系人:

#include <stdio.h>

#define MAX_CONTACTS 100  // 最多存储100个联系人

struct Contact {
    char name[20];
    char phone[20];
    char address[50];
    char email[30];
} contacts[MAX_CONTACTS];  // 声明一个含有MAX_CONTACTS个联系人的数组

int num_contacts = 0;  // 当前通讯录中联系人的个数

int main()
{
    int choice;
    do {
        printf("\n通讯录\n");
        printf("1. 添加联系人\n");
        printf("2. 显示联系人\n");
        printf("3. 删除联系人\n");
        printf("4. 退出\n");
        printf("请选择:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                if (num_contacts == MAX_CONTACTS) {
                    printf("通讯录已经满了,不能再添加了!\n");
                } else {
                    printf("请输入联系人的姓名、电话、地址、邮件:");
                    scanf("%s %s %s %s", contacts[num_contacts].name, 
                          contacts[num_contacts].phone, contacts[num_contacts].address,
                          contacts[num_contacts].email);
                    num_contacts++;
                    printf("联系人添加成功!\n");
                }
                break;
            case 2:
                if (num_contacts == 0) {
                    printf("通讯录为空!\n");
                } else {
                    printf("姓名\t\t电话\t\t地址\t\t邮件\n");
                    for (int i = 0; i < num_contacts; i++) {
                        printf("%s\t\t%s\t%s\t\t%s\n", contacts[i].name,
                               contacts[i].phone, contacts[i].address,
                               contacts[i].email);
                    }
                }
                break;
            case 3:
                if (num_contacts == 0) {
                    printf("通讯录为空!\n");
                } else {
                    char remove_name[20];
                    printf("请输入要删除的联系人姓名:");
                    scanf("%s", remove_name);
                    int index = -1;
                    for (int i = 0; i < num_contacts; i++) {
                        if (strcmp(contacts[i].name, remove_name) == 0) {
                            index = i;
                            break;
                        }
                    }
                    if (index == -1) {
                        printf("未找到该联系人!\n");
                    } else {
                        for (int i = index; i < num_contacts - 1; i++) {
                            contacts[i] = contacts[i + 1];
                        }
                        num_contacts--;
                        printf("联系人删除成功!\n");
                    }
                }
                break;
            case 4:
                printf("程序已退出!\n");
                break;
            default:
                printf("无效的选项!\n");
                break;
        }
    } while (choice != 4);

    return 0;
}

3. 实现通讯录的高级功能

通讯录还可以实现一些高级功能,比如查找联系人、修改联系人信息等。下面是一个示例程序,它实现了查找联系人、修改联系人信息、按照姓名排序的功能:

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

#define MAX_CONTACTS 100  // 最多存储100个联系人

struct Contact {
    char name[20];
    char phone[20];
    char address[50];
    char email[30];
} contacts[MAX_CONTACTS];  // 声明一个含有MAX_CONTACTS个联系人的数组

int num_contacts = 0;  // 当前通讯录中联系人的个数

// 查找联系人
int find_contact(const char* name) {
    for (int i = 0; i < num_contacts; i++) {
        if (strcmp(contacts[i].name, name) == 0) {
            return i;
        }
    }
    return -1;
}

// 修改联系人信息
void modify_contact(const char* name) {
    int index = find_contact(name);
    if (index == -1) {
        printf("未找到该联系人!\n");
    } else {
        printf("请输入该联系人的电话、地址、邮件:");
        scanf("%s %s %s", contacts[index].phone, contacts[index].address, 
              contacts[index].email);
        printf("联系人信息修改成功!\n");
    }
}

// 按照姓名排序
void sort_contacts() {
    struct Contact temp;
    for (int i = 0; i < num_contacts - 1; i++) {
        for (int j = i + 1; j < num_contacts; j++) {
            if (strcmp(contacts[i].name, contacts[j].name) > 0) {
                temp = contacts[i];
                contacts[i] = contacts[j];
                contacts[j] = temp;
            }
        }
    }
    printf("通讯录已按照姓名排序!\n");
}

int main()
{
    int choice;
    do {
        printf("\n通讯录\n");
        printf("1. 添加联系人\n");
        printf("2. 显示联系人\n");
        printf("3. 查找联系人\n");
        printf("4. 修改联系人信息\n");
        printf("5. 按照姓名排序\n");
        printf("6. 删除联系人\n");
        printf("7. 退出\n");
        printf("请选择:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                if (num_contacts == MAX_CONTACTS) {
                    printf("通讯录已经满了,不能再添加了!\n");
                } else {
                    printf("请输入联系人的姓名、电话、地址、邮件:");
                    scanf("%s %s %s %s", contacts[num_contacts].name, 
                          contacts[num_contacts].phone, contacts[num_contacts].address,
                          contacts[num_contacts].email);
                    num_contacts++;
                    printf("联系人添加成功!\n");
                }
                break;
            case 2:
                if (num_contacts == 0) {
                    printf("通讯录为空!\n");
                } else {
                    printf("姓名\t\t电话\t\t地址\t\t邮件\n");
                    for (int i = 0; i < num_contacts; i++) {
                        printf("%s\t\t%s\t%s\t\t%s\n", contacts[i].name,
                               contacts[i].phone, contacts[i].address,
                               contacts[i].email);
                    }
                }
                break;
            case 3: {
                char name[20];
                printf("请输入要查找的联系人姓名:");
                scanf("%s", name);
                int index = find_contact(name);
                if (index == -1) {
                    printf("未找到该联系人!\n");
                } else {
                    printf("姓名\t\t电话\t\t地址\t\t邮件\n");
                    printf("%s\t\t%s\t%s\t\t%s\n", contacts[index].name,
                           contacts[index].phone, contacts[index].address, 
                           contacts[index].email);
                }
                break;
            }
            case 4: {
                char name[20];
                printf("请输入要修改信息的联系人姓名:");
                scanf("%s", name);
                modify_contact(name);
                break;
            }
            case 5:
                sort_contacts();
                break;
            case 6:
                if (num_contacts == 0) {
                    printf("通讯录为空!\n");
                } else {
                    char remove_name[20];
                    printf("请输入要删除的联系人姓名:");
                    scanf("%s", remove_name);
                    int index = find_contact(remove_name);
                    if (index == -1) {
                        printf("未找到该联系人!\n");
                    } else {
                        for (int i = index; i < num_contacts - 1; i++) {
                            contacts[i] = contacts[i + 1];
                        }
                        num_contacts--;
                        printf("联系人删除成功!\n");
                    }
                }
                break;
            case 7:
                printf("程序已退出!\n");
                break;
            default:
                printf("无效的选项!\n");
                break;
        }
    } while (choice != 7);

    return 0;
}

以上就是使用C语言结构体实现简单通讯录的攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言使用结构体实现简单通讯录 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 用html制作日历表

    用HTML制作日历表 HTML是一种非常流行的网页制作语言,除了可以编写网页的文本内容,还可以利用HTML标签来设计网页结构、排版和样式。其中,制作日历表是一个非常有趣的HTML项目,不仅可以丰富网页的内容,也可以提高网页设计的能力。 制作一个简单的日历表 首先,我们来看一下如何利用HTML标签制作一个简单的日历表。 示例代码如下: <table&gt…

    其他 2023年3月28日
    00
  • 电脑主机启动不了怎么办 按了开机按钮无反应解决方法

    电脑主机启动不了怎么办-按了开机按钮无反应 当我们按下电脑开机按钮后,主机没有反应,没有任何动静,这时候该怎么办呢? 检查电源线 首先我们需要检查的是电源线是否正常连接到了主机,有时候电源线可能会松动,导致电源无法正常供电。此时需要将电源线重新插拔一遍,确保连接良好。 检查电源开关 如果电源线连接正常,还是无法启动,可能是电源开关出现问题。我们可以先尝试使用…

    other 2023年6月27日
    00
  • CEF C++调用前端js方法展示传递过来的图片数据

    CEF(Chromium Embedded Framework)是一种基于Chromium的嵌入式浏览器框架,它可以将Web技术嵌入到本地应用程序中。在使用CEF时,我们可以通过C++调用前端JavaScript方法,实现数据的传递和展示。本文将为您提供一份完整攻略,包括CEF C++调用前端JavaScript方法的基本原理、使用方法、示例说明等。 CEF…

    other 2023年5月5日
    00
  • PHP实现批量修改文件名的方法示例

    下面我将为您详细讲解一下“PHP实现批量修改文件名的方法示例”的完整攻略。 1. 确定需求 首先,我们需要明确修改文件名的具体需求,比如说是将多个文件名中的某些字符替换成其他字符,还是给文件名添加一些前缀或后缀等等。只有明确了需求,才能对应选择合适的方案来进行实现。 比如说,我们现在需要将一个文件夹中所有的JPG格式的图片,统一修改为PNG格式的图片,并在文…

    other 2023年6月26日
    00
  • 惠普envy13值得买吗?2017新惠普ENVY 13-AD023TU全面深度评测图解

    很抱歉,作为一个文本模型,我无法提供图解。但是,我可以为您提供一份详细的文字评测攻略。以下是关于2017年新惠普ENVY 13-AD023TU的全面深度评测攻略: 惠普ENVY 13-AD023TU全面深度评测 外观设计 惠普ENVY 13-AD023TU采用金属机身设计,外观简洁大方。机身轻薄便携,厚度仅为15.9mm,重量约为1.38kg,非常适合携带。…

    other 2023年10月16日
    00
  • Phpstudy2018 集成环境配置虚拟域名访问到Index Of 下

    Phpstudy2018 集成环境配置虚拟域名访问到Index Of 下 介绍 PHPStudy是一个Windows环境下的PHP开发环境。它包含了最新的PHP和MySQL,可以满足开发者的需求。在这篇文章中,我们将介绍如何使用PHPStudy2018配置虚拟域名,以便在本地环境下访问到Index Of。 配置虚拟域名 找到PHPStudy2018的安装目录…

    其他 2023年3月28日
    00
  • presto的动态化应用(一):presto节点的横向扩展与伸缩

    Presto的动态化应用(一): Presto节点的横向扩展与伸缩的完整攻略 本文将为您详细讲解如何使用Presto进行节点的横向扩展与伸缩,包括Presto的概念、横向扩展与伸缩的步骤、常见问题及解决方法等内容。 Presto的概念 Presto是一款分布式SQL查询引擎,可以在大规模数据集上进行高速查询。Presto的核心思想是将查询分解成多个任务,然后…

    other 2023年5月6日
    00
  • WPF基础——Application

    WPF基础——Application 概述 WPF(Application)是一个Windows Presentation Foundation应用程序,它是WPF应用程序的起点。本文将讨论WPF(Application)的基础知识。 创建一个WPF(Application) 要创建一个WPF(Application),可以使用Visual Studio创建…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部