[C++]PAT乙级1004. 成绩排名 (20/20)

/*
1004. 成绩排名 (20)

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

输入格式:每个测试输入包含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
*/
/*
    思路:
        使用两个学生结构体变量存储最大值与最小值,一边录入,一边比较当前学生成绩与最值。

    创新点:
        1.可以不需要使用数组存储所有学生的数据,使用两个学生结构体变量即可,大幅减少空间开支。
        2.注意unsigned在本题中对于max赋初始值(m<0时)不适用,所以不推荐。
*/
#include <stdio.h>
using namespace std;

const int MAXLENGTH = 20;

struct Student{
    char sname[MAXLENGTH];//student's name
    char sno[MAXLENGTH];//student's no
    int score;//course score
}max,min,tmp;

void print_student(Student *students,int size,int idx){
    if(idx == -1){ //print all
        for(int i=0;i<size;i++){
            printf("%s %s %d
", students[i].sname, students[i].sno, students[i].score);
        }
    } else {
        printf("%s %s
", students[idx].sname, students[idx].sno);
    }
}

int main()
{
    int studentAmount=-1;
    scanf("%d", &studentAmount);

    max.score = -1;
    min.score = 101;

    //1.input students' data
    //2.record student's index of maximal score or minimal score
    while(studentAmount--){
        scanf("%s", &tmp.sname);
        scanf("%s", &tmp.sno);
        scanf("%d", &tmp.score);
        if(tmp.score > max.score){
            max = tmp;
        }
        if(tmp.score < min.score){
            min = tmp;
        }
    }

    //output students' data
    printf("%s %s
", max.sname, max.sno);
    printf("%s %s
", min.sname, min.sno);

    return 0;
}

  

原文地址:https://www.cnblogs.com/johnnyzen/p/8812849.html