欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C语言习题】2016_5_2学生成绩排名

程序员文章站 2022-07-15 16:27:34
...

题目

【C语言习题】2016_5_2学生成绩排名

分析

  1. 学生信息包括姓名、学号、成绩,用结构体存储
  2. 成绩分为数学、语文、物理、化学、英语五门成绩,用数组处理
  3. 30名学生,用结构体数组存储

定义结构体:

struct stu{
    char name[30];
    int num;
    float score[5];
    float all;
}a[N];
  1. 总分在前十名,选择排序法
对数组a[]做简单选择排序,N为数组长度
for(i=0;i<N-1;i++)      //选择排序,由大到小排列
    {
        k = i;
        for(j=i+1;j<N;j++)
            if(a[j]>a[k])
                k=j;
        if(k!=i){
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
  1. 处理特别关注学生(低于80分)和并列排名学生

代码

#include <stdio.h>
#define N 30
struct stu{
    char name[30];
    int num;
    float score[5];
    float all;
}a[N];
int main() {
    int i,j,k;
    struct stu temp;
    printf("学号,输入姓名,数学成绩,语文成绩,物理成绩,化学成绩,英语成绩:\n");
    for(i=0;i<N;i++)        //输入学生信息
        scanf("%d%s%f%f%f%f%f",&a[i].num,a[i].name,&a[i].score[0],&a[i].score[1],&a[i].score[2],&a[i].score[3],&a[i].score[4]);
    for(i=0;i<N;i++)        //计算总分
        a[i].all = a[i].score[0]+a[i].score[1]+a[i].score[2]+a[i].score[3]+a[i].score[4];
    for(i=0;i<N-1;i++)      //选择排序,由大到小排列
    {
        k = i;
        for(j=i+1;j<N;j++)
            if(a[j].all>a[k].all)
                k=j;
        if(k!=i){
            temp = a[k];
            a[k] = a[i];
            a[i] = temp;
        }
    }
    int m = 10;                 //处理并列排名的情况
    if(a[9].all == a[10].all)
        m = 11;
    for(i = 0;i<m;i++) {        //输出前10名
        if(i == 10)
            printf("第%d名:",i);
        else
            printf("第%d名:",i+1);
        printf("%6d%8s %6.2f,",  a[i].num,a[i].name, a[i].all);
        for(j=0;j<5;j++)
            if(a[i].score[j]<80)        //找出低于80分的功课
                switch (j){
                        case 0:printf("数学低于80分;");
                        break;
                        case 1:printf("语文低于80分;");
                        break;
                        case 2:printf("物理低于80分;");
                        break;
                        case 3:printf("化学低于80分;");
                        break;
                        case 4:printf("英语低于80分;");
                        break;
                    default:;
            }
        printf("\n");
    }
    return 0;
}

结果示例

由于30组数据太多,在此我只用了5组数据,选出前三名学生。这里也体现出定义数组用#define N 30来表示数组长度的好处。

【C语言习题】2016_5_2学生成绩排名
并列第三情况:
【C语言习题】2016_5_2学生成绩排名