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日

相关文章

  • AJAX中文乱码PHP中完美解决方法

    解决AJAX中文乱码的问题 在使用AJAX进行中文字符传输时,可能会遇到中文字符乱码的问题。本文将介绍使用PHP解决AJAX中文乱码问题的方法。 1. AJAX中文乱码问题分析 AJAX是一种异步数据传输的技术,其本质是通过XMLHttpRequest对象来在浏览器和服务器之间交换数据。在AJAX中,如果传输的数据中包含中文字符,则有可能出现乱码的情况。 造…

    other 2023年6月27日
    00
  • IOS封装自定义布局的方法

    iOS开发中,自定义布局可以实现更加灵活的UI界面。下面,我将详细讲解如何封装iOS自定义布局的方法。 一、定义Layout 首先,在实现自定义布局前,需要定义自己的布局类。自己的布局类需要继承于UICollectionViewLayout或UICollectionViewFlowLayout。 @interface MyLayout : UICollect…

    other 2023年6月20日
    00
  • 你好,FFMPEG 可视化

    FFMPEG 可视化的完整攻略 FFMPEG 是一款广泛使用的音视频处理工具,可以用于音视频的转码、剪辑、合并等操作。本文将为您提供一份 FFMPEG 可视化的完整攻略,包括安装、配置和使用等方面的内容,同时提供两个示例说明。 安装 FFMPEG 的安装步骤如下: 下载 FFMPEG:从官方网站下载最新版本的 FFMPEG。 安装依赖:安装 FFMPEG 的…

    other 2023年5月5日
    00
  • linux文件管理命令实例分析【权限、创建、删除、复制、移动、搜索等】

    Linux文件管理命令实例分析 在Linux系统中,文件管理是不可或缺的一部分。本文将介绍常用的文件管理命令,包括权限管理、创建、删除、复制、移动、搜索等功能。 权限管理 Linux系统中的权限管理非常重要,可以控制文件或目录的读、写、执行权限。常用的权限管理命令如下: chmod chmod命令可以修改文件或目录的权限。它可以将文件或目录的权限设置为用户、…

    other 2023年6月26日
    00
  • Android判断包名和类名是否存在的方法

    判断Android应用程序中的包名和类名是否存在有多种方法,下面举出几种常见的方法: 1.使用PackageManager类 可以使用PackageManager类来检查特定包名或类名是否存在于系统中,步骤如下: 1.在java文件中导入以下语句: import android.content.pm.PackageManager; import androi…

    other 2023年6月27日
    00
  • mysql自带4个默认数据库

    mysql自带4个默认数据库 MySQL是目前最为流行的关系型数据库管理系统之一,具有跨平台、高性能、易用等优点。使用MySQL前,我们需要了解在服务器安装MySQL时,MySQL自带4个默认的数据库,分别为:information_schema、mysql、performance_schema、sys。 information_schema 该数据库中包含…

    其他 2023年3月28日
    00
  • java数据结构关于栈的实例应用

    Java数据结构之栈的实例应用攻略 1. 栈的概述 栈是一种具有特定操作规则的线性数据结构,遵循先进后出(Last-In-First-Out,LIFO)的原则。栈的操作包括入栈(push)和出栈(pop),以及获取栈顶元素(peek)等。 2. 栈的实例应用 2.1. 括号匹配 栈在括号匹配问题中有广泛的应用。通过使用栈,我们可以检查一个字符串中的括号是否匹…

    other 2023年8月6日
    00
  • sqlexec命令用法

    以下是sqlexec命令用法的完整攻略: 1. sqlexec命令简介 sqlexec是一个命令行工具,用于在命令行中执行SQL语句。它可以连接到各种数据库,包括MySQL、Oracle、SQL Server等,并执行SQL查询、插入、更新和删除等操作。 2. sqlexec命令语法 sqlexec命令的基本语法如下: sqlexec [options] […

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部