Перевести код работы с матрицей из Паскаля в Си - 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, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д