fork download
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. float** matrix_read(FILE* _in, int* N);
  4. void matrix_free(float** m, int N);
  5. void matrix_ssort(float** m, int N);
  6.  
  7.  
  8. int main(void){
  9. int n, i, j;
  10. float** m = matrix_read(stdin, &n);
  11. /* из файла
  12. FILE* fp = fopen("file.txt", "rt");
  13. float** m = matrix_read(fp, &n);
  14. if(m == NULL)
  15. return 1;
  16. fclose(fp);
  17. */
  18. //иходный вывод матрицы
  19. for(i = 0; i < n; ++i){
  20. for(j = 0; j < n; ++j)
  21. printf("%g ", m[i][j]);
  22. putchar('\n');
  23. }
  24. putchar('\n');
  25.  
  26. matrix_ssort(m, n);
  27.  
  28. //вывод после сортировки
  29. for(i = 0; i < n; ++i){
  30. for(j = 0; j < n; ++j)
  31. printf("%g ", m[i][j]);
  32. putchar('\n');
  33. }
  34. matrix_free(m, n);
  35. return 0;
  36. }
  37.  
  38. //выборочная сортировка диагоналей матрицы по убыванию
  39. void matrix_ssort(float** m, int N){
  40. int r, c, r0, c0, r1, c1, r2, c2;
  41. float t;
  42.  
  43. r0 = N - 2;
  44. c0 = 0;
  45. while(c0 < (N - 1)){
  46. r = r0;
  47. c = c0;
  48. while((r < N) && (c < N)){
  49. r2 = r;
  50. c2 = c;
  51. for(r1 = r + 1, c1 = c + 1; (r1 < N) && (c1 < N); ++r1, ++c1){
  52. if(m[r1][c1] > m[r2][c2]){
  53. r2 = r1;
  54. c2 = c1;
  55. }
  56. }
  57.  
  58. if((r2 != r) || (c2 != c)){
  59. t = m[r][c];
  60. m[r][c] = m[r2][c2];
  61. m[r2][c2] = t;
  62. }
  63. ++r;
  64. ++c;
  65. }
  66.  
  67. if(r0 > 0)
  68. --r0;
  69. else if(! r0)
  70. ++c0;
  71. }
  72. }
  73.  
  74. //чтение матрицы из файла или консоли
  75. float** matrix_read(FILE* _in, int* N){
  76. float** m;
  77. int i, j, n = 0;
  78. if((fscanf(_in, "%d", &n) != 1) || (n < 2))
  79. return NULL;
  80.  
  81. m = (float**)malloc((size_t)n * sizeof(float*));
  82. if(m == NULL)
  83. return NULL;
  84.  
  85. for(i = 0; i < n; ++i){
  86. m[i] = (float*)malloc((size_t)n * sizeof(float));
  87. if(m[i] == NULL)
  88. goto err;
  89.  
  90. for(j = 0; j < n; ++j){
  91. if(fscanf(_in, "%f", &m[i][j]) != 1)
  92. goto err;
  93. if(ferror(_in) != 0)
  94. goto err;
  95. }
  96. }
  97. *N = n;
  98. return m;
  99. err:
  100. for(j = i - 1; j >= 0; --j)
  101. free(m[j]);
  102. free(m);
  103. *N = 0;
  104. return NULL;
  105. }
  106.  
  107. //удаление матрицы
  108. void matrix_free(float** m, int N){
  109. int i;
  110. for(i = 0; i < N; ++i)
  111. free(m[i]);
  112. free(m);
  113. }
Success #stdin #stdout 0s 2296KB
stdin
5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
stdout
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

5 5 5 5 5 
4 4 4 4 4 
3 3 3 3 3 
2 2 2 2 2 
1 1 1 1 1