学生信息管理系统(堆栈、动态内存分配)————day7.17

 完成学生信息管理系统

要求:定义一个班级,包括多个学生,以及记录实际学生的个数

#define MAX 100            //最大容量
//定义学生类型
struct Stu
{
    char name[20];
    int age;
    double score;
};
//定义班级类型
struct Class
{
    struct Stu student[MAX];       //存放学生的容器
    int size;                      //实际人数
};

1> 完成班级的创建,创建时,需要传递班级实际人数

2> 完成班级学生的信息录入工作

3> 完成将班级学生按成绩进行降序排序工作

4> 输出班级中成绩最好和最差学生的信息

5> 完成信息的输出工作

6> 完成班级的销毁工作

要求:班级创建在堆区,尽量分文件编译完成

实现代码:

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

#define MAX 100

struct Stu
{
    char name[20];
    int age;
    double score;
};

struct Class
{
    struct Stu student[MAX];
    int size;
};

void caidan()
{
    printf("————————菜单——————————\n");
    printf("1.信息录入\n");
    printf("2.信息输出\n");
    printf("3.输出成绩最高和最低的学生信息\n");
    printf("4.按成绩降序排序\n");
    printf("0.退出并销毁班级信息\n");
    printf("**************************************\n");
}

//定义struct Class* 类型的函数,用来申请空间
struct Class *create()
{
    struct Class *ban = (struct Class *)malloc(sizeof(struct Class));
    if (NULL == ban)
    {
        printf("创建失败\n");
        return NULL;
    }

    //程序执行至此,表示内存申请成功
    //给内存空间进行初始化
    memset(ban, 0, sizeof(struct Class));

    //将内存地址返回
    return ban;
}

//学生信息的录入
void input(struct Class *ban)
{
    if (NULL == ban)
    {
        printf("创建失败\n");
        return;
    }
    printf("输入班级学生总人数:");
    scanf("%d", &ban->size); // 使用 & 来引用 size
    for (int i = 0; i < ban->size; i++)
    {
        printf("请输入第%d个学生的姓名:", i + 1);
        scanf("%s", ban->student[i].name);
        printf("请输入第%d个学生的年龄:", i + 1);
        scanf("%d", &ban->student[i].age);
        printf("请输入第%d个学生的成绩:", i + 1);
        scanf("%lf", &ban->student[i].score); // 使用 %lf
    }
    printf("\n");
}

//学生信息的输出
void output(struct Class ban)
{
    printf("姓名\t年龄\t成绩\n");
    for (int i = 0; i < ban.size; i++)
    {
        printf("%s\t%d\t%.2lf\n", ban.student[i].name, ban.student[i].age, ban.student[i].score);
    }
    printf("\n");
}

//按成绩进行降序排序
void paixu(struct Class ban)
{
    struct Stu small;
    small = ban.student[0];
    for (int i = 1; i < ban.size; i++)
    {
        for (int j = 0; j < ban.size - i; j++)
        {
            if (ban.student[j].score < ban.student[j + 1].score)
            {
                small = ban.student[j];
                ban.student[j] = ban.student[j + 1];
                ban.student[j + 1] = small;
            }
        }
    }
    printf("按成绩进行降序排序结果为:\n");
    output(ban);
}

//输出最好和最差
void up_down(struct Class ban)
{
    int max_index = 0, min_index = 0;
    // 求最大
    for (int i = 1; i < ban.size; i++)
    {
        if (ban.student[max_index].score < ban.student[i].score)
        {
            max_index = i;
        }
    }
    // 求最小
    for (int i = 1; i < ban.size; i++)
    {
        if (ban.student[min_index].score > ban.student[i].score)
        {
            min_index = i;
        }
    }
    printf("成绩最好的是:%s\t%d\t%.2lf\n", ban.student[max_index].name, ban.student[max_index].age, ban.student[max_index].score);
    printf("成绩最差的是:%s\t%d\t%.2lf\n", ban.student[min_index].name, ban.student[min_index].age, ban.student[min_index].score);
    printf("\n");
}

//主函数
int main(int argc, char const *argv[])
{
    int x = -1;
    caidan();
    struct Class *p = create();
    while (1)
    {
        printf("请输入你要使用的功能:");
        scanf("%d", &x);
        printf("\n");
        switch (x)
        {
        case 1:
        {
            input(p);
            break;
        }
        case 2:
        {
            output(*p);
            break;
        }
        case 3:
        {
            up_down(*p);
            break;
        }
        case 4:
        {
            paixu(*p);
            break;
        }
        case 0:
        {
            free(p);
            printf("已销毁\n");
            goto END;
        }
        }
    }
END:
    return 0;
}

 

 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值