排序:
例题:要求输入学生成绩的同时输入学生的学号,并且将学生的学号随分数排序结果一同输出。
#include <stdio.h>
#define N 40
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
void PrintScore(int socre[],long num[],int n);
int main(void)
{
int score[N],n;
long num[N];
n=ReadScore(score,num);//输入成绩和学号,返回学生总数
printf("Total students are %d\n",n);
DataSort(score,num,n);//成绩排序
printf("Sorted scores:\n");
PrintScore(score,num,n);//输出成绩排序结果
return 0;
}
//函数功能:输入学生的学号即某门课成绩,当输入负值时,结束输入,返回学生人数
int ReadScore(int score[],long num[])
{
int i=-1;//i初始化为-1,可保证循环体内i增1后数组下标从0开始
do
{
i++;
printf("Input Student`s ID and score:");
scanf("%ld%d",&num[i],&score[i]);//以长整型个数输入学号
}while(num[i]>0&&score[i]>=0);//输入负值时,结束成绩输入
return i;//返回学生总数
}
//函数功能:用选择法按score数组元素的降序顺序对score和num排序
void DataSort(int score[],long num[],int n)
{
int i,j,k,temp1;
long temp2;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(score[j]>score[k])//按数组score的元素值从高到低排序
{
k=j;//记录最大数下标位置
}
}
if(k!=i)//若最大数不在下标位置i
{
temp1=score[k];//交换成绩
score[k]=score[i];
score[i]=temp1;
temp2=num[k];//交换学号
num[k]=num[i];
num[i]=temp2;
}
}
}
//函数功能:打印学生学号和成绩
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%10ld%4d\n",num[i],score[i]);//以长整形格式打印学号
}
}