题目内容:
编写函数,使用指针对学生成绩单进行冒泡排序,从小到大。成绩单的内容包括学号和成绩,学号和成绩都是整数,成绩相同时学号小的在前。要求函数中不出现下标运算。
编写主函数,输入若干学生的学号和成绩,以0 0 为结束标志。调用函数排序,在主函数中输出。学生总人数不超过100个。
输入格式:
若干行,每行是一个学生的学号和成绩,用空格隔开。以最后一行是0 0 ,为结束标志。
输出格式:
若干行,按成绩从大到小排序的名单。每行是一个学生的学号和成绩,用一个空格隔开。
输入样例:
1 81
2 62
3 67
0 0
输出样例:
2 62
3 67
1 81
#include <iostream>
using namespace std;
void sort(int a[100][2],int n)
{//形参是指向二维数组第一行第一列元素的指针
int (*p)[2],(*q)[2];//定义两个指向二维数组的行指针
for(p=a;p<a+n;p++)
{//遍历每一行
for(q=p;q<a+n;q++)
{
if(*(*q+1)<*(*p+1))
{//比较每一行的第一列元素
int tmp=*(*p);*(*p)=*(*q);*(*q)=tmp;//换两行的第零列
int t=*(*p+1);*(*p+1)=*(*q+1);*(*q+1)=t;//换两行的第一列
}
else if(*(*q+1)==*(*p+1))
{//如果两行第一列相等(成绩相同)
if(*(*q)<*(*p))
{
int tmp=*(*p);*(*p)=*(*q);*(*q)=tmp;//换两行的第零列
int t=*(*p+1);*(*p+1)=*(*q+1);*(*q+1)=t;//换两行的第一列
}
}
}
}
}
int main()
{
int a[100][2];//用一个整型的二维数组来存放数据
int i=0;
//输入数据
for(i=0;i<100;i++)
{
for(int j=0;j<2;j++)
{
cin>>a[i][j];
}
if(a[i][0]==0 && a[i][1]==0)
break;
}
sort(a,i);//冒泡排序
//输出数据
for(int k=0;k<i;k++)
{
for(int j=0;j<2;j++)
{
if(j==0)
cout<<a[k][j];
else
cout<<" "<<a[k][j];
}
cout<<endl;
}
}