Перевести код работы с матрицей из Паскаля в Си - 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;
}

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

  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