Q1.最高分数的学生姓名
方法一:定义两个数组,数组1存放分数,数组2存放姓名,遍历数组1找到最大值的下标,然后输出数组2对应下标的内容。
方法二:定义一个结构体,然后再定义这个结构体类型的数组,遍历结构体数组,找到分数最高的那个学生,输出名字。
#include<iostream>
#include<string>
using namespace std;
struct student { //定义一个名字是student的结构体
string name; //声明结构体的成员name,成员可以是基础数据类型,也可以是结构体
int grade; //再声明一个结构体的成员grade
}; //注意:结构体和函数不一样,后面要用分号结尾
int main() {
int n,max=-100,num=0;
student s[110]; //定义一个student类型的数组,与定义基础数据类型的数组方法是一样的
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i].grade>>s[i].name;
if(s[i].grade>max){ //记录最高的分数和它的下标
max=s[i].grade;
num=i; //最高分数的下标记录在num中
}
}
cout<<s[num].name;
return 0;
}
点击这里,进入结构体的参考链接。
Q3.谁考了第k名
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
分析:需要将学生按分数从高到低排序,再输出对应下标的学号和成绩。操作分为两步:1、先用结构体数组存储学生的学号和成绩;2、将结构体排序,可以用冒泡排序或选择排序。
#include<cstdio>
using namespace std;
struct student {
int no; //学号
float grade; //分数
};
int main() {
int n,k;
student s[110]; //定义学生类型的结构体数组
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d%g",&s[i].no,&s[i].grade); //输入学生的信息
}
for(int i=1;i<=n;i++){ //冒泡排序
int num=i;
for(int j=1;j<=n-num;j++){
if(s[j].grade<s[j+1].grade){ //将高分往前交换
student temp = s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
printf("%d %g",s[k].no,s[k].grade); //输出第k名的学号和分数
return 0;
}