学生管理系统(循序表实现--实训1)

/*
一、实验目的与要求
1、掌握函数、指针、结构体
2、掌握线性表的顺序存储结构
3、熟悉对线形表的一些基本操作和具体的函数定义。

二、实验内容
定义一个包含学生信息(学号,姓名,成绩)的的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号、姓名和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。


*/

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

#define MAX 100  // 最多存100个学生

// 学生结构体
typedef struct {
    int id;           // 学号
    char name[50];    // 姓名
    float score;      // 成绩
} Student;

// 顺序表结构
typedef struct {
    Student data[MAX];
    int length;       // 当前学生数量
} StudentList;

// 初始化
void initList(StudentList* list) {
    list->length = 0;
}

// (1) 批量输入学生信息
void addStudents(StudentList* list) {
    int n;
    printf("请输入学生数量: ");
    scanf("%d", &n);

    if (n <= 0 || n > MAX) {
        printf("数量不合法!\n");
        return;
    }

    for (int i = 0; i < n; i++) {
        printf("第%d个学生:\n", i + 1);
        printf("  学号: ");  scanf("%d", &list->data[i].id);
        printf("  姓名: ");  scanf("%s", list->data[i].name);
        printf("  成绩: ");  scanf("%f", &list->data[i].score);
    }
    list->length = n;
    printf("成功录入%d个学生!\n", n);
}

// (2) 显示所有学生信息
void showAll(StudentList* list) {
    if (list->length == 0) {
        printf("暂无学生信息!\n");
        return;
    }
    printf("\n学号\t姓名\t成绩\n");
    for (int i = 0; i < list->length; i++) {
        printf("%d\t%s\t%.2f\n", list->data[i].id, list->data[i].name, list->data[i].score);
    }
}

// (3) 按姓名查找学生
void findByName(StudentList* list) {
    char name[50];
    printf("请输入姓名: ");
    scanf("%s", name);

    for (int i = 0; i < list->length; i++) {
        if (strcmp(list->data[i].name, name) == 0) {
            printf("找到学生: 学号=%d, 姓名=%s, 成绩=%.2f\n",
                list->data[i].id, list->data[i].name, list->data[i].score);
            return;
        }
    }
    printf("未找到该学生!\n");
}

// (4) 按位置查找学生
void findByPosition(StudentList* list) {
    int pos;
    printf("请输入位置(1-%d): ", list->length);
    scanf("%d", &pos);

    if (pos < 1 || pos > list->length) {
        printf("位置不合法!\n");
        return;
    }

    Student s = list->data[pos - 1];
    printf("学号=%d, 姓名=%s, 成绩=%.2f\n", s.id, s.name, s.score);
}

// (5) 插入学生
void insertStudent(StudentList* list) {
    if (list->length >= MAX) {
        printf("表已满!\n");
        return;
    }

    int pos;
    printf("请输入插入位置(1-%d): ", list->length + 1);
    scanf("%d", &pos);

    if (pos < 1 || pos > list->length + 1) {
        printf("位置不合法!\n");
        return;
    }

    // 元素后移
    for (int i = list->length; i >= pos; i--) {
        list->data[i] = list->data[i - 1];
    }

    // 输入新学生
    printf("请输入新学生信息:\n");
    printf("  学号: ");  scanf("%d", &list->data[pos - 1].id);
    printf("  姓名: ");  scanf("%s", list->data[pos - 1].name);
    printf("  成绩: ");  scanf("%f", &list->data[pos - 1].score);

    list->length++;
    printf("插入成功!\n");
}

// (6) 删除学生
void deleteStudent(StudentList* list) {
    int pos;
    printf("请输入要删除的位置(1-%d): ", list->length);
    scanf("%d", &pos);

    if (pos < 1 || pos > list->length) {
        printf("位置不合法!\n");
        return;
    }

    for (int i = pos - 1; i < list->length - 1; i++) {
        list->data[i] = list->data[i + 1];
    }

    list->length--;
    printf("删除成功!\n");
}

// (7) 统计学生数量
void countStudents(StudentList* list) {
    printf("当前学生总数:%d\n", list->length);
}

// 主函数
int main() {
    StudentList list;
    initList(&list);

    int choice;
    while (1) {
        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("8. 退出\n");
        printf("请选择(1-8): ");
        scanf("%d", &choice);

        switch (choice) {
        case 1: addStudents(&list); break;
        case 2: showAll(&list); break;
        case 3: findByName(&list); break;
        case 4: findByPosition(&list); break;
        case 5: insertStudent(&list); break;
        case 6: deleteStudent(&list); break;
        case 7: countStudents(&list); break;
        case 8: printf("程序结束,再见!\n"); return 0;
        default: printf("无效选择,请重新输入!\n");
        }
    }
}

效果图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值