简易的学生成绩管理系统

参考的博文

记录学完C语言巩固练手的小项目

题目

链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。

场景:一个年级,相当于链表A,

该年级有5个班,每个班有5个人,相当于链表B

做一个学生成绩管理系统,学生成绩有语文、数学、英语

功能:录入成绩找三科总分的最高分、最低分,算出平均分

基础要求

C语言函数、指针、结构体和链表

通过双链表方式实现

整体代码

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


struct Student//创建学生结构体
{
    int num;
    int chinese;
    int math;
    int english;
    double average;
    double sum;
    struct Student *next;
};

struct Class//创建班级结构体
{
    struct Student *stuhead;
    int classnum;
    struct Class *next;
};

struct Student *insertStuMessage(struct Student *head, struct Student *new)//头插法
{
    if(head == NULL){//如果头结点为空 
        head = new;
    }else{
        new->next = head;
        head = new;
    }
    return head;
}

struct Student *createStudent(struct Student *head, int stunum, int classnum)//动态创建学生链表
{
    int i;
    int num = stunum;//学生的人数
    double sum;
    double average;
    struct Student *new;
    for(i=0;i<stunum;i++){
        new = (struct Student *)malloc(sizeof(struct Student));
        printf("请输入第%d班第%d个学生的学号:\n",classnum,num);
        scanf("%d",&(new->num));
        printf("请输入第%d个学生的语文成绩:\n",num);
                scanf("%d",&(new->chinese));
        printf("请输入第%d个学生的数学成绩:\n",num);
                scanf("%d",&(new->math));
        printf("请输入第%d个学生的英语成绩:\n",num);
                scanf("%d",&(new->english));
        sum = new->chinese + new->math + new->english;
        new->sum = sum;
        average = sum/3;
        new->average = average;
        num--;
        head = insertStuMessage(head,new);
    }
    return head;
}

struct Class *insertClaMessage(struct Class *head, struct Class *new)//头插法
{
    if(head == NULL){
        head = new;
    }else{
        new->next = head;
        head = new;
    }
    return head;
}

struct Class *createClass(struct Class *head, int classnum, int stunum)//动态创建班级链表
{
    struct Class *new = NULL;
    struct Student *stuHead;    
    int num = classnum;
    int i;
    for(i=0;i<classnum;i++){
        new = (struct Class*)malloc(sizeof(struct Class));
        new->classnum = num;
        stuHead = createStudent(stuHead,stunum,num);
        new->stuhead = stuHead;
        num--;
        head = insertClaMessage(head,new);
    }
    return head;
}

void printMessage(struct Class *head, int classnum, int stunum)//打印输入的成绩
{
    struct Class *p1 = head;
    struct Student *p2 = NULL;

    int k = stunum;
    int i=0;
    while(i < classnum)
    {
        p2 = p1->stuhead;
        while(p2 != NULL && k>0){
            printf("%d班第%d个学生的学号:%d\n",p1->classnum,k,p2->num);
            printf("语文成绩为:%d\n",p2->chinese);
                        printf("数学成绩为:%d\n",p2->math);
                        printf("英语成绩为:%d\n",p2->english);
                        printf("总分成绩为:%lf\n",p2->sum);
                        printf("平均分成绩为:%lf\n",p2->average);
            p2 = p2->next;
            k--;
        }
        k = stunum;
        p1 = p1->next;
        i++;
    }
}

int getMax(struct Class *head, int classnum, int stunum)//和获取学生总分最大值
{
    struct Class *p1 = head;
    struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
    p2 = p1->stuhead;
    int i = 0;
    int j = 0;
    int max = 0;
    while(i < classnum){
        while(j < stunum*classnum){
            if(max < p2->sum){
                max = p2->sum;
            }
            p2 = p2->next;
            j++;
        }
        p1 = p1->next;
        i++;
    }
    printf("****************************\n");
    printf("最高总分为:%d\n",max);
    printf("****************************\n");
}

int getMin(struct Class *head, int classnum, int stunum)//获取学生总分最小值
{
    struct Class *p1 = head;
        struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
        
    p2 = p1->stuhead;
        int i = 0;
        int j = 0;
        int min = 10000;
        while(i < classnum){
                while(j < stunum*classnum){
                        if(min > p2->sum){
                                min = p2->sum;
                        }
                        p2 = p2->next;
                        j++;
                }
                p1 = p1->next;
                i++;
        }
        printf("****************************\n");
        printf("最低总分为:%d\n",min);
        printf("****************************\n");

}

float getAverage(struct Class *head, int classnum, int stunum)
{
    struct Class *p1 = head;
    struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
    
    int i = 0;
    int j = 0;
    double sum = 0;
    double average;
    p2 = p1->stuhead;
    while(i < classnum){

        while(j < stunum*classnum){
            sum = sum+p2->sum;
            p2 = p2->next;
            j++;
        }
        p1 = p1->next;
        i++;
    }    
    average = sum/(stunum*classnum);
    printf("***********************\n");
    printf("年级平均分为:%lf\n",average);
    printf("************************\n");
}

int main()
{
    printf("*************************\n");
    printf("欢迎来到学生成绩管理系统\n");
    printf("*************************\n");

    int a;//班级人数
    int b;//学生人数
    int max;
    struct Class *head;
    printf("请输入有几个班级:\n");
    scanf("%d",&a);
    printf("请输入有几个学生:\n");
    scanf("%d",&b);
    head = createClass(head,a,b);
    printMessage(head,a,b);

    getMax(head,a,b);
    
    getMin(head,a,b);

    getAverage(head,a,b);

    return 0;
}

代码解析

先创建学生结构体和班级结构体

struct Student//创建学生结构体
{
    int num;
    int chinese;
    int math;
    int english;
    double average;
    double sum;
    struct Student *next;
};

struct Class//创建班级结构体
{
    struct Student *stuhead;
    int classnum;
    struct Class *next;
};

用头插法插入的方法,动态创建学生链表

struct Student *insertStuMessage(struct Student *head, struct Student *new)//头插法
{
    if(head == NULL){//如果头结点为空 
        head = new;
    }else{
        new->next = head;
        head = new;
    }
    return head;
}

struct Student *createStudent(struct Student *head, int stunum, int classnum)//动态创建学生链表
{
    int i;
    int num = stunum;//学生的人数
    double sum;
    double average;
    struct Student *new;
    for(i=0;i<stunum;i++){
        new = (struct Student *)malloc(sizeof(struct Student));
        printf("请输入第%d班第%d个学生的学号:\n",classnum,num);
        scanf("%d",&(new->num));
        printf("请输入第%d个学生的语文成绩:\n",num);
                scanf("%d",&(new->chinese));
        printf("请输入第%d个学生的数学成绩:\n",num);
                scanf("%d",&(new->math));
        printf("请输入第%d个学生的英语成绩:\n",num);
                scanf("%d",&(new->english));
        sum = new->chinese + new->math + new->english;
        new->sum = sum;
        average = sum/3;
        new->average = average;
        num--;
        head = insertStuMessage(head,new);
    }
    return head;
}

同理头插法和动态创建班级链表

struct Class *insertClaMessage(struct Class *head, struct Class *new)//头插法
{
    if(head == NULL){
        head = new;
    }else{
        new->next = head;
        head = new;
    }
    return head;
}

struct Class *createClass(struct Class *head, int classnum, int stunum)//动态创建班级链表
{
    struct Class *new = NULL;
    struct Student *stuHead;    
    int num = classnum;
    int i;
    for(i=0;i<classnum;i++){
        new = (struct Class*)malloc(sizeof(struct Class));
        new->classnum = num;
        stuHead = createStudent(stuHead,stunum,num);
        new->stuhead = stuHead;
        num--;
        head = insertClaMessage(head,new);
    }
    return head;
}

其余的就是打印输入的成绩(可省略),避免出错

还有就是获取最大值getMax,最小值getMin,平局值getAverage

主函数main()进行的一些函数的调用

师承--抖音上官社长(上官可编程)


版权声明:本文为weixin_57672679原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。