Задача 42. Перестановка столбцов матрицы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Задача 42. Перестановка столбцов матрицы



Условие задачи. Дана матрица В. Поменять в ней местами столбцы с минимальным и максимальным элементами матрицы. Известно, что в матрице имеется только по одному элементу с минимальным и максимальным значением.

В этой задаче исходными данными является двумерный массив В и количество строк m и столбцов n, которые заранее неизвестны и вводятся с клавиатуры. Чтобы поменять местами столбцы, в которых расположены минимальный и максимальный элемент матрицы, необходимо найти номера этих столбцов. Для этого используем уже известный алгоритм нахождения наибольшего и наименьшего элементов матрицы. Выберем переменные для хранения наибольшего и наименьшего значений, например max и min, а также переменные, в которых будут храниться номера столбцов, где располагаются эти элементы, например, jmax и jmin. В переменные max и min сначала поместим значение первого элемента матрицы (элемента в левом верхнем углу В[1,1]) max =B[1,1] и min = max, а в переменных jmin и jmax запомним номер столбца этого элемента jmin = 1, jmax =1. Затем будем просматривать всю матрицу в любом порядке. Зададим внешний цикл по строкам i=1,n, а внутренний по столбцам j=1,m. В цикле сначала будем последовательно сравнивать очередной элемент матрицы с содержимым переменной max и если очередной элемент матрицы B[i,j] окажется больше max, то в переменную max запишем этот элемент max = B[i,j] а в переменной jmax запомним номер столбца этого элемента jmax =j. Иначе будем сравнивать очередной элемент матрицы с содержимым переменной min, и если очередной элемент матрицы B[i,j] окажется меньше min, то в переменную min перепишем этот элемент min = B[i,j], а в переменной jmin запомним номер столбца jmin =j.

Теперь, когда все элементы будут проверены, и номера столбцов для перестановки известны, можно начинать замену. Нам требуется последовательно менять местами элементы столбца с номером jmin с элементами столбца с номером jmax, т.е. элемент B[1,jmin] c элементом B[1,jmax], элемент B[2,jmin ]c элементом B[2,jmax]… элемент B[n,jmin] c элементом B[ n,jmax]. Перестановка двух элементов всегда осуществляется с использованием третьей вспомогательной переменной, например, buf. Для этого организуем цикл, который будет выполняться n раз i =1, n (столько раз, сколько строк в матрице и, следовательно, сколько элементов в столбце). В цикле последовательно осуществим перестановку, очередной пары элементов с номерами jmin и jmax, находящихся в i –ой строке, используя операторы buf=B[i,jmin]; B[i,jmin]= B[i,jm ax ]; B[i,jm ax ]= buf. При i=1 поменяются местами элемент B[1,jmin] c элементом B[1,jmax], при i =2 B[2,jmin] c элементом B[2,jmax], ….., при i = n B[ n,jmin] c элементом B[ n,jmax].

Структурированная запись алгоритма 42

1. Ввод количества строк матрицы n и количества столбцов m

2. Ввод элементов матрицы

3. Вывод исходной матрицы до перестановки

4. В переменные max и min заносится первый элемент матрицы max = B [1,1], min = max

5. В ячейках j max и j min запоминается номер столбца j max=1 и j min=1

6. Начало внешнего цикла по строкам i=1,n

7. Начало внутреннего цикла по столбцам j =1, m

7.1. Проверка условия: если B[i,j] < min, то

min = B[i,j] и jmin=j

7.2. Иначе проверка условия: если B[i,j] > max, то

max = B]i,j] и jmax=j

Конец внутреннего цикла по столбцам (по j)

Конец внешнего цикла по строкам (по i)

8. Повторять n раз (для перестановки. i =1, n)

8.1. Перестановка очередной пары элементов в столбцах
buf=B[i,jmin]
B[i,jmin]= B[i,jm ax ]

B [i,jm ax ]= buf

Конец цикла по i для перестановки

9. Вывод матрицы после перестановки

Схема алгоритма

Программа на языке Си

#include <stdio.h>

#include <conio.h>

#define N 20

#define M 12

int main()

