【代码】
#include <stdio.h>
#include<stdlib.h>
#define M 5
#define N 4
void input(int (*p)[N])
{
int i, j;
printf("请按下列格式输入学生信息(5位学生,总分一行先由零代替):\n");
printf("------------------------------------------------------------------\n");
printf("高等数学\t线性代数\t概率论\t总分\n");
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
scanf_s("%d", *(p + i) + j);
}
void print(int(*p)[N])
{
int i, j;
printf("\n");
printf("高等数学\t线性代数\t概率论\t总分\n");
printf("------------------------------------------------------------------\n");
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
printf("%5d\t\t", *(*(p + i) + j));
printf("\n");
}
}
void sumarr(int (*p)[N], int sum[])
{
int i, j,k;
//把二维列表每一行总分算出来,存在sum里
for (i=0;i<M;i++)
for (j = 0; j < N; j++)
{
sum[i] += *(*(p + i) + j);
}
//把每一行的第四列改成sum
for (i = 0; i < M; i++)
*(*(p + i) + 3) = sum[i];
}
void sorted(int score[][N])
{
int i, j,temp[N],maxindex,k,a;
for (i = 0; i < M; i++)//遍历每一行
{
maxindex = i;
for (j = i + 1; j < M; j++)
if (score[j][3] > score[maxindex][3])
maxindex = j;
if (i != maxindex)//交换第i行和第maxindex行
{
for (k = 0; k < N; k++)
for (a = 0; a < N; a++)
temp[k] = score[i][a];
for (k = 0; k < N; k++)
for (a = 0; a < N; a++)
score[i][a]=score[maxindex][k];
for (k = 0; k < N; k++)
for (a = 0; a < N; a++)
score[maxindex][k]=temp[a];
}
}
}
int main()
{
int score[M][N];
int sum[M] = { 0 };
input(score);
sumarr(score, sum);
sorted(score);
print(score);
return 0;
}
【解释】
笔者先建立一个五行四列的二维数组,然后把数据输入其中,由于总分一列是暂时缺省的,我们暂时以0代替。
然后将每一行的数值相加,存放在元素个数为五的一维列表。
之后将该一维列表所有的值复制到二位列表的总分一列。
然后是排序,遍历二维数组每一行,找到这一行之后总分最大的那一行,再把这一行与那一行的所有元素进行交换。所以我们事先还是要定义一个用于二维数组行与行交换的一维数组temp[N]。