Перевести код работы с матрицей из Паскаля в Си - C (СИ)
Формулировка задачи:
uses crt; const n=4; type Tmatr=array[1..n,1..n] of real; procedure Vvod(var mt:Tmatr); var i,j:byte; begin for i:=1 to n do for j:=1 to n do mt[i,j]:=10*random-4; end; procedure Vyvod(var mt:Tmatr;c:char); var i,j:byte; begin writeln('Matrica ',c,':'); for i:=1 to n do begin for j:=1 to n do write(mt[i,j]:6:2); writeln; end; end; function Norma(mt:Tmatr):real; var i,j:byte; sum,max:real; begin max:=abs(mt[1,1]); for i:=1 to n do for j:=1 to n do if abs(mt[i,j])>max then max:=abs(mt[i,j]); Norma:=max; end; var a,b,c:Tmatr; minx,miny:byte; min:real; ch:char; begin clrscr; randomize; Vvod(a); Vyvod(a,'A'); writeln('Norma A=',Norma(a):0:2); Vvod(b); Vyvod(b,'B'); writeln('Norma B=',Norma(b):0:2); Vvod(c); Vyvod(c,'C'); writeln('Norma C=',Norma(c):0:2); min:=Norma(a); ch:='A'; if Norma(b)<min then begin min:=Norma(b); ch:='B'; end; if Norma(c)<min then begin min:=Norma(c); ch:='C'; end; write('Minimalnaya norma '); case ch of 'A':Vyvod(a,ch); 'B':Vyvod(b,ch); 'C':Vyvod(c,ch); end; readln end.
Решение задачи: «Перевести код работы с матрицей из Паскаля в Си»
textual
Листинг программы
#include <stdlib.h> // rand, qsort #include <time.h> // time #include <stdio.h> // puts, printf #include <math.h> // fabs #define N 3 #define UNDEF_NORM (-1.0) #define PASCAL_RANDOM (rand()/(RAND_MAX+1.0)) typedef struct matrix { double number[N][N]; double norm; } *Matrix; Matrix Matrix_Init(Matrix this) { int i, j; for( i = 0; i < N; ++i ) { for( j = 0; j < N; ++j ) { this->number[i][j] = PASCAL_RANDOM * 100.0 - 50.0; } } this->norm = UNDEF_NORM; return this; } void Matrix_Print(Matrix this) { int i, j; for( i = 0; i < N; ++i ) { for( j = 0; j < N; ++j ) { printf("%.3lf\t", this->number[i][j]); } putchar('\n'); } } double Matrix_GetNorm(Matrix this) { if( this->norm == UNDEF_NORM ) { double cur; int i, j; for( i = 0; i < N; ++i ) { for( j = 0; j < N; ++j ) { cur = fabs(this->number[i][j]); if( cur > this->norm ) { this->norm = cur; } } } } return this->norm; } compare_matrixes_by_norm(const void* const a, const void* const b) { return Matrix_GetNorm(*(Matrix*) a) < Matrix_GetNorm(*(Matrix*) b)? -1 : 1; } int main(void) { srand(time(NULL)); struct matrix memory[3]; Matrix matrixes[] = { Matrix_Init(&memory[0]), Matrix_Init(&memory[1]), Matrix_Init(&memory[2]) }; qsort(matrixes, 3, sizeof(Matrix), compare_matrixes_by_norm); puts("Minimal matrix:"); Matrix_Print(matrixes[0]); puts("Maximal matrix:"); Matrix_Print(matrixes[N-1]); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
(для функций rand() и qsort()), (для функции time()), (для функций puts() и printf()), (для функции fabs()). - Определяем значения N и UNDEF_NORM.
- Задаем функцию Matrix_Init(), которая инициализирует матрицу случайными числами от -50 до 50.
- Задаем функцию Matrix_Print(), которая выводит на экран значения матрицы.
- Задаем функцию Matrix_GetNorm(), которая вычисляет норму матрицы (если еще не вычислена).
- Задаем функцию compare_matrixes_by_norm(), которая сравнивает две матрицы по их нормам.
- В функции main() создаем массив структур matrix memory для хранения трех матриц.
- Инициализируем три матрицы с помощью функции Matrix_Init() и сохраняем их в массиве matrixes.
- Сортируем матрицы в порядке возрастания их норм с помощью функции qsort() и функции сравнения compare_matrixes_by_norm().
- Выводим на экран минимальную и максимальную матрицы с помощью функций puts() и Matrix_Print().
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д