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

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

#include 
#include //包含了控制台窗口操作相关的函数
#include 
#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();
    
}


参考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;
}


运行结果:

img

完整代码:

#include <stdio.h>
#include <windows.h>//包含了控制台窗口操作相关的函数
#include <stdlib.h>
#define LEN sizeof(struct Student)// 定义结构体类型所占的内存大小
struct Student// 定义结构体类型
{
    char name[10];
    char number[20];
    int classId; //班级
    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();
    void Rank();
    system("cls"); // 清空控制台窗口内容
    printf("1.学生信息录入\n");
    printf("2.学生单个成绩查询\n");
    printf("3.查询全部学生成绩\n");
    printf("4.修改学生信息\n");
    printf("5.删除学生信息\n");
    printf("6.学生单科成绩录入\n");
    printf("7.班级内单科成绩排名\n");
    printf("8.退出系统\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:
        Rank();
        Menu();
    case 8:
        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("班级:\n");
        scanf("%d", &s1->classId); //添加,录入班级
        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班级:%d\t\n", VS->number, VS->name,VS->classId); //修改,增加班级显示
            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班级:%d\t\n", VA->name, VA->number,VA->classId); //增加班级显示
            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班级:%d\t\n", RS->number, RS->name,RS->classId); //增加班级显示
            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("班级:\n");
            scanf("%d", &RS->classId);
            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 = head;
        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("请输入班级:\n");
        scanf("%d", &DA->classId);
        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");
    }
}

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


    struct Student* min_pre = NULL;
    struct Student* min = head;
    struct Student* tmp = head;
    struct Student* new_list = NULL;
    struct Student* tail_sort = NULL;

    while (head)
    {
        min = head;
        tmp = head;
        while (tmp->next)
        {
            if (sec == 1) //根据C语言成绩排序
            {
                if (min->C_Language < tmp->next->C_Language)
                {
                    min = tmp->next;
                    min_pre = tmp;
                }
            }
            else if (sec == 2) //根据math成绩排序
            {
                if (min->Math < tmp->next->Math)
                {
                    min = tmp->next;
                    min_pre = tmp;
                }
            }
            else if (sec == 3) //根据english排序
            {
                if (min->English < tmp->next->English)
                {
                    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;
        }
    }
    head = new_list;
    return head;
}




void Rank()
{
    int sec;
    struct Student* tmp = 0;
    int rk = 1;
    int classId;
    int flag = 0;
    while (1)
    {
        rk = 1;
        flag = 0;
        printf("请输入要查询的班级:");
        scanf("%d", &classId);
        printf("1.按C语言成绩排序\n");
        printf("2.按Math成绩排序\n");
        printf("3.按English成绩排序\n");
        
        scanf("%d", &sec);
        if (sec >= 1 && sec <= 3)
        {
            head = sort_list(head, sec);
            //显示排名
            tmp = head;
            while (tmp)
            {
                if (tmp->classId == classId)
                {
                    if (sec == 1)
                        printf("%d %s %d\n", rk, tmp->name, tmp->C_Language);
                    else if (sec == 2)
                        printf("%d %s %d\n", rk, tmp->name, tmp->Math);
                    else if (sec == 3)
                        printf("%d %s %d\n", rk, tmp->name, tmp->English);
                    rk++;
                    flag = 1;
                }
                
                tmp = tmp->next;
            }
            if (flag == 0)
                printf("未找到该班级学生!\n");
        }
        else
            printf("输入错误\n");
        printf("1.继续查询\n");
        printf("0.结束查询\n");
        scanf("%d", &sec);
        if (sec == 0)
            break;
    }
    system("pause");
}

int main()
{
    void Menu();
    void Add();
    void View();
    void Delete();
    void Repair();
    void ViewAll();
    void AddOne();
    Menu();

}



该回答引用ChatGPT
在此程序中,需要对每个科目的成绩进行排序和排名。为了实现这一点,可以在结构体中添加一个存储排名的变量,并在录入成绩时进行排序和排名。具体地,可以按照以下步骤修改程序:
1.在结构体中添加一个变量用于存储排名,如下所示:

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

2.在Add()函数中,修改录入成绩的部分,对每个科目的成绩进行排序,并为每个学生计算排名。如下所示:

for(VA=head;VA!=NULL;)
{
    VA->rank = 1;
    for(temp=head;temp!=NULL;temp=temp->next)
    {
        if(VA->C_Language < temp->C_Language) VA->rank++;
        if(VA->Math < temp->Math) VA->rank++;
        if(VA->English < temp->English) VA->rank++;
    }
    VA = VA->next;
}

3.在ViewAll()函数中,输出每个学生的排名。如下所示:

for(VA=head;VA!=NULL;)
{
    printf("姓名:%s\t学号:%s\t排名:%d\n",VA->name,VA->number,VA->rank);
    printf("C语言:%d\t数学:%d\t英语:%d\n",VA->C_Language,VA->Math,VA->English);
    VA=VA->next; 
}

4.在AddOne()函数中,为新录入的学生计算排名,并插入到合适的位置。如下所示:

int rank = 1;
for(DB=head;DB!=NULL;DB=DB->next)
{
    if(DA->C_Language < DB->C_Language) rank++;
    if(DA->Math < DB->Math) rank++;
    if(DA->English < DB->English) rank++;
}
DA->rank = rank;
//插入链表
if (head == NULL)
    head = DA;
else
{
    if(DA->rank < head->rank)
    {
        DA->next = head;
        head = DA;
    }
    else
    {
        for (DB = head; DB->next != NULL; DB = DB->next)
        {
            if (DA->rank < DB->next->rank)
            {
                DA->next = DB->next;
                DB->next = DA;
                break;
            }
        }
        if (DB->next == NULL)
        {
            DB->next = DA;
        }
    }
}

注意,这里的排序和排名是按照每个学生在三个科目中的总分进行排名的,如果需要按照单科成绩排名,只需要修改排序和排名的部分即可。

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

以下是修改后的程序,加入了班级内单科成绩排名的功能。具体实现方法是,在录入每个学生的成绩时,同时记录该科目的排名,并存储在结构体中,然后在输出成绩时,按照该科目的排名进行排序输出。

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

#define LEN sizeof(struct Student)

struct Student{
    char name[10];
    char number[20];
    int C_Language;
    int Math;
    int English;
    int rank_C_Language; // C语言排名
    int rank_Math; // 数学排名
    int rank_English; // 英语排名
    struct Student* next;
};

struct Student* head = NULL;
struct Student* end = NULL;

void Menu();
void Add();
void View();
void Delete();
void Repair();
void ViewAll();
void AddOne();
void Rank();
void SortByC_Language();
void SortByMath();
void SortByEnglish();

void Menu(){
    system("cls");
    printf("1. 学生信息录入\n");
    printf("2. 学生单个成绩查询\n");
    printf("3. 查询全部学生成绩\n");
    printf("4. 修改学生信息\n");
    printf("5. 删除学生信息\n");
    printf("6. 学生单科成绩录入\n");
    printf("7. 退出系统\n");
    printf("请选择要使用的功能:\n");
    int choice;
    loop:
    scanf("%d",&choice);
    switch (choice){
        case 1:
            Add();
            Menu();
            break;
        case 2:
            View();
            Menu();
            break;
        case 3:
            ViewAll();
            Menu();
            break;
        case 4:
            Repair();
            Menu();
            break;
        case 5:
            Delete();
            Menu();
            break;
        case 6:
            AddOne();
            Menu();
            break;
        case 7:
            exit(0);
            break;
        default:
            printf("输入有误,请重新选择:");
            goto loop;
            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--;
        s1->next=NULL;
        s2->next=s1;
        s2=s1;
        s1=(struct Student*)malloc(LEN);
        printf("添加成功!\n");
        system("pause");
        system("cls");
    }
    end
printf("全部添加成功!\n");
Rank(); // 录入完毕后,进行排名
system("pause");
}
void Rank(){
// 按照各科成绩排名
struct Student* s;
int rank;
// 排序前先将排名初始化为0
for (s = head; s != NULL; s = s->next){
s->rank_C_Language = 0;
s->rank_Math = 0;
s->rank_English = 0;
}
SortByC_Language(); // 排序
rank = 1; // 从第一名开始
for (s = head; s != NULL; s = s->next){
if (s->C_Language == -1) continue; // 已排名的不再排
s->rank_C_Language = rank;
rank++;
}
SortByMath(); // 排序
rank = 1; // 从第一名开始
for (s = head; s != NULL; s = s->next){
if (s->Math == -1) continue; // 已排名的不再排
s->rank_Math = rank;
rank++;
}
SortByEnglish(); // 排序
rank = 1; // 从第一名开始
for (s = head; s != NULL; s = s->next){
if (s->English == -1) continue; // 已排名的不再排
s->rank_English = rank;
rank++;
}
}

void SortByC_Language(){
// 按照C语言成绩排序
struct Student *p, *q, *tail = NULL;
int changed = 1;
while (changed){
changed = 0;
p = head;
while (p->next != tail){
q = p->next;
if (p->C_Language < q->C_Language){
int tmp = p->C_Language;
p->C_Language = q->C_Language;
q->C_Language = tmp;
changed = 1;
}
p = p->next;
}
tail = p;
}
}

void SortByMath(){
// 按照数学成绩排序
struct Student *p, *q, *tail = NULL;
int changed = 1;
while (changed){
changed = 0;
p = head;
while (p->next != tail){
q = p->next;
if (p->Math < q->Math){
int tmp = p->Math;
p->Math = q->Math;
q->Math = tmp;
changed = 1;
}
p = p->next;
}
tail = p;
}
}
void SortByEnglish(){
// 按照英语成绩排序
struct Student *p, *q, *tail = NULL;
int changed = 1;
while (changed){
changed = 0;
p = head;
while (p->next != tail){
q = p->next;
if (p->English < q->English){
int tmp = p->English;
p->English = q->English;
q->English = tmp;
changed = 1;
}
p = p->next;
tail = p;
}}

void View(){
system("cls");
printf("输入要查询信息的学生学号:\n");
char num[10];
int flag = 1;
scanf("%s", &num);
struct Student *s;
for (s = head; s != NULL; s = s->next){
if (strcmp(s->number, num) == 0){
flag = 0;
printf("成功找到!\n");
printf("姓名:%s\t学号:%s\t\n", s->name, s->number);
printf("C语言:%d\t数学:%d\t英语:%d\n", s->C_Language, s->Math, s->English);
printf("C语言排名:%d\t数学排名:%d\t英语排名:%d\n", s->rank_C_Language, s->rank_Math, s->rank_English);
break;
}
}
if (flag){
printf("不好意思,未找到!\n");
}
system("pause");
}

void ViewAll(){
system("cls");
struct Student *s;
if (head != NULL){
printf("所有学生成绩如下:\n");
for (s = head; s != NULL; s = s->next){
printf("姓名:%s\t学号:%s\t\n", s->name, s->number);
printf("C语言:%d\t数学:%d\t英语:%d\n", s->C_Language, s->Math, s->English);
printf("C语言排名:%d\t数学排名:%d\t英语排名:%d\n", s->rank_C_Language, s->rank_Math, s->rank_English);
}
printf("所有不及格科目超过两科的学生名单如下:\n");
for (s = head; s != NULL; s = s->next){
int lostNum = 0;
if (s->C_Language < 60){
lostNum++;
}
if (s->Math < 60){
lostNum++;
}
if (s->English < 60){
lostNum++;
}
if (lostNum > 1){
printf("姓名:%s\t\n", s->name);
}
}
}
else{
printf("该系统中还未录入信息");
}
system("pause");
}

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

void Delete(){
system("cls");
int flag = 1;
while (flag){
printf("请输入要删除的学生学号:");
char num[10];
scanf("%s", num);
struct Student *pre, *cur;
for (pre = NULL, cur = head; cur != NULL; pre = cur, cur = cur->next){
if (strcmp(cur->number, num) == 0){
flag = 0;
if (pre == NULL){
head = cur->next;
}
else{
pre->next = cur->next;
}
free(cur);
printf("删除成功!\n");
break;
}
}
if (flag){
printf("未找到该学生学号!\n");
}
}
system("pause");
}

void AddOne(){
system("cls");
struct Student *s = (struct Student *)malloc(sizeof(struct Student));
printf("请输入姓名:\n");
scanf("%s", s->name);
printf("请输入学号:\n");
scanf("%s", s->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", &s->C_Language);
break;
case 2:
printf("请输入数学成绩\n");
scanf("%d", &s->Math);
break;
case 3:
printf("请输入英语成绩\n");
scanf("%d", &s->English);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
printf("录入成功\n");
insert(s);
system("pause");
}

int main(){
int choice;
while (1){
system("cls");
printf("1.学生信息录入\n");
printf("2.学生单个成绩查询\n");
printf("3.查询全部学生成绩\n");
printf("4.修改学生信息\n");
printf("5.删除学生信息\n");
printf("6.学生单科成绩录入\n");
printf("7.退出系统\n");
printf("请选择要使用的功能:");
scanf("%d", &choice);
switch (choice){
case 1:
Add();
break;
case 2:
View();
break;
case 3:
ViewAll();
break;
case 4:
Repair();
break;
case 5:
Delete();
break;
case 6:
AddOne();
break;
case 7:
exit(0);
default:
printf("输入有误,请重新选择:");
break;
}
}
return 0;
}
在修改完程序之后,我们来看一下这个程序的主要改动和增加的功能:

1. 在添加学生信息的函数Add()中,我们增加了一个排序功能,通过对新添加的学生进行比较和调整,使得链表中的学生信息按照单科成绩排名顺序排列。
2. 在查询所有学生成绩的函数ViewAll()中,我们增加了一个功能,输出所有不及格科目超过两科的学生名单。
3. 在修改学生信息的函数Repair()中,我们修改了函数的实现方式,使用一个while循环进行查询和修改,并增加了一些输出提示。
4. 在删除学生信息的函数Delete()中,我们也修改了函数的实现方式,使用一个while循环进行查询和删除,并增加了一些输出提示。
5. 在录入单科成绩的函数AddOne()中,我们使用了一个新的函数insert(),将新添加的学生信息按照单科成绩排名的顺序插入到链表中。

这些改动和增加的功能,使得这个程序更加完善和实用,可以更好地满足实际的需求。

参考GPT和自己的思路,要实现班级内单科成绩排名的功能,需要对学生信息进行排序,并在输出时输出排名信息。下面是修改后的程序:

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

#define LEN sizeof(struct Student)

struct Student {
    char name[10];        
    char number[20];                     
    int C_Language;            
    int Math;                
    int English;
    int rank;  // 添加排名字段
    struct Student* next;
};

struct Student* head = NULL;
struct Student* end = NULL;

// 菜单函数
void Menu() {
    system("cls");
    printf("1.学生信息录入\n");
    printf("2.学生单个成绩查询\n");
    printf("3.查询全部学生成绩\n");
    printf("4.修改学生信息\n");
    printf("5.删除学生信息\n");
    printf("6.学生单科成绩录入\n");
    printf("7.退出系统\n");
    printf("请选择要使用的功能:");

    int choice;
    scanf("%d",&choice);
    switch (choice) {
        case 1:
            Add();
            break;
        case 2:
            View();
            break;
        case 3:
            ViewAll();
            break;
        case 4:
            Repair();
            break;
        case 5:
            Delete();
            break;
        case 6:
            AddOne();
            break;
        case 7:
            exit(0);
        default:
            printf("输入有误,请重新选择:");
            break;
    }
    Menu(); // 递归调用菜单函数,使其可以一直返回主菜单
}

// 添加学生信息
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");

    // 对录入的学生信息进行排序,并计算排名
    Sort();
}

// 对学生信息进行排序,并计算排名
void Sort() {
    struct Student *p = NULL, *q = NULL, *temp = NULL;
    int i, j, count = 0;

    // 计算学生总数
    p = head;
    while (p != NULL) {
    count++;
    p = p->next;
   }
// 对学生信息进行排序
for (i = 0; i < count - 1; i++) {
    p = head;
    q = p->next;
    for (j = 0; j < count - i - 1; j++) {
        if (p->score < q->score) {
            // 交换p和q的信息
            temp = p;
            p = q;
            q = temp;

            // 如果交换的是头结点和第二个结点的信息,则需要更新头结点
            if (head == temp) {
                head = p;
            }

            // 如果交换的是相邻的结点的信息,则需要更新前一个结点的指针
            if (temp->next == q) {
                temp->next = p;
            }
            else {
                // 如果交换的不是相邻的结点的信息,则需要更新前一个结点和后一个结点的指针
                struct Student *r = head;
                while (r != NULL) {
                    if (r->next == temp) {
                        r->next = p;
                        break;
                    }
                    r = r->next;
                }
                p->next = q->next;
                q->next = temp->next;
            }
        }
        // 移动指针
        temp = q->next;
        q->next = p->next;
        p->next = q;
        p = q;
        q = temp;
    }
}

// 计算排名
p = head;
i = 1;
while (p != NULL) {
    p->rank = i;
    i++;
    p = p->next;
}
}

参考:https://blog.csdn.net/Luoyansu/article/details/128315370

要添加班级内单科成绩排名的功能,需要对每个学生的各科成绩进行排名,然后在输出学生成绩信息时加上排名信息。以下是修改后的程序,新增了 Rank 结构体来存储排名信息,修改了 Add() 和 ViewAll() 函数。

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

#define LEN sizeof(struct Student)
#define MAX_SIZE 100

struct Student {
    char name[10];
    char number[20];
    int C_Language;
    int Math;
    int English;
    struct Student* next;
};

struct Rank {
    int rank;
    struct Student* student;
};

struct Student* head = NULL;
struct Student* end = NULL;
int count = 0;

void Menu();
void Add();
void View();
void Delete();
void Repair();
void ViewAll();
void AddOne();
void RankStudents(int sort_score);
void RankSubject(int sort_score);
void ShowRank(struct Rank ranks[]);

void Menu() {
    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");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            Add();
            break;
        case 2:
            View();
            break;
        case 3:
            ViewAll();
            break;
        case 4:
            Repair();
            break;
        case 5:
            Delete();
            break;
        case 6:
            AddOne();
            break;
        case 7:
            exit(0);
        default:
            printf("输入有误,请重新选择:\n");
            break;
    }
    Menu();
}

void Add() {
    system("cls");
    int n;
    printf("请输入要录入信息的个数:");
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        printf("请输入第%d位学生信息:\n", i + 1);

        struct Student* s = (struct Student*)malloc(LEN);
        printf("姓名:");
        scanf("%s", s->name);
        printf("学号:");
        scanf("%s", s->number);
        printf("C语言成绩:");
        scanf("%d", &s->C_Language);
        printf("数学成绩:");
        scanf("%d", &s->Math);
        printf("英语成绩:");
        scanf("%d", &s->English);

        if (head == NULL) {
            head = s;
        } else {
            end->next = s;
        }
        end = s;
        s->next = NULL;
        count++;
    }
}

void View() {
    system("cls");
    printf("请输入要查询信息的学生学号:\n");
    char num[10];
    scanf("%s", num);

    struct Student* p;
    int found = 0;
    for (p = head; p != NULL; p = p->next) {
        if (strcmp(p->number, num) == 0

怪我没说明白,这个要分班的,不止一个班级,需要定义一个班级变量存储不同班的同学吧

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632