PAT_B_1004 成绩排名

题目描述:

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:
每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
  ... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112

本人AC代码:

//   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;
}

猜你喜欢

转载自www.cnblogs.com/Robin5/p/10905457.html