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日

相关文章

  • android中的常用尺寸单位(dp、sp)快速入门教程

    以下是关于“Android中的常用尺寸单位(dp、sp)快速入门教程”的完整攻略,包括基本概念、使用方法和两个示例。 基本概念 在Android中常用的尺寸单位有dp和sp。dp是density-independent pixel(密度无关像素)的缩写,它是一种基于屏幕密度的抽象单位,可以保证在不同的屏幕密度下,UI元素的大小和位置保持一致。sp是scale…

    other 2023年5月7日
    00
  • UNIX 系统常用管理命令

    以下是UNIX系统常用管理命令的攻略及示例说明: 目录和文件管理命令 ls命令 ls命令是Unix中最常用的命令之一,用于列出目录内容。当我们在一个目录中执行ls命令时,它将会显示该目录下的所有文件和目录的名称。 ls命令的常用参数: -l: 以长格式列出目录内容,包括文件类型、权限、硬链接数、所有者、所属组、文件大小、时间戳等信息。 -a: 列出目录中所有…

    other 2023年6月26日
    00
  • IDEA设置JVM可分配内存大小和其他参数的教程

    下面是详细的攻略: 1. 打开IDEA的配置页面 首先,我们需要打开IDEA的配置页面。在主窗口中,点击顶部菜单栏中的 “File” 菜单,然后选择 “Settings”。如果你使用的是Mac系统,可以选择 “Preferences” 而不是 “Settings”。 2. 配置JVM的参数 在设置页面中,找到 “Build, Execution, Deplo…

    other 2023年6月27日
    00
  • 如何利用Vue3管理系统实现动态路由和动态侧边菜单栏

    下面是详细讲解如何利用Vue3管理系统实现动态路由和动态侧边菜单栏的攻略。 步骤一:安装依赖 首先,我们需要安装vue-router和vuex作为项目的基础依赖: npm install vue-router vuex –save 步骤二:配置路由 在src/router/index.js中,我们需要配置路由。在这个例子中,我们使用动态路由配置来处理菜单栏…

    other 2023年6月27日
    00
  • rsync命令

    以下是“rsync命令”的完整攻略: rsync命令 rsync是一种常用的文件同步工具,可以在本地或远程主机之间同步文件和目录。rsync支持增量备份,可以快速同步大量数据,同时还可以通过SSH等安全协议进行加密传输。本攻略将详细讲解rsync命令的使用方法,包括基本用法、常用选项和示例说明等。 基本用法 rsync命令的基本用法如下: rsync [OP…

    other 2023年5月8日
    00
  • python实现跨文件全局变量的方法

    Python实现跨文件全局变量的方法 在Python中,要实现跨文件的全局变量,可以使用以下方法: 方法一:使用模块 创建一个专门用于存放全局变量的模块,例如globals.py。 在globals.py中定义全局变量,例如: # globals.py global_var = 10 在其他文件中,通过导入globals.py模块来使用全局变量,例如: # …

    other 2023年7月29日
    00
  • 访问编码后的中文URL返回404错误的解决方法

    当我们访问编码后的中文URL时,有时会遇到404错误的情况,这是由于服务器未对编码后的URL进行解码导致的。解决这种问题的方法是对URL进行解码,使其转换回中文字符。 下面是解决“访问编码后的中文URL返回404错误的解决方法”的完整攻略: 步骤一:确认是否是URL编码问题 访问编码后的URL时,如果出现404错误,可以先确认是否是URL编码的问题。可以通过…

    other 2023年6月26日
    00
  • 详解C语言中的memset()函数

    详解C语言中的memset()函数 简介 memset()函数是C语言中的一个字符串操作函数,它用于将一段内存空间中的每个字节全部置为特定的值。 该函数的原型为: void* memset(void* ptr, int value, size_t num); 函数参数说明: ptr: 指向要填充的内存块的指针; value: 要填充的值,通常是整数类型,但它…

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