#include <stdio.h>
#define SIZEX 25
#define SIZEY  7
// prototype
void mysort();
void disp();

int a[SIZEX + 1][SIZEY] = {0}, cnt = 0, ord[6];

void mysort()
{
  int i, j, k, t;
  // 科目毎の合計点でsort
  for ( i = 1; i < 6; ++i) {
    // printf("%d\n", i);
    for ( j = i + 1; j < 6; ++j) {
      if (a[cnt][i] < a[cnt][j]) {
        for (k = 0; k <= cnt; ++k) {
          t = a[k][i];
          a[k][i] = a[k][j] ;
          a[k][j] = t ;
        }
        t = ord[i];
        ord[i] = ord[j];
        ord[j] = t;
      }
    }
  }
  // 学生毎の合計点でsort
  for ( i = 0; i < cnt; ++i) {
    for ( j = 0; j < cnt; ++j) {
      if (a[i][6] < a[j][6]) {
        for ( k = 0; k < 7; ++k) {
          t = a[i][k];
          a[i][k] = a[j][k] ;
          a[j][k] = t;
        }
      }
    }
  }
}

void disp()
{
  int i, j;
  printf("  番号 ");
  for ( i = 1; i <= 5; ++i)
    printf("   問%d", ord[i]);
  printf("  合計\n");
  for ( i = 0; i < cnt; ++i) {
    printf("%6d", a[i][0]);
    for ( j = 1; j < 6; ++j) printf("%6d", a[i][j]);
    printf("%6d\n", a[i][6]);
  }

  printf("  合計");
  for ( j = 1; j < 6; ++j)
    printf("%6d", a[cnt][j]);
  printf("%6d\n", a[cnt][6]);
}

int main()
{
  FILE *fp;
  int i, j, *p = *a;

  // データ読込
  fp = fopen("seiseki.dat", "r");
  for (p = *a; fscanf(fp, "%d", p) == 1; ++p)
    if (++cnt % 6 == 0)++p;
  cnt /= 6;
  for ( i = 1; i <= 5; ++i)ord[i] = i;

  // 合計計算
  for ( i = 0; i < cnt; ++i) {
    for ( j = 1; j < 6; ++j) {
      a[i][6] += a[i][j];
      a[cnt][j] += a[i][j];
      a[cnt][6] += a[i][j];
    }
  }

  // 表示
  printf("整列前\n");
  disp();
  mysort();
  printf("整列後\n");
  disp();

  return 0;
}
