头歌C语言课程设计学生系统第六关Sort by score

任务描述

编写函数 Sort_by_score(),生成根据分数由高到低顺序排列学生信息的表格。在表格中生成新的一列,存放排名情况。参数列表不作限制。

编程要求

根据提示,在右侧编辑器补充代码,完成成绩排名,并输出全部排名。

测试说明

输入说明: 一系列学生信息。

输出说明: 排序后的新表格。分数相同的同学名次并列,按照学号顺序输出。

平台会对你编写的代码进行测试:

测试输入:

 
  1. Jingyu LI 202100000000 85
  2. Jy LEE 202100100000 89
  3. Jxxxyx Leeeee 202000100000 100
  4. Jingyu11 LI 202100000001 85
  5. Jingyuuuu LI 202100000900 59
  6. Jingyuuuu Lous 202000000900 49
  7. Asss Dccc 202112344321 84
  8. Asssd Dccec 202112244321 83

预期输出:

 
  1. Name_f Name_l stu_id score Rank
  2. Jxxxyx Leeeee 202000100000 100 1
  3. Jy LEE 202100100000 89 2
  4. Jingyu LI 202100000000 85 3
  5. Jingyu11 LI 202100000001 85 3
  6. Asss Dccc 202112344321 84 5
  7. Asssd Dccec 202112244321 83 6
  8. Jingyuuuu LI 202100000900 59 7
  9. Jingyuuuu Lous 202000000900 49 8

 代码实现:

#include <stdio.h>

#include <string.h>

#include <stdbool.h>

//=======begin=======

struct Information

{

    char first_name[20];

    char last_name[20];

    char id[20];

    int score;

    int ranking;

}stu[110]={

    {"Jingyu", "LI", "202100000000", 85},

    {"Jy", "LEE", "202100100000", 89},

    {"Jxxxyx", "Leeeee", "202000100000", 100},

    {"Jingyu11", "LI", "202100000001", 85},

    {"Jingyuuuu", "LI", "202100000900", 59},

    {"Jingyuuuu", "Lous", "202000000900", 49},

    {"Asss", "Dccc", "202112344321", 84},

    {"Asssd", "Dccec", "202112244321", 83}};

void Sort_by_score(int n)

{

    struct Information zan;

    for (int i=0;i<n;i++){

        for(int k=i+1;k<n;k++){

            if(stu[i].score<stu[k].score){

                zan=stu[i];

                stu[i]=stu[k];

                stu[k]=zan;

            }

        }

    }

}

void ranking(int n)

{

    stu[0].ranking=1;

    int rank=1;//追踪当前排名用的

    for(int i=1;i<n;i++){

        if (stu[i].score==stu[i-1].score){

           stu[i].ranking= stu[i-1].ranking;

        }

        else{

            rank = i + 1; // 分数不同,更新排名  

            stu[i].ranking = rank;

        }

    }

}

int main(){

    printf("Name_f Name_l stu_id score Rank\n");

    int n = 0;

    while (~scanf("%s%s%s%d", stu[n].first_name, stu[n].last_name, stu[n].id, &stu[n].score)){

        n++;  

    Sort_by_score(n);

    ranking(n);

    }

    for (int i = 0; i < n; i++){

        printf("%s %s %s %d %d\n", stu[i].first_name, stu[i].last_name, stu[i].id, stu[i].score, stu[i].ranking);

    }

    return 0;

}

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要编写较多的代码。这里我简单列举一下实现这个学生信息管理系统的基本步骤: 1. 定义结构体 首先,我们需要定义一个结构体来存放每个学生的基本信息,包括学号、姓名、三门课成绩以及个人平均成绩。可以定义如下的结构体: ``` typedef struct { int id; // 学号 char name[20]; // 姓名 float score1; // 第一门课成绩 float score2; // 第二门课成绩 float score3; // 第三门课成绩 float avg_score; // 个人平均成绩 } Student; ``` 2. 建立学生基本信息(结构体数组) 接下来,我们需要定义一个结构体数组来存放多个学生的基本信息。可以定义如下: ``` Student students[70]; // 最多存放70个学生的信息 int num_students; // 学生数量 ``` 3. 添加学生信息 我们需要编写一个函数来添加学生信息,该函数需要接收用户输入的学生信息,并将其存储到结构体数组中。可以定义如下: ``` void add_student() { // 获取用户输入的学生信息 Student student; printf("请输入学生的学号:"); scanf("%d", &student.id); printf("请输入学生的姓名:"); scanf("%s", student.name); printf("请输入学生的第一门课成绩:"); scanf("%f", &student.score1); printf("请输入学生的第二门课成绩:"); scanf("%f", &student.score2); printf("请输入学生的第三门课成绩:"); scanf("%f", &student.score3); // 计算个人平均成绩 student.avg_score = (student.score1 + student.score2 + student.score3) / 3; // 将学生信息存储到结构体数组中 students[num_students] = student; num_students++; } ``` 4. 按学号查询学生基本信息 我们需要编写一个函数来按学号查询学生的基本信息,并输出该学生信息。可以定义如下: ``` void search_student_by_id(int id) { int i; for (i = 0; i < num_students; i++) { if (students[i].id == id) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("第一门课成绩:%f\n", students[i].score1); printf("第二门课成绩:%f\n", students[i].score2); printf("第三门课成绩:%f\n", students[i].score3); printf("个人平均成绩:%f\n", students[i].avg_score); return; } } printf("未找到学号为%d的学生\n", id); } ``` 5. 计算学生个人平均成绩 我们需要编写一个函数来计算每个学生的个人平均成绩,并更新结构体数组中的数据。可以定义如下: ``` void calc_avg_score() { int i; for (i = 0; i < num_students; i++) { students[i].avg_score = (students[i].score1 + students[i].score2 + students[i].score3) / 3; } } ``` 6. 按学生某一门课程或平均成绩高低进行排序 我们需要编写一个函数来按学生某一门课程或平均成绩高低进行排序,并输出排序后的学生信息。可以定义如下: ``` void sort_students(int key) { int i, j; Student temp; for (i = 0; i < num_students - 1; i++) { for (j = i + 1; j < num_students; j++) { if (key == 1) { if (students[i].score1 < students[j].score1) { temp = students[i]; students[i] = students[j]; students[j] = temp; } } else if (key == 2) { if (students[i].score2 < students[j].score2) { temp = students[i]; students[i] = students[j]; students[j] = temp; } } else if (key == 3) { if (students[i].score3 < students[j].score3) { temp = students[i]; students[i] = students[j]; students[j] = temp; } } else if (key == 4) { if (students[i].avg_score < students[j].avg_score) { temp = students[i]; students[i] = students[j]; students[j] = temp; } } } } // 输出排序后的学生信息 for (i = 0; i < num_students; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("第一门课成绩:%f\n", students[i].score1); printf("第二门课成绩:%f\n", students[i].score2); printf("第三门课成绩:%f\n", students[i].score3); printf("个人平均成绩:%f\n", students[i].avg_score); } } ``` 7. 修改某个学生某门课程成绩 我们需要编写一个函数来修改某个学生某门课程的成绩,并更新结构体数组中的数据。可以定义如下: ``` void modify_score(int id, int course, float score) { int i; for (i = 0; i < num_students; i++) { if (students[i].id == id) { if (course == 1) { students[i].score1 = score; } else if (course == 2) { students[i].score2 = score; } else if (course == 3) { students[i].score3 = score; } students[i].avg_score = (students[i].score1 + students[i].score2 + students[i].score3) / 3; return; } } printf("未找到学号为%d的学生\n", id); } ``` 8. 输出所有学生信息 最后,我们需要编写一个函数来输出所有学生的基本信息。可以定义如下: ``` void print_all_students() { int i; for (i = 0; i < num_students; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("第一门课成绩:%f\n", students[i].score1); printf("第二门课成绩:%f\n", students[i].score2); printf("第三门课成绩:%f\n", students[i].score3); printf("个人平均成绩:%f\n", students[i].avg_score); } } ``` 以上就是一个简单的学生信息管理系统的实现,你可以根据需要进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值