读入 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
这题成就感拉满了啊哈哈
第一次用class来解决这种问题,而且一次就AC,简直不要太爽
思路:刚看到这题,就考虑用结构体或类,我选了类
新建一个类来储存姓名,学号,成绩,全为public变量,这样就不用再多写接口了(其实是懒)
class info{ public: string name; string number; int grade; };
当然类里还需要一些函数,下面会说
新建好info类之后,当然要将数据读入,这里要用到info类型的数组来储存n个信息
读入数据之后,根据题意,需要排序,这里使用比较简单的冒泡排序
void sort(info *a,int begin,int end){ info tmp; for(int i=begin;i<=end;i++){ for(int j=i+1;j<=end;j++){ if(a[i].grade<a[j].grade){ tmp=a[i]; a[i]=a[j]; a[j]=tmp; } } } }
排序中用到了=运算符,这里需要重载一下
info& operator=(info a){ this->name=a.name; this->number=a.number; this->grade=a.grade; return *this; }
排好序之后,将成绩最高和最低的info输出即可
完整代码如下:
#include<iostream> #include<string> #include<algorithm> using namespace std; class info{ public: string name; string number; int grade; info& operator=(info a){ this->name=a.name; this->number=a.number; this->grade=a.grade; return *this; } }; void sort(info *a,int begin,int end){ info tmp; for(int i=begin;i<=end;i++){ for(int j=i+1;j<=end;j++){ if(a[i].grade<a[j].grade){ tmp=a[i]; a[i]=a[j]; a[j]=tmp; } } } } int main(){ int n; cin>>n; info * arr; arr=new info[n]; for(int i=0;i<n;i++){ cin>>arr[i].name>>arr[i].number>>arr[i].grade; } sort(arr,0,n-1); cout<<arr[0].name<<" "<<arr[0].number<<endl; cout<<arr[n-1].name<<" "<<arr[n-1].number<<endl; return 0; }
原文:https://www.cnblogs.com/CrossingX/p/10885512.html