3.指针实现成绩排序(10分)
题目内容:
编写函数,使用指针对学生成绩单进行冒泡排序,从小到大。成绩单的内容包括学号和成绩,学号和成绩都是整数,成绩相同时学号小的在前。要求函数中不出现下标运算。
编写主函数,输入若干学生的学号和成绩,以0 0 为结束标志。调用函数排序,在主函数中输出。学生总人数不超过100个。
输入格式:
若干行,每行是一个学生的学号和成绩,用空格隔开。以最后一行是0 0 ,为结束标志。
输出格式:
若干行,按成绩从大到小排序的名单。每行是一个学生的学号和成绩,用一个空格隔开。
输入样例:
1 81
2 62
3 67
0 0
输出样例:
2 62
3 67
1 81
#include <iostream>
using namespace std;
// 定义结构体
struct Stu
{
int id; // 学号
int score; // 成绩
};
// 定义交换函数,参数为两个指针,用于交换它们所指向的值
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
// 定义冒泡排序函数,参数为结构体数组和数组长度,用于对结构体数组按照分数从小到大进行冒泡排序
void mysort(struct Stu a[], int n)
{
struct Stu *p = a;
// 冒泡排序
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if ((p + j)->score > (p + j + 1)->score) // 按照分数从小到大排序
{
swap(&(p + j)->score, &(p + j + 1)->score); // 交换分数
swap(&(p + j)->id, &(p + j + 1)->id); // 交换学号
}
}
}
}
int main()
{
struct Stu a[100];
int n = 0;
// 读入结构体数组
for (int i = 0; i < 100; i++)
{
cin >> a[i].id >> a[i].score;
if (a[i].id == 0 && a[i].score == 0) // 如果读到了 id 和 score 均为 0 的结构体,则退出循环
break;
n++; // 数组长度加 1
}
// 调用冒泡排序函数,对结构体数组按照分数从小到大进行排序
mysort(a, n);
// 输出排序后的结构体数组
for (int i = 0; i < n; i++)
{
cout << a[i].id << " " << a[i].score << endl;
}
return 0;
}