{

clrscr();

double b[N][M],min,max,buf;

int n,m,jmin,jmax,i,j;

printf("Введите n и m");

scanf("%d%d",&n,&m);

printf("Введите элементы матрицы\n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

  scanf("%lf",&b[i][j]);

printf("Исходная матрица\n");

for(i=0;i<n;i++)

{

for(j=0;j<m;j++)

    printf("%5.1lf ",b[i][j]);

printf("\n");

}

min=max=b[0][0];

jmin=jmax=0;

for(i=0;i<n;i++)

for(j=0;j<m;j++)

    if(b[i][j]<min)

     { min=b[i][j];

       jmin=j;}

    else

       if (b[i][j]>max)

        { max=b[i][j];

            jmax=j;}

for (i=0;i<n;i++)

   {buf=b[i][jmin];

  b[i][jmin]=b[i][jmax];

  b[i][jmax]=buf;}

printf("Новая матрица\n");

 for(i=0;i<n;i++)

 {

   for(j=0;j<m;j++)

     printf("%5.1lf ",b[i][j]);

printf("\n");

}

   getch();

return 0;

}

Программа на языке Паскаль

Program main_42;

Var

i,j,jmin,jmax,n,m:integer;

min,max,buf: real;

b: array[1..20,1..12] of real;

begin

writeln('Введите n и m');

readln(n,m);

writeln('Введите элементы матрицы');

for i:=1 to n do

  for j:=1 to m do

    readln(b[i,j]);

writeln('Исходная матрица');

for i:=1 to n do

begin

for j:=1 to m do

    write(b[i,j]:5:1,' ');

    writeln;

end;

min:=b[1,1]; max:=min;

jmin:=1; jmax:=1;

for i:=1 to n do

for j:=1 to m do

begin

    if b[i,j]<min then

    begin

      min:=b[i,j];

      jmin:=j;

    end

    else

       if b[i,j]>max then

       begin

         max:=b[i,j];

         jmax:=j;

       end;

    end;

for i:=1 to n do

begin

buf:=b[i,jmin];

b[i,jmin]:=b[i,jmax];

b[i,jmax]:=buf;

end;

writeln('Новая матрица');

for i:=1 to n do

begin

for j:=1 to m do write(b[i,j]:5:1,' ');

writeln;

end;

end.

Программа на языке Фортран

Program main_42

Implicit none

integer n, m

   integer i, j, jmin, jmax

   real, allocatable:: b(:,:)

   real min, max, buf

   print *,'Введите n и m'

   read *, n, m

allocate (b(n,m))

print*,'Введите элементы матрицы'

read*,((b(i,j),j=1,m),i=1,n)

print'(A/<m>(F5.1,1x))','Исходная матрица', &

                   ((b(i,j),j=1,m),i=1,n)

min=b(1,1)

max=min

jmin=1

jmax=1

C1:do i=1,n

C2:do j=1,m

if(b(i,j)<min)then

      min=b(i,j)

    jmin=j

elseif(b(i,j)>max)then

    max=b(i,j)

    jmax=j

endif

еnddo C2

enddo C1

do i=1,n

buf=b(i,jmin)

b(i,jmin)=b(i,jmax)

b(i,jmax)=buf

enddo

print'(A)','Изменённая матрица'

print '(<m>(F5.1,1x))’,((b(i,j),j=1,m),i=1,n)

deallocate (b)

end program

Программа на языке Python

print("Введите n -- число строк матрицы B: ")

n=int(input())  

print("Введите m -- число столбцов матрицы B: ")

m=int(input())  

B = [] # Создаем пустой список строк

# в Python списки индексируются с 0:

for i in range(0, n):

B.append([])

# Добавляем пустой список элементов i-й строки

for j in range(0, m):

print("Введите B[{0},{1}]: ".format(i+1,j+1))

B[i].append(float(input()))

print("Исходная матрица до перестановки:")

for i in range(0, n):

for j in range(0, m):

print("{0:5.1}".format(B[i][j]),sep='',end=' ')

print(" ")

max = B[0][0]

min = max

jmax = 0

jmin = 0

for i in range(0, n):

for j in range(0, m):

if B[i][j] < min:

min = B[i][j]

jmin = j

elif B[i][j] > max:

max = B[i][j]

jmax = j

for i in range(0, n):

buf = B[i][jmin]

B[i][jmin] = B[i][jmax]

B[i][jmax] = buf

print("Матрица после перестановки:")

for i in range(0, n):

for j in range(0, m):

print("{0:5.1}".format(B[i][j]),sep='',end=' ')

print(" ")

Программа в системе Матлаб

n=input('Введите n=');

m=input('Введите m=');

disp('Введите эл. матрицы');

for i=1:n

for j=1:m

b(i,j)=input('b(i,j)=');

end

end

disp('исходная матрица')

disp(b)

min=b(1,1);

max=min;

jmin=1;

jmax=1;

for i=1:n

for j=1:m

if b(i,j)< min

    min=b(i,j);

    jmin=j;

elseif b(i,j)>max

    max=b(i,j);

    jmax=j;

end

end

end

for i=1:n

buf=b(i,jmin);

b(i,jmin)=b(i,jmax);

b(i,jmax)=buf;

end

disp('Измененная матрица')

disp(b)



Поделиться:


Последнее изменение этой страницы: 2021-04-12; просмотров: 831; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.125.7 (0.036 с.)