Pascal: Примеры задач с решением (многомерные массивы)

Задача 1.

Дана матрица NxM, состоящая из натуральных чисел. Выбрать в строках самые левые наименьшие элементы и поставить их в первый столбец. Для решения этой задачи нужно сначала найти самый левый минимальный элемент в строке и запомнить его местоположение, а затем поменять его местами с элементом в первом столбце.

Переменные:

a – двумерный массив;
n, m – количество строк и столбцов массива;
i, j – переменные цикла;
jm – столбец минимального элемента для каждой строки;
min – текущий минимум.

Алгоритм решения задачи:

  1. вводим размеры массива А и значения его элементов;
  2. просматриваем строки массива слева направо, ищем минимальное значение и запоминаем значения индексов;
  3. для каждой строки меняем местами минимальный элемент и элемент в первом столбце;
  4. выводим матрицу на экран.
const t=100; s=100;
var a : array [1..t,1..s] of integer;
    n, m, jm, i, j, min : integer;
begin
    write('Введите количество строк n=');
    readln(n);
    write('Введите количество столбцов m=');
    readln(m);
    for i:=1 to n do
      begin
         write('Вводите через пробел', m,'чисел');
         for j:=1 to m do
         read(a[i,j]);
      end;
   for i:=1 to n do
   begin
       min:= a[i,1];
       jm:=1;
         for j:=1 to m do
         if min > a[i,j]
               then
                    begin
                    jm:=j;
                    min:=a[i,j];
                    end;
         a[i,jm]:=a[i,1];
         a[i,1]:=min;
   end;
   for i:=1 to n do          {вывод матрицы на экран в виде таблицы}
   begin
       for j:=1 to m do
       write(a[i,j]:4);
       writeln;
   end
end.

Задача 2.

Дана квадратная матрица NxN, состоящая из натуральных чисел. Зеркально отразить ее элементы относительно побочной диагонали. Вывести результат на экран.

Рассмотрим матрицу 3×3 и посмотрим, что происходит с элементами при зеркальном отображении:

A11 A12 A13           A33 A23 A13
A21 A22 A23   <->  A32 A22 A12
A31 A32 A33           A31 A21 A11

Если считать, что после преобразования у нас появилась новая матрица B, то соответствие между элементами устанавливается следующим образом:

B11 <-> A33
B12 <-> A23
B21 <-> A32
B22 <-> A22 и т.д., т.е. B[I,J] <-> A[L,M]

Внимательно изучив соответствие, можно утверждать, что для элементов матрицы NxM справедлива следующая система уравнений:

I+M = N+1,
J+L = N+1.

Отсюда правило преобразования элементов выглядит следующим образом:

B[I,J] = A[N+1-J,N+1–I].

Переменные:

a, b – двумерные массивы;
m – количество строк и столбцов массива;
i, j – переменные цикла;
k– вспомогательная переменная.

Алгоритм решения задачи:

  1. вводим размеры массива A и присваиваем значения его элементам;
  2. присваиваем значения элементам матрицы B по представленным выше формулам и выводим их на экран.

Программа, решающая данную задачу, выглядит так:

const n=100;
var a,b : array [1..n] of integer;
    k, m, i, j : integer;
begin
       write('Введите размер матрицы m=');
       readln(m);
       writeln('Исходная матрица');
       k:=1;
       for i:=1 to m do
            for j:=1 to m do
             begin
                 a[i,j]:=k; k:=k+1;
                 if j

Задача 3.

Вычислить:

а) С = A + B

Создадим две процедуры:

1) tab_in ( var a1 : mas ) – для ввода элементов массива с клавиатуры. Параметр а1 – формируемый массив;
2) tab_out ( var b1 : mas ) – для вывода массива на экран. Параметр b1 – имя выводимого массива.

type mas=array [1..40,1..40] of real;
        vec=array[1..40] of real;
var a,b,c : mas;
      x,y : vec;
      i, j, n, k : integer;
      r, s : real;
procedure tab_in(var a1 : mas);
var i, j : integer;
begin
     for i:=1 to n do
         for j:=1 to n do
         read(a1[i,j]);
     writeln;
end;
procedure tab_out(var b1 : mas);
var i,j:integer;
begin
     for i:=1 to n do
     begin
         for j:=1 to n do
         write(b1[i,j]:7:3);
     writeln;
     end;
end;
begin
       writeln('Введите размер матрицы');
       readln(n);
       writeln('Введите матрицу A');
       tab_in(a);
       writeln('Введите матрицу B');
       tab_in(b);
       writeln('Матрица A');
       tab_out(a);
       writeln('Матрица B');
       tab_out(b);
       for i:=1 to n do
           for j:=1 to n do
              c[i,j]:=a[i,j]+b[i,j];
       writeln('Полученная матрица C=A+B');
       tab_out(c);
end.

б) y = A * x

Основная программа

begin
      writeln('Введите размер матрицы');
      readln(n);
      writeln('Введите матрицу A');
      tab_in(a);
      writeln('Введите вектор x');
      for i:=1 to n do read(x[i]);
      writeln;
      writeln('Матрица A');
      tab_out(a);
      writeln('Введенный вектор x');
      for i:=1 to n do write(x[i]:7:2);
      writeln;
      for i:=1 to n do
      begin
            s:=0;
            for j:=1 to n do
                     s:=s+A[i,j]*x[j];
            y[i]:=s
      end;
      writeln('Полученный вектор y=A*x');
      for i:=1 to n do
      write (y[i]:7:3);
      writeln;
end.

в) С = A * B

Основная программа

begin
       writeln('Введите размер матрицы');
        readln(n);
        writeln('Введите матрицу A');
        tab_in(a);
        writeln('Введите матрицу B');
        tab_in(b);
        writeln('Матрица A');
        tab_out(a);
         writeln('Матрица B');
        tab_out(b);
        for i:=1 to n do
             for j:=1 to n do
             begin
                     s:=0;
                     for k:=1 to n do
                             s:=s+a[i,k]*b[k,j];
                     c[i,j]:=s;
            end;
        writeln('Полученная матрица C=A+B');
        tab_out(c);
end.

г) транспонированную матрицу B

Основная программа:

begin
        writeln('Введите размер матрицы');   readln(n);
        writeln('Введите матрицу B'); tab_in(b);
        writeln('Матрица B'); tab_out(b);
        for i:=1 to n–1 do
              for j:=i+1 to n do
              begin
                  r:=b[i,j]; b[i,j]:=b[j,i]; b[j,i]:=r;
             end;
        writeln;
        writeln('Полученная транспонированная матрица B');
        tab_out(b);
end.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *