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