陈啊阵 2023-03-16 16:19 采纳率: 100%
浏览 131
已结题

关于#c语言#的问题:请修改此程序使之具有班级内单科成绩排名的功能#include <stdio.h>

请修改此程序使之具有班级内单科成绩排名的功能

#include <stdio.h>
#include <windows.h>//包含了控制台窗口操作相关的函数
#include <stdlib.h>
#define LEN sizeof(struct Student)// 定义结构体类型所占的内存大小
struct Student// 定义结构体类型
{
    char name[10];        
    char number[20];                     
    int C_Language;            
    int Math;                
    int English;    
    struct Student* next;     // 存储下一个学生的地址
};
struct Student* head = NULL;// 定义头节点指针
struct Student* end = NULL;// 定义尾节点指针
 void Menu()// 定义菜单函数
 {
     void Menu();// 声明菜单函数
    void Add();
    void View();
    void Delete();
    void Repair();
    void ViewAll();
    void AddOne();
    system("cls"); // 清空控制台窗口内容
    printf("1.学生信息录入\n");
    printf("2.学生单个成绩查询\n");
    printf("3.查询全部学生成绩\n");
    printf("4.修改学生信息\n");
    printf("5.删除学生信息\n");
    printf("6.学生单科成绩录入\n"); 
    printf("7.退出系统\n");

    int choice;
    printf("请选择要使用的功能:\n");
    loop:
    scanf("%d",&choice);
    switch (choice)
    {
        case 1:
            Add();
            Menu();
        case 2:
            View();
            Menu();
        case 3:
            ViewAll();
            Menu();
        case 4:
            Repair();
            Menu();
        case 5:
            Delete();
            Menu();
        case 6:
            AddOne();
            Menu();
        case 7:
            exit(0);
            default:
                printf("输入有误,请重新选择:");
                break;
    }
} 
 
void Add()
{
    system("cls");
    int count;
    printf("请输入要录入信息的个数:");
    scanf("%d",&count);
    struct Student *s1,*s2,*temp;
    s1=s2=(struct Student*)malloc(LEN);
    if(head==NULL)
    {
        head = s1;
    }
    else
    {
        end->next = s1 ;
    }
    int i = 1;    
    while(count>0)
    {
        printf("请输入第%d位学生信息:\n",i++);
        printf("姓名:\n");
        scanf("%s",&s1->name);
        printf("学号:\n");
        scanf("%s",&s1->number);
        printf("C语言成绩:\n");
        scanf("%d",&s1->C_Language);
        printf("数学成绩:\n");
        scanf("%d",&s1->Math);
        printf("英语成绩:\n");
        scanf("%d",&s1->English);
        count--;
        s2->next=s1;
        s2=s1;
        s1=(struct Student*)malloc(LEN);
        printf("添加成功!\n");
        system("pause");
        system("cls");
    }
    s2->next= NULL;
    end = s2;
    printf("全部添加成功!\n");
    system("pause");
}
void View()
{
    system("cls");
    struct Student *VS;
    printf("输入要查询信息的学生学号:\n");
    char num[10];
    int flag=1;
    scanf("%s",&num);
    for(VS=head;VS!=NULL;)
    {
        if(strcmp(VS->number,num)==0)
        {
            printf("成功找到!\n");
            printf("姓名:%s\t学号:%s\t\n",VS->number,VS->name);
            printf("C语言:%d\t数学:%d\t英语:%d",VS->C_Language,VS->Math,VS->English);
            flag=0;
            break;
        }
        VS=VS->next;
    }
    if(flag)
    {
        printf("不好意思,未找到!\n");
    }
    system("pause");
}
void ViewAll()
{
    system("cls");
    struct Student *VA;
    if(head!=NULL)
    {
        printf("所有学生成绩如下:\n");
        for(VA=head;VA!=NULL;)
        {
            printf("姓名:%s\t学号:%s\t\n",VA->name,VA->number);
            printf("C语言:%d\t数学:%d\t英语:%d\n",VA->C_Language,VA->Math,VA->English);
            VA=VA->next; 
        }
        printf("所有不及格科目超过两科的学生名单如下:\n");
        for(VA=head;VA!=NULL;)
        {
             int lostNum = 0;
            if(VA->C_Language < 60)
            {
                lostNum++;
            }
            if(VA->Math< 60)
            {
                lostNum++;
            }
            if(VA->English< 60)
            {
                lostNum++;
            }
            if(lostNum > 1)
            {
                printf("姓名:%s\t\n",VA->name);
            }
             VA = VA->next;
        }

    }
    else
    {
        printf("该系统中还未录入信息");
    }
    system("pause");
}
void Repair()
{
    system("cls");
    struct Student *RS;
    char num[10];
    int flag = 1;
    printf("输入要修改成绩学生的学号:\n");
    scanf("%s",num);
    for(RS=head;RS!=NULL;)
    {
        if(strcmp(RS->number,num)==0)
        {
            printf("成功找到该学生");
            printf("姓名:%s\t学号:%s\t\n",RS->number,RS->name);
            printf("C语言:%d\t数学:%d\t英语:%d\n",RS->C_Language,RS->Math,RS->English);
            flag = 0;
            printf("姓名:\n");
            scanf("%s",&RS->name);
            printf("学号:\n");
            scanf("%s",&RS->number);
            printf("C语言成绩:\n");
            scanf("%d",&RS->C_Language);
            printf("数学成绩:\n");
            scanf("%d",&RS->Math);
            printf("英语成绩:\n");
            scanf("%d",&RS->English);
            printf("修改成功");
            system("pause");
        }
        RS=RS->next;
    }
    if(flag)
    {
        printf("输入信息有误,未查询到");
        system("pause");
    }
}
void Delete()
{
    system("cls");
    int flag =1;
    while(flag)
    {
        printf("请输入要删除的学生学号:");
        char num[10];
        scanf("%s",&num);
        struct Student * DS,*temp;
        for(DS=head;DS!=NULL;)
        {
            if(strcmp(DS->number,num)==0)
            {
                if(DS==head)
                {
                    head = DS->next;
                    flag = 0;
                    printf("删除成功!\n");
                    system("pause");
                }
                else
                {
                    flag = 0;
                    printf("删除成功!\n");
                    temp->next= DS->next;
                    free(DS);
                    system("pause");
                }
                break;
            }
            temp = DS;
            DS=DS->next;
        }
        if(flag)
        {
            printf("未找到该学生学号!\n");
            system("pause");
        } 
    }
}

 
 
void AddOne()
{
    system("cls");
    struct Student* DA =(struct Student*)malloc(sizeof(struct Student)); //修改1 
    DA->next = NULL; //修改,增加这一行
    int flag = 1;
    while (flag)
    {
        printf("请输入姓名:\n");
        scanf("%s", DA->name);
        printf("请输入学号:\n");
        scanf("%s", DA->number);
        printf("1.录入C语言成绩\n");
        printf("2.录入数学成绩\n");
        printf("3.录入英语成绩\n");
        int select;
        scanf("%d", &select);
        switch (select)
        {
        case 1:
            printf("请输入C语言成绩\n");
            scanf("%d", &DA->C_Language); //修改,增加 &
            break;
        case 2:
            printf("请输入数学成绩\n");
            scanf("%d", &DA->Math);//修改,增加 &
            break;
        case 3:
            printf("请输入英语成绩\n");
            scanf("%d", &DA->English);//修改,增加 &
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
        printf("录入成功\n");
        flag = 0;
        struct Student* DB, * temp; //修改  DA改成DB
        //DA插入链表
        if (head == NULL)
            head = DA;
        else
        {
            for (DB = head; DB->next != NULL;){
                DB = DB->next;
            }
            DB->next = DA;
        }
        system("pause");
    }
}
int main()
{
    void Menu();
    void Add();
    void View();
    void Delete();
    void Repair();
    void ViewAll();
    void AddOne();
    Menu();
    
}


  • 写回答

10条回答 默认 最新

  • 「已注销」 2023-03-16 17:02
    关注

    参考GPT和自己的思路:在结构体中增加一个变量rank表示排名,并且在录入成绩时根据成绩进行排序,计算每个学生的排名。具体修改如下:

    struct Student// 定义结构体类型
    {
        char name[10];        
        char number[20];                     
        int C_Language;            
        int Math;                
        int English;    
        int rank;                // 新增排名变量
        struct Student* next;     // 存储下一个学生的地址
    };
    
    
    

    在Add函数中增加排序及排名的代码:

    void Add()
    {
        system("cls");
        int count;
        printf("请输入要录入信息的个数:");
        scanf("%d",&count);
        struct Student *s1,*s2,*temp;
        s1=s2=(struct Student*)malloc(LEN);
        if(head==NULL)
        {
            head = s1;
        }
        else
        {
            end->next = s1 ;
        }
        int i = 1;    
        while(count>0)
        {
            printf("请输入第%d位学生信息:\n",i++);
            printf("姓名:\n");
            scanf("%s",&s1->name);
            printf("学号:\n");
            scanf("%s",&s1->number);
            printf("C语言成绩:\n");
            scanf("%d",&s1->C_Language);
            printf("数学成绩:\n");
            scanf("%d",&s1->Math);
            printf("英语成绩:\n");
            scanf("%d",&s1->English);
            count--;
            s2->next=s1;
            s2=s1;
            s1=(struct Student*)malloc(LEN);
    // 计算排名
    struct Student *current = head;
    while (current != NULL) {
    if (current->total > s2->total) {
    rank++;
    } else if (current->total == s2->total) {
    if (current->C_Language > s2->C_Language) {
    rank++;
    }
    }
    current = current->next;
    }
    s2->rank = rank;
    rank = 1;
    }
    
    // 排序
    struct Student *p, *q, *tail = NULL;
    int swapped;
    do {
    swapped = 0;
    p = head;
    while (p->next != tail) {
    q = p->next;
    if (p->total < q->total || (p->total == q->total && p->C_Language < q->C_Language)) {
    // 交换p和q节点的数据
    struct Student temp = *p;
    *p = *q;
    *q = temp;
    swapped = 1;
    }
    p = p->next;
    }
    tail = p;
    } while (swapped);
    
    // 重新计算排名
    struct Student *current = head;
    rank = 1;
    while (current != NULL) {
    current->rank = rank;
    rank++;
    current = current->next;
    }
    
    printf("录入成功!\n");
    system("pause");
    return;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 赞助了问题酬金15元 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