【C语言】作业10 学生管理系统(2)(分文件编译,班级创建在堆区 malloc申请)

和上一篇几乎没差,学习了顺序表,简单实现了按位置增添学生信息和删除学生信息

1、完成学生信息管理系统
要求:定义一个班级,包括多个学生,以及记录实际学生的个数

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

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

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

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

5> 完成信息的输出工作

6> 完成班级的销毁工作

7>按位置插入学生

8>按位置删除学生

//main.c
#include"student.h"

int main(int argc, char const *argv[])
{
    int n = 0;
    int size = 0;
    Stu newstudent;
    int pos = 0;
    printf("请输入班级人数:");
    scanf("%d",&size);

    Class *class = createClass(size);
    while(1)
    {
        print_menu();
        printf("请输入需要实现的功能:");
        scanf("%d", &n);
        getchar();
        
        switch (n)
        {
        case 1:
            input_Student(class);
            break;
        
        case 2:
            jiangxu(class);
            outputall_Student(class);
            break;

        case 3:
            max_min_Student(class);
            break;

        case 4:
            outputall_Student(class);
            break;

        case 5:
            xiaohui(&class);
            break;
        
        case 6:
            pos = 0;
            printf("请输入学生姓名:");
            scanf("%s",newstudent.name);
            printf("请输入学生年龄:");
            scanf("%d",&newstudent.age);
            printf("请输入学生成绩:");
            scanf("%lf",&newstudent.score);
            printf("请输入你想插入的位置:");
            scanf("%d",&pos);
            insert_pos_Student(class,pos,newstudent);
            break;
        
        case 7:
            pos = 0;
            printf("请输入你需要删除的学生位置:");
            scanf("%d",&pos);
            delete_pos_Student(class,pos);
            break;
        case 0:
        goto END;

        default:
            break;
        }
    }
    END:
    return 0;
}

//hanshu.c
#include"student.h"

void print_menu()
{
    printf("\t\t======1.录入学生信息======================\n");
    printf("\t\t======2.按成绩降序========================\n");
    printf("\t\t======3.输出成绩最高和最低的学生信息======\n");
    printf("\t\t======4.输出所有学生信息==================\n");
    printf("\t\t======5.销毁班级==========================\n");
    printf("\t\t======6.插入学生==========================\n");
    printf("\t\t======7.删除学生==========================\n");
    printf("\t\t======0.退出==============================\n");
}

//创建班级
Class *createClass(int size)
{
    if(size > MAX)
    {
        printf("班级人数超过最大容量\n\n");
        return NULL;
    }

    Class *class = (Class *)malloc(sizeof(Class));
    if(class == NULL)
    {
        printf("空间申请失败\n\n");
        return NULL;
    }

    class -> size = size;
    return class;
}

//1.录入学生信息
void input_Student(Class *class)
{
    for(int i = 0;i < class->size;i++)
    {
        printf("请输入第%d个学生的姓名:", i + 1);
        scanf("%s", class->student[i].name);
        printf("请输入第%d个学生的年龄:", i + 1);
        scanf("%d", &class->student[i].age);
        printf("请输入第%d个学生的成绩:", i + 1);
        scanf("%lf", &class->student[i].score);
        printf("\n");
    }
}

//2.按成绩降序
void jiangxu(Class *class)
{
    for(int i = 1;i < class->size;i++)
    {
        for(int j = 0;j < class->size - i;j++)
        {
            if(class->student[j].score < class->student[j+1].score)
            {
                Stu temp = class->student[j];
                class->student[j] = class->student[j+1];
                class->student[j+1] = temp;
            }
        }
    }
}

//3.输出成绩最高和最低的学生信息
void max_min_Student(Class *class)
{
    Stu max = class->student[0];
    Stu min = class->student[0];
    for(int i = 0;i < class->size;i++)
    {
        if(max.score < class->student[i].score)
        {
            max = class->student[i];
        }
        if(min.score > class->student[i].score)
        {
            min = class->student[i];
        }
    }
    printf("成绩最高的学生:\n");
    printf("姓名\t年龄\t成绩\n");
    printf("%s\t%d\t%.2lf\n\n", max.name, max.age, max.score);

    printf("成绩最低的学生:\n");
    printf("姓名\t年龄\t成绩\n");
    printf("%s\t%d\t%.2lf\n\n", min.name, min.age, min.score);
}

//4.输出所有学生信息
void outputall_Student(Class *class)
{
    printf("姓名\t年龄\t成绩\n");
    for(int i = 0;i < class->size;i++)
    {
        printf("%s\t%d\t%.2lf\n",class->student[i].name,class->student[i].age,class->student[i].score);
    }
    printf("\n");
}

//5.销毁班级
void xiaohui(Class **class)
{
    if(*class != NULL)
    {
        free(*class);
        *class = NULL;
        printf("完成班级销毁工作\n\n");
    }
}

//6.插入学生
void insert_pos_Student(Class *class,int pos,Stu newstudent)
{
    if(NULL == class || pos < 0 || pos > class->size)
    {
        printf("插入失败\n");
        return ;
    }

    for(int i = class->size-1;i >= pos;i--)
    {
        class->student[i+1] = class->student[i]; 
    }

    class->student[pos] = newstudent;
    class->size++;
    printf("插入成功\n");
}


//7.按位置删除学生
void delete_pos_Student(Class *class,int pos)
{
    if(NULL == class || pos < 0 || pos > class->size)
    {
        printf("删除失败\n");
        return ;
    }
    for(int i = pos;i < class->size-1;i++)
    {
        class->student[i] = class->student[i+1]; 
    }
    class->size--;
    printf("删除成功\n");
}

//student.h
#ifndef STUDENT_H
#define STUDENT_H
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100            //最大容量
//定义学生类型
typedef struct Stu
{
    char name[20];
    int age;
    double score;
}Stu;

//定义班级类型
typedef struct Class
{
    Stu student[MAX];       //存放学生的容器
    int size;                      //实际人数
}Class;

void print_menu();
Class *createClass(int size);                   //创建班级
void input_Student(Class *class);               //1.录入学生信息
void jiangxu(Class *class);                     //2.按成绩降序
void max_min_Student(Class *class);             //3.输出成绩最高和最低的学生信息
void outputall_Student(Class *class);           //4.输出所有学生信息
void xiaohui(Class **class);                    //5.销毁班级

//6.按位置插入学生
void insert_pos_Student(Class *class,int pos,Stu newstudent);

//7.按位置删除学生
void delete_pos_Student(Class *class,int pos);
#endif

输出结果如下:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值