題目描述:測試
讀入 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; }