27-结构体相关练习——招生系统

27-结构体相关练习——招生系统

练习要求:
在这里插入图片描述

一、实现

结构体的使用解析

在你的代码中,struct Student 结构体用于存储学生的信息,包括姓名、性别、年龄、技能和ID。以下是对代码中结构体使用的详细解析:

1. 定义结构体

struct Student {
    char name[50];
    char gender[50];
    int age;
    char skills[50];
    int id;
};

这个定义创建了一个 Student 结构体类型,包含五个成员:

  • name:字符数组,用于存储学生的名字,最大长度为50个字符。
  • gender:字符数组,用于存储学生的性别,最大长度为50个字符。
  • age:整数,用于存储学生的年龄。
  • skills:字符数组,用于存储学生的技能,最大长度为50个字符。
  • id:整数,用于存储学生的ID。
2. 添加学生信息函数
void addStudent(struct Student *students, int *count)
{
    if (*count >= 100) {
        printf("不能再添加新的学员信息了,再添加则会越界,你可以选择更改相关信息或者删除一些表中的学员信息!\n");
        return;
    }

    struct Student newStudent;
    printf("请你输入新的学员的名字:\n");
    scanf("%s", newStudent.name);
    printf("请你输入新的学员的性别:\n");
    scanf("%s", newStudent.gender);
    printf("请你输入新的学员的年龄:\n");
    scanf("%d", &newStudent.age);
    printf("请你输入新的学员想要学习的技能:\n");
    scanf("%s", newStudent.skills);
    printf("请你输入新的学员的ID: \n");
    scanf("%d", &newStudent.id);

    students[*count] = newStudent;
    (*count)++;
}

该函数用于向学生数组中添加新的学生信息:

  • students 是指向 Student 结构体数组的指针。
  • count 是一个指向当前学生数目的指针。
  • 检查是否超出数组最大容量(100)。
  • 使用 scanf 函数从用户输入中获取新学生的信息,并将其存储在一个临时 Student 结构体中。
  • 将新的 Student 结构体赋值给 students 数组中的当前下标位置,然后递增 count
3. 显示学生信息函数
void ShowStudent(struct Student *student, int count)
{
    for (int i = 0; i < count; i++) {
        printf("--------现在显示第%d个学员的信息--------------\n", i + 1);
        printf("第%d个学员的姓名: %s\n", i + 1, student[i].name);
        printf("第%d个学员的性别: %s\n", i + 1, student[i].gender);
        printf("第%d个学员的年龄: %d\n", i + 1, student[i].age);
        printf("第%d个学员的ID: %d\n", i + 1, student[i].id);
        printf("第%d个学员想学习的技能: %s\n", i + 1, student[i].skills);
    }
}

该函数用于显示所有学生的信息:

  • student 是指向 Student 结构体数组的指针。
  • count 是当前学生的数量。
  • 通过遍历 students 数组,逐个打印每个学生的信息。
4. 修改学生信息函数
void EditStudent(struct Student *students, int count)
{
    printf("请输入你需要修改的学员的编号:");
    int ID;
    int i;
    int found = 0;
    scanf("%d", &ID);

    for (i = 0; i < count; i++) {
        if (students[i].id == ID) {
            found = 1;
            break;
        }
    }

    if (found) {
        struct Student newStudent = students[i];
        while (1) {
            printf("请输入需要修改的内容的编号\n");
            printf("1. 修改编号为%d的学员的姓名\n", ID);
            printf("2. 修改编号为%d的学员的性别\n", ID);
            printf("3. 修改编号为%d的学员的年龄\n", ID);
            printf("4. 修改编号为%d的学员想要学习的技能\n", ID);
            printf("5. 修改编号为%d的学员的编号(ID)\n", ID);
            printf("6. 退出并保存\n");
            printf("7. 退出不保存\n");
            int choice;
            scanf("%d", &choice);

            switch (choice) {
                case 1:
                    printf("修改该学员的姓名为: ");
                    scanf("%s", newStudent.name);
                    break;
                case 2:
                    printf("修改该学员的性别为: ");
                    scanf("%s", newStudent.gender);
                    break;
                case 3:
                    printf("修改该学员的年龄为: ");
                    scanf("%d", &newStudent.age);
                    break;
                case 4:
                    printf("修改该学员想要学习的技能为: ");
                    scanf("%s", newStudent.skills);
                    break;
                case 5:
                    printf("修改该学员的ID为: ");
                    scanf("%d", &newStudent.id);
                    break;
                case 6:
                    students[i] = newStudent;
                    printf("学员信息已更新。\n");
                    return;
                case 7:
                    printf("不保存修改,退出。\n");
                    return;
                default:
                    printf("无效选择,请重新输入。\n");
                    break;
            }
        }
    } else {
        printf("未找到编号为%d的学员。\n", ID);
    }
}

该函数用于修改指定ID学生的信息:

  • 获取需要修改的学生ID并检查其是否存在。
  • 如果存在,复制当前学生信息到一个临时 Student 结构体。
  • 使用循环和 switch 语句,根据用户的选择修改相应的信息。
  • 提供保存和不保存修改的选项。
5. 删除学生信息函数
void DeleteStudent(struct Student *students, int *count)
{
    printf("请输入你想删除学员信息的编号(ID): ");
    int ID;
    int i;
    int found = 0;
    scanf("%d", &ID);

    for (i = 0; i < *count; i++) {
        if (students[i].id == ID) {
            found = 1;
            break;
        }
    }

    if (found) {
        for (int j = i; j < *count - 1; j++) {
            students[j] = students[j + 1];
        }
        (*count)--;
        printf("编号为%d的学员信息已删除。\n", ID);
    } else {
        printf("未找到编号为%d的学员。\n", ID);
    }
}

该函数用于删除指定ID的学生信息:

  • 获取需要删除的学生ID并检查其是否存在。
  • 如果存在,通过移动数组中的元素来删除指定的学生。
  • 减少学生计数。

其他注意事项

  1. 字符数组溢出scanf函数在读取字符串时,如果输入长度超过数组长度会导致缓冲区溢出。为了防止这种情况,可以使用%49s来限制输入长度。例如:scanf("%49s", newStudent.name);

  2. 控制台编码:确保你的控制台编码设置为UTF-8,尤其是在Windows上运行时,可以在命令提示符中使用chcp 65001设置控制台编码。

  3. 输入验证:在实际应用中,应该对用户输入进行验证,例如确保年龄和ID是有效的整数,性别和技能输入不超过最大长度等。

  4. 文件操作:如果需要保存学生信息,可以将学生数据存储到文件中,并在程序启动时读取文件数据。

  5. 内存管理:目前代码中使用了静态数组,如果需要处理大量学生信息,考虑使用动态分配内存。

二、完整代码实现

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

struct Student
{
    char name[50];
    char gender[50];
    int age;
    char skills[50];
    int id;
};

//*******添加学员信息************************/
void addStudent(struct Student *students, int *count)
{
    // 检查数组是否越界
    if (*count >= 100)
    {
        printf("不能再添加新的学员信息了,再添加则会越界,你可以选择更改相关信息或者删除一些表中的学员信息!\n");
        return;
    }
    struct Student newStudent; // 临时创建一个新的结构体

    printf("请你输入新的学员的名字:\n");
    scanf("%s", newStudent.name);
    printf("请你输入新的学员的性别:\n");
    scanf("%s", newStudent.gender);
    printf("请你输入新的学员的年龄:\n");
    scanf("%d", &newStudent.age);
    printf("请你输入新的学员想要学习的技能:\n");
    scanf("%s", newStudent.skills);
    printf("请你输入新的学员的ID: \n");
    scanf("%d", &newStudent.id);

    students[*count] = newStudent; // 将临时的结构体中的数据给原来的结构体
    (*count)++;                    // 结构体的下标位置++
}

/**
 * @description: 显示学员信息函数
 * @param {struct Student *} student
 * @param {int} count
 */
void ShowStudent(struct Student *student, int count)
{
    for (int i = 0; i < count; i++)
    {
        printf("--------现在显示第%d个学员的信息--------------\n", i + 1);
        printf("第%d个学员的姓名: %s\n", i + 1, student[i].name);
        printf("第%d个学员的性别: %s\n", i + 1, student[i].gender);
        printf("第%d个学员的年龄: %d\n", i + 1, student[i].age);
        printf("第%d个学员的ID: %d\n", i + 1, student[i].id);
        printf("第%d个学员想学习的技能: %s\n", i + 1, student[i].skills);
    }
}

/**
 * @description: 修改学员信息函数
 * @param {struct Student *} students
 * @param {int} count
 */
void EditStudent(struct Student *students, int count)
{
    printf("请输入你需要修改的学员的编号:");
    int ID;
    int i;       // 记录下标
    int found = 0; // 检查编号是否存在
    scanf("%d", &ID); // 接收修改学员编号

    // 检查是否存在该编号的学员
    for (i = 0; i < count; i++)
    {
        if (students[i].id == ID)
        {
            found = 1; // 检查通过
            break;
        }
    }

    if (found)
    {
        struct Student newStudent = students[i]; // 复制当前学生信息

        while (1)
        {
            printf("请输入需要修改的内容的编号\n");
            printf("1. 修改编号为%d的学员的姓名\n", ID);
            printf("2. 修改编号为%d的学员的性别\n", ID);
            printf("3. 修改编号为%d的学员的年龄\n", ID);
            printf("4. 修改编号为%d的学员想要学习的技能\n", ID);
            printf("5. 修改编号为%d的学员的编号(ID)\n", ID);
            printf("6. 退出并保存\n");
            printf("7. 退出不保存\n");
            int choice;
            scanf("%d", &choice);

            switch (choice)
            {
            case 1:
                printf("修改该学员的姓名为: ");
                scanf("%s", newStudent.name);
                break;
            case 2:
                printf("修改该学员的性别为: ");
                scanf("%s", newStudent.gender);
                break;
            case 3:
                printf("修改该学员的年龄为: ");
                scanf("%d", &newStudent.age);
                break;
            case 4:
                printf("修改该学员想要学习的技能为: ");
                scanf("%s", newStudent.skills);
                break;
            case 5:
                printf("修改该学员的ID为: ");
                scanf("%d", &newStudent.id);
                break;
            case 6:
                students[i] = newStudent; // 更新学生信息
                printf("学员信息已更新。\n");
                return;
            case 7:
                printf("不保存修改,退出。\n");
                return;
            default:
                printf("无效选择,请重新输入。\n");
                break;
            }
        }
    }
    else
    {
        printf("未找到编号为%d的学员。\n", ID);
    }
}

/**
 * @description: 根据编号删除学员信息
 * @param {Student} *students
 * @param {int} *count
 */
void DeleteStudent(struct Student *students, int *count)
{
    printf("请输入你想删除学员信息的编号(ID): ");
    int ID;
    int i;       // 记录下标
    int found = 0; // 检查编号是否存在
    scanf("%d", &ID);

    // 检查是否存在该编号的学员
    for (i = 0; i < *count; i++)
    {
        if (students[i].id == ID)
        {
            found = 1; // 检查通过
            break;
        }
    }

    if (found)
    {
        for (int j = i; j < *count - 1; j++)
        {
            students[j] = students[j + 1]; // 移动数组后面的内容
        }
        (*count)--; // 减少学生人数
        printf("编号为%d的学员信息已删除。\n", ID);
    }
    else
    {
        printf("未找到编号为%d的学员。\n", ID);
    }
}

int main()
{
    struct Student students[100]; // 实例化
    int count = 0; // 结构体数组中当前下标
    short choice;
    printf("=========欢迎来到马保国招生系统===========\n");
    do
    {
        printf("请输入你想进行的操作的序号\n");
        printf("1. 信息登记(添加学员)\n");
        printf("2. 显示学员信息\n");
        printf("3. 修改学员信息\n");
        printf("4. 删除学员信息\n");
        printf("5. 退出系统\n");
        scanf("%hd", &choice);
        switch (choice)
        {
        case 1: // 添加学员
            addStudent(students, &count);
            break;
        case 2: // 显示学员信息
            ShowStudent(students, count);
            break;
        case 3: // 修改学员信息
            EditStudent(students, count);
            break;
        case 4: // 删除学员信息
            DeleteStudent(students, &count);
            break;
        case 5: // 退出系统
            printf("正在退出系统...\n");
            return 0;
        default:
            printf("无效选择,请重新输入。\n");
            break;
        }
    } while (1);
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写的什么石山代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值