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日

相关文章

  • 电脑应用程序图标和用户名怎么改?

    要改变电脑应用程序图标和用户名,需要在操作系统中进行设置。下面是完整攻略: 改变应用程序图标 找到想要改变图标的应用程序,右键点击图标,选择“属性”(或“信息”)选项; 在弹出的属性窗口中,点击“快捷方式”选项卡; 点击“更改图标”按钮; 在弹出的“更改图标”窗口中,选择想要使用的图标或浏览到其他图标文件,并点击“确定”; 如果要还原原来的图标,可以重复步骤…

    other 2023年6月25日
    00
  • mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题

    这个问题涉及到了 Mybatis 的动态 SQL,可以使用 Mybatis 提供的标签进行动态生成 SQL 语句实现。 下面是一个示例的 mapper.xml 文件,用于实现动态插入用户操作: <!–使用了 Mybatis 的动态 SQL 标签 if、foreach–> <insert id="batchInsert&quot…

    other 2023年6月26日
    00
  • 详解Go module的介绍及使用

    详解Go module的介绍及使用 Go module是Go语言1.11版本引入的一种包管理机制,用于解决Go语言项目中的依赖管理问题。它可以帮助开发者更好地管理项目的依赖关系,并提供了一种简单、可靠的方式来构建和发布可复用的代码。 什么是Go module Go module是一种用于管理Go语言项目依赖关系的工具。它通过在项目根目录下创建一个go.mod…

    other 2023年8月3日
    00
  • Day01_JAVA语言基础第一天

    Day01_JAVA语言基础第一天 背景介绍 Java是一种广泛使用的编程语言,具有跨平台、面向对象、安全稳定等特性,被广泛应用于各种场景中,如Web开发、移动应用开发、大数据处理等。Java语言基础是学习Java编程的必要前置知识,本文将介绍Java语言基础的第一天内容。 学习目标 本文将介绍Java语言基础的第一天内容,包括: 编程语言简介 注释 数据类…

    其他 2023年3月28日
    00
  • SIFT提取特征

    SIFT(Scale-Invariant Feature Transform)是一种用于图像特征提取的算法,可以在不同尺度和旋转角度下提取出稳定的特征点。以下是“SIFT提取特征的完整攻略”的详细介绍: SIFT算法的基本原理 SIFT算法的基本原理如下: 尺度空间极值检测:通过高斯差分金字塔来检测图像中的极值点,这些点是图像中的关键点。 关键点定位:通过对…

    other 2023年5月5日
    00
  • flash变量怎么重复赋值?

    当我们需要在程序中重复使用某个变量时,可以使用Flash变量。Flash变量是一种特殊类型的变量,它的值在多个函数之间保持不变。下面是使用Flash变量重复赋值的完整攻略: 首先,我们需要在程序中定义一个Flash变量。在Arduino编程中,可以使用const关键字将变量声明为Flash变量。例如,我们可以定义一个Flash变量const int ledP…

    other 2023年8月15日
    00
  • 公开个Nday(图)

    “公开个Nday” 是一种安全研究人员使用的策略,目的是披露漏洞细节并且向厂商提供时间限制内修复的机会。以下是一个完整的“公开个Nday”的攻略。 步骤一:发现漏洞 首先,需要通过各种技术手段来寻找漏洞,例如静态分析、数据流分析、模糊测试、代码审计等。一旦发现漏洞,需要尽可能详细地记录其细节,包括漏洞类型、漏洞触发条件、漏洞危害等。 步骤二:验证漏洞 在公开…

    other 2023年6月26日
    00
  • 【unity入门】碰撞检测与触发检测

    【Unity入门】碰撞检测与触发检测 在Unity开发游戏过程中,经常需要对游戏对象之间的碰撞进行检测。碰撞检测可以实现游戏的物理效果,例如实现物体相互碰撞弹开、人物受伤等效果。而触发检测则对碰撞检测实现了进一步的扩展,允许程序员自定义事件的响应。 碰撞检测 Unity提供了各种方式的碰撞检测,可以选择根据需求灵活使用。 碰撞检测器 在Unity中为物体添加…

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