1. 主页
  2. 文档
  3. Level2题解(11-20)
  4. 第18课 结构体

第18课 结构体

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

文章