Перевести код работы с матрицей из Паскаля в Си - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. uses crt;
  2. const n=4;
  3. type Tmatr=array[1..n,1..n] of real;
  4. procedure Vvod(var mt:Tmatr);
  5. var i,j:byte;
  6. begin
  7. for i:=1 to n do
  8. for j:=1 to n do
  9. mt[i,j]:=10*random-4;
  10. end;
  11. procedure Vyvod(var mt:Tmatr;c:char);
  12. var i,j:byte;
  13. begin
  14. writeln('Matrica ',c,':');
  15. for i:=1 to n do
  16. begin
  17. for j:=1 to n do
  18. write(mt[i,j]:6:2);
  19. writeln;
  20. end;
  21. end;
  22. function Norma(mt:Tmatr):real;
  23. var i,j:byte;
  24. sum,max:real;
  25. begin
  26. max:=abs(mt[1,1]);
  27. for i:=1 to n do
  28. for j:=1 to n do
  29. if abs(mt[i,j])>max then max:=abs(mt[i,j]);
  30. Norma:=max;
  31. end;
  32. var a,b,c:Tmatr;
  33. minx,miny:byte;
  34. min:real;
  35. ch:char;
  36. begin
  37. clrscr;
  38. randomize;
  39. Vvod(a);
  40. Vyvod(a,'A');
  41. writeln('Norma A=',Norma(a):0:2);
  42. Vvod(b);
  43. Vyvod(b,'B');
  44. writeln('Norma B=',Norma(b):0:2);
  45. Vvod(c);
  46. Vyvod(c,'C');
  47. writeln('Norma C=',Norma(c):0:2);
  48. min:=Norma(a);
  49. ch:='A';
  50. if Norma(b)<min then
  51. begin
  52. min:=Norma(b);
  53. ch:='B';
  54. end;
  55. if Norma(c)<min then
  56. begin
  57. min:=Norma(c);
  58. ch:='C';
  59. end;
  60. write('Minimalnaya norma ');
  61. case ch of
  62. 'A':Vyvod(a,ch);
  63. 'B':Vyvod(b,ch);
  64. 'C':Vyvod(c,ch);
  65. end;
  66. readln
  67. end.

Решение задачи: «Перевести код работы с матрицей из Паскаля в Си»

textual
Листинг программы
  1. #include <stdlib.h>     // rand, qsort
  2. #include <time.h>       // time
  3. #include <stdio.h>      // puts, printf
  4. #include <math.h>       // fabs
  5.  
  6. #define N 3
  7. #define UNDEF_NORM (-1.0)
  8.  
  9. #define PASCAL_RANDOM (rand()/(RAND_MAX+1.0))
  10.  
  11. typedef struct matrix {
  12.     double number[N][N];
  13.     double norm;
  14. } *Matrix;
  15.  
  16. Matrix
  17. Matrix_Init(Matrix this)
  18. {
  19.     int i, j;
  20.     for( i = 0; i < N; ++i ) {
  21.         for( j = 0; j < N; ++j ) {
  22.             this->number[i][j] = PASCAL_RANDOM * 100.0 - 50.0;
  23.         }
  24.     }
  25.     this->norm = UNDEF_NORM;
  26.     return this;
  27. }
  28.  
  29. void
  30. Matrix_Print(Matrix this)
  31. {
  32.     int i, j;
  33.     for( i = 0; i < N; ++i ) {
  34.         for( j = 0; j < N; ++j ) {
  35.             printf("%.3lf\t", this->number[i][j]);
  36.         }
  37.         putchar('\n');
  38.     }
  39. }
  40.  
  41. double
  42. Matrix_GetNorm(Matrix this)
  43. {
  44.     if( this->norm == UNDEF_NORM ) {
  45.         double cur;
  46.         int i, j;
  47.         for( i = 0; i < N; ++i ) {
  48.             for( j = 0; j < N; ++j ) {
  49.                 cur = fabs(this->number[i][j]);
  50.                 if( cur > this->norm ) {
  51.                     this->norm = cur;
  52.                 }
  53.             }
  54.         }
  55.     }
  56.     return this->norm;
  57. }
  58.  
  59. compare_matrixes_by_norm(const void* const a,
  60.                          const void* const b)
  61. {
  62.     return Matrix_GetNorm(*(Matrix*) a) < Matrix_GetNorm(*(Matrix*) b)? -1 : 1;
  63. }
  64.  
  65. int main(void)
  66. {
  67.     srand(time(NULL));
  68.     struct matrix memory[3];
  69.     Matrix matrixes[] = {
  70.         Matrix_Init(&memory[0]),
  71.         Matrix_Init(&memory[1]),
  72.         Matrix_Init(&memory[2])
  73.     };
  74.     qsort(matrixes, 3, sizeof(Matrix), compare_matrixes_by_norm);
  75.     puts("Minimal matrix:");
  76.     Matrix_Print(matrixes[0]);
  77.     puts("Maximal matrix:");
  78.     Matrix_Print(matrixes[N-1]);
  79.     return 0;
  80. }

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: (для функций rand() и qsort()), (для функции time()), (для функций puts() и printf()), (для функции fabs()).
  2. Определяем значения N и UNDEF_NORM.
  3. Задаем функцию Matrix_Init(), которая инициализирует матрицу случайными числами от -50 до 50.
  4. Задаем функцию Matrix_Print(), которая выводит на экран значения матрицы.
  5. Задаем функцию Matrix_GetNorm(), которая вычисляет норму матрицы (если еще не вычислена).
  6. Задаем функцию compare_matrixes_by_norm(), которая сравнивает две матрицы по их нормам.
  7. В функции main() создаем массив структур matrix memory для хранения трех матриц.
  8. Инициализируем три матрицы с помощью функции Matrix_Init() и сохраняем их в массиве matrixes.
  9. Сортируем матрицы в порядке возрастания их норм с помощью функции qsort() и функции сравнения compare_matrixes_by_norm().
  10. Выводим на экран минимальную и максимальную матрицы с помощью функций puts() и Matrix_Print().
  11. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут