绿皮的猪猪侠 2022-06-09 11:12 采纳率: 100%
浏览 71
已结题

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

img


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

img

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2022-06-09 11:34
    关注

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

    下面是我写的一个代码:

    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了