【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來表示數組長度的好處。

在這裏插入圖片描述
並列第三情況:
並列第三情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章