PAT_B_1004 成績排名

題目描述:測試

讀入 n(>0)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。

輸入格式:
每一個測試輸入包含 1 個測試用例,格式爲

第 1 行:正整數 n
第 2 行:第 1 個學生的姓名 學號 成績
第 3 行:第 2 個學生的姓名 學號 成績
  ... ... ...
第 n+1 行:第 n 個學生的姓名 學號 成績
其中姓名和學號均爲不超過 10 個字符的字符串,成績爲 0 到 100 之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。

輸出格式:
對每一個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字符串間有 1 空格。

輸入樣例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
輸出樣例:
Mike CS991301
Joe Math990112

本人AC代碼:spa

//   PAT_1 成績排名 

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

//  將學生結構體定義爲指針類型 
typedef struct student
{
    char Name[11];
    char Number[11];
    int Score;
}*Student;

int main(void)
{
    int n;    //  表明學生人數 
    scanf("%d",&n);
    Student S; // 指針類型 
    int i;
    int flag_min, flag_max; // 僅用下標表明最大最小值項 
    
    //  動態分配內存? 
    // *************************************************
    //  此處存在很大問題 
    S = (Student)malloc(n*40*sizeof(Student));
    //  判斷內存是否分配成功  
    if (NULL == S) 
    {
        // 內存分配失敗!
        exit(-1);
    }
    
    for (i=0; i<n; i++)
    {
        scanf("%s%s %d",S[i].Name, S[i].Number, &S[i].Score);
    }
//  注:在輸入字符串的時候能夠考慮如下輸入方法
//    scanf ("%s%d %c%s", stu[i].name, &stu[i].age, &stu[i].sex, stu[i].num);  // %c前面要加空格, 否則輸入時會將空格賦給%c
    
    // 對學生成績進行排名
        // 找出最小值 
    flag_min = 0;
    flag_max = 0;
    
    for (i=1; i<n; i++)
    {
        //  比較完成績移動誰? 
        if (S[flag_min].Score > S[i].Score)
            flag_min = i;
            
        if (S[flag_max].Score < S[i].Score)
            flag_max = i;
    }

    printf("%s %s\n",S[flag_max].Name,S[flag_max].Number);
    printf("%s %s\n",S[flag_min].Name,S[flag_min].Number);
        
    free(S); // 釋放指針 
    
    return 0;
}
相關文章
相關標籤/搜索