学生成绩管理代码(大一知识)

img


学生成绩管理
1)每条记录包括:学号、姓名、专业和5门课程的成绩;
2)能够实现添加、删除、修改功能;
3)能够计算某学生的总分和平均分;
4)能按照总分排序输出。

img

书上不是有代码了吗,你有什么问题?

下面是我写的一个代码:

img

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMBSCORE 5
struct StNode
{
    int num;        //学号
    char name[20];  //姓名 
    char partment[20]; //专业
    int score[NMBSCORE]; //成绩
    StNode* next;
};


//录入信息
struct StNode* Input(struct StNode* head)
{
    struct StNode* p, * node;
    int i;
    system("cls");
    node = (struct StNode*)malloc(sizeof(struct StNode));
    //录入信息
    printf("请输入学号:");
    scanf("%d", &node->num);
    printf("请输入姓名:");
    scanf("%s", node->name);
    printf("请输入专业:");
    scanf("%s", node->partment);
    printf("请输入%d门课程的成绩:", NMBSCORE);
    for (i = 0; i < NMBSCORE; i++)
        scanf("%d", &node->score[i]);
    node->next = 0;

    if (head == 0)
    {
        head = node;
        //
    }
    else
    {
        p = head;
        while (p->next)
            p = p->next;
        //新建节点
        p->next = node;
    }
    system("pause");
    return head;
}
//显示所有学生信息
void showAll(struct StNode* head)
{
    struct StNode* p;
    int i = 1, j;
    system("cls");
    p = head;
    printf("学号    姓名    专业      五门课成绩\n");
    while (p)
    {
        printf("%-4d  ",  p->num);
        printf("%-8s  ",  p->name);
        printf("%-10s  ", p->partment);
        for (j = 0; j < NMBSCORE; j++)
            printf("%d ", p->score[j]);
        printf("\n");
        i++;
        p = p->next;
    }
    system("pause");
}

//查询信息
void Find(struct StNode* head)
{
    int opt;
    struct StNode* p = head;
    int id, j;
    char name[20] = { 0 };
    system("cls");
    printf("1.按学号查询\n");
    printf("2.按姓名查询\n");
    scanf("%d", &opt);
    switch (opt)
    {
    case 1:
        printf("请输入学号:");
        scanf("%d", &id);
        while (p)
        {
            if (p->num == id)
            {
                printf("学生学号:%d\n", p->num);
                printf("学生姓名:%s\n", p->name);
                printf("学生专业:%s\n", p->partment);
               
                printf("学生成绩:");
                for (j = 0; j < NMBSCORE; j++)
                    printf("%d ", p->score[j]);
                printf("\n");
                break;
            }
            p = p->next;
        }
        if (p == 0)
            printf("查无此人\n");
        break;
    case 2:
        printf("请输入姓名:");
        scanf("%s", name);
        while (p)
        {
            if (strcmp(p->name, name) == 0)
            {
                printf("学生学号:%d\n", p->num);
                printf("学生姓名:%s\n", p->name);
                printf("学生专业:%s\n", p->partment);
                printf("学生成绩:");
                for (j = 0; j < NMBSCORE; j++)
                    printf("%d ", p->score[j]);
                printf("\n");
                break;
            }
            p = p->next;
        }
        if (p == 0)
            printf("查无此人\n");
        break;
    }
    system("pause");
}




//修改学生信息
void ModInfo(struct StNode* head)
{
    struct StNode* node = 0;
    int id, i;
    system("cls");
    printf("请输入需要修改信息的学生学号:");
    scanf("%d", &id);
    node = head;
    while (node)
    {
        if (node->num == id)
            break;
        else
            node = node->next;
    }
    if (node == 0)
        printf("查无此人\n");
    else
    {
        memset(node->name, 0, 20);
        printf("请输入姓名:");
        scanf("%s", node->name);
        printf("请输入专业:");
        scanf("%s", node->partment);
        
        printf("请输入%d门课程的成绩:", NMBSCORE);
        for (i = 0; i < NMBSCORE; i++)
            scanf("%d", &node->score[i]);
    }
    system("pause");
}

//删除学生信息
void DeleteInfo(struct StNode* head)
{
    struct StNode* node, * pre;
    int id;
    system("cls");
    printf("请输入需要删除信息的学生学号:");
    scanf("%d", &id);

    if (head->num == id)
    {
        node = head->next;
        free(head);
        head = node;
        printf("该学生信息已经删除\n");
        system("cls");
        return;
    }
    else
    {
        pre = head;
        node = head->next;
        while (node)
        {
            if (node->num == id)
            {
                pre->next = node->next;
                free(node);
                node = 0;
                printf("该学生信息已经删除\n");
                system("pause");
                return;
            }
            else
            {
                pre = node;
                node = node->next;
            }
        }
        printf("查无此人\n");
        system("pause");
    }
}

//计算某学生的总分和平均分
void SumAndAve(struct StNode* head,int id, double *sum,double *ave)
{
    struct StNode* node;
    int i;
    *sum = 0;
    *ave = 0;
    node = head;
    while (node)
    {
        if (node->num == id)
        {
            for (i = 0; i < NMBSCORE; i++)
                *sum += node->score[i];
            *ave = *sum / NMBSCORE;
            break;
        }
        else
            node = node->next;
    }
}


//排序
struct StNode* SortBySum(struct StNode* head)
{
    struct StNode* min_pre = NULL;
    struct StNode* min = head;
    struct StNode* tmp = head;
    struct StNode* new_list = NULL;
    struct StNode* tail_sort = NULL;

    double sum1, sum2, ave1, ave2;

    if (NULL == head)    //若链表为空则不用排序
    {
        return NULL;
    }
    if (NULL == head->next)  //若链表中只有一个数,则不用比较
    {
        printf("min is head\n");
        return head;
    }
    

    while (head)
    {
        min = head;
        tmp = head;
        while (tmp->next)
        {
            SumAndAve(head, min->num, &sum1, &ave1);
            SumAndAve(head, tmp->next->num,&sum2,&ave2);
            if (sum1 > sum2)
            {
                min = tmp->next;
                min_pre = tmp;
            }
            tmp = tmp->next;
        }
        if (min == head)
        {
            head = head->next;
        }
        else
        {
            min_pre->next = min->next;
            min->next = NULL;
        }
        if (NULL == new_list)    //按照尾插将最小的数组成新的链表
        {
            tail_sort = min;
            new_list = tail_sort;
        }
        else
        {
            tail_sort->next = min;
            tail_sort = min;
        }
    }
    return new_list;
}


int main()
{
    struct StNode* head = 0;
    int opt = 0;
    int bgo = 1;
    const char* filename = "students.txt";
    double sum, ave;
    int id;
    
    while (bgo)
    {
        system("cls");
        printf("--------------学生信息管理系统---------------|\n");
        printf("|   1.录入学生信息                           |\n");
        printf("|   2.显示所有学生信息                       |\n");
        printf("|   3.学生信息查询                           |\n");
        printf("|   4.学生信息修改                           |\n");
        printf("|   5.学生信息删除                           |\n");
        printf("|   6.计算总分平均分                         |\n");
        printf("|   7.按总分排序                             |\n");
        printf("|   0.退出系统                               |\n");
        printf("----------------------------------------------\n");
        scanf("%d", &opt);
        switch (opt)
        {
        case 0:
            bgo = 0;
            break;
        case 1:
            head = Input(head);
            break;
        case 2:
            showAll(head);
            break;
        case 3:
            Find(head);
            break;
        case 4:
            ModInfo(head);
            break;
        case 5:
            DeleteInfo(head);
            break;
        case 6:
            system("cls");
            printf("请输入需要查询的学生id:");
            scanf("%d", &id);
            sum = -1;
            SumAndAve(head,id,&sum,&ave);
            if (sum == -1)
                printf("查无此人!\n");
            else
                printf("sum=%g,ave=%g\n", sum, ave);
            system("pause");
            break;
        case 7:
            head = SortBySum(head);
            printf("排序完成!\n");
            system("pause");
            break;
        }
    }
    return 0;
}