Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 11.doc
Скачиваний:
3
Добавлен:
06.08.2019
Размер:
160.26 Кб
Скачать

Практика по программированию - 2012 ПЗ - II курс

Занятие №11

Тема: Двумерные массивы.

Цель: усвоить способы описания двумерных массивов, представление в памяти, способы их заполнения; формировать умения и навыки обработки элементов двумерных массивов.

Описание двумерных массивов.

Представьте себе таблицу, состоящую из нескольких строк. Каждая строка состоит из нескольких ячеек. Тогда для точного определения положения ячейки нам потребуется знать не одно число (как в случае таблицы линейной), а два: номер строки и номер столбца.

Структура данных в языке Паскаль для хранения такой таблицы называется двумерным массивом. Описать такой массив можно следующими способами:

1) Массив можно описать как одномерный, элементами которого, в свою очередь, являются одномерные массивы:

Const

n=2; m=3;

Type

MyArray1=array [1..m] of integer;

MyArray2=array [1..n] of MyArray1;

Var

V: MyArray1;

A: MyArray2;

В данном случае, переменная V объявлена как одномерный массив из трёх элементов целого типа, а переменная А описана как двумерный массив из двух строк, в каждую из которых включено по три элемента.

2) Описание массива можно сократить, исключив определение массива MyArray1 в определении типа MyArray2.

Const

n=2; m=3;

Type

MyArray2=array [1..n] of array [1..m] of integer;

Var

A: MyArray2;

3) Ещё более краткое описание массива А можно получить, указывая имя массива и диапазоны изменения индексов для каждой размерности массива.

Const

n=2; m=3;

Type

MyArray2=array [1..n,1..m] of integer;

Var

A: MyArray2;

4) Если же указанный тип используется для определения одного массива в программе, и массив не будет использоваться в качестве параметра подпрограммы, то удобно объявление массива в разделе описания переменных.

Const

n=2; m=3;

Var

A: array [1..n,1..m] of integer;

Приведенные описания совершенно равноправны.

Отдельный элемент двумерного массива адресуется, естественно, двумя индексами. Например, ячейка, находящаяся в 1-й строке и 3-м столбце будет называться A[1][3] или A[1,3].

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

Инициализация двумерных массивов

Очень часто значения элементов массива вводятся с клавиатуры.

Пример.

Ввод прямоугольной таблицы (матрицы) данных B состоящей из 15 элементов (3 строки и 5 столбцов).

For i:=1 to 3 do

For j:=1 to 5 do

begin

Write('b[',i,',',j,',']=');Readln(b[i,j]);

end;

Этот способ задания информации слишком трудоёмок при работе с массивами больших размеров. Для отладки широкого класса алгоритмов такой ввод информации должен быть заменён на формирование элементов массива случайным образом. Приведём пример процедуры формирования массива случайным образом. Эта процедура должна принять входными параметрами массив, количество строк и столбцов, заданные пользователем с клавиатуры в основном разделе операторов. Так как наша процедура будет воздействовать на пустой исходный массив, то его мы должны передать по ссылке. Количество строк столбцов достаточно передать копиями по значению.

procedure InputMas(var X:Myarray; n,m: integer);

Var

i,j:integer;

Begin

Randomize;

For i:= 1 to n do

For j:= 1 to m do

X[i,j]:=Random(50);

end;

Вывод элементов двумерного массива на экран

Вывод матриц в стандартной форме записи – по строкам и столбцам – выполняется при помощи оператора Writeln; (без параметра). Он используется после вывода текущей строки матрицы для перевода курсора в начало следующей строки экрана:

Пример.

Вывод прямоугольной таблицы (матрицы) данных B состоящей из 15 целочисленных элементов (3 строки и 5 столбцов).

For i:=1 to 3 do

begin

For j:=1 to 5 do Write(b[i,j]:4);

Writeln;

end;

Рассмотрим процедуру вывода элементов массива на экран.

procedure PrintMas(var X:Myarray; n,m: integer);

Var

i,j:integer;

Begin

For i:= 1 to n do

Begin

For j:= 1 to m do

Write(X[i,j]:5);

Writeln;

end;

end;

Прямоугольная таблица (матрица)

Матрица – прямоугольная таблица, состоящая из n – строк и m – столбцов.

A[i,j] – элемент матрицы (прямоугольной таблицы), который расположен на пересечении i – строки и j – столбца.

Пример. Вычислить сумму отрицательных элементов матрицы A(3 x 4).

Б

Program Otric;

Var

a:array[1..3,1..4]of integer;

i,j,s:integer;

Begin

{Ввод значений элементов матрицы}

For i:= 1 to 3 do

For j:= 1 to 4 do

begin

Write('a[',i,',',j,',']=');

Readln(a[i,j]);

end;

{Расчет суммы отрицательных элементов}

s:=0;

For i:= 1 to 3 do

For j:= 1 to 4 do

If a[i,j]<0 then s:=s+a[i,j];

{Вывод значений элементов матрицы}

Writeln('s=',s);

Readln;

End.

лок-схема:

Квадратная – матрица, у которой число строк равно числу столбцов (n = m).

Квадратная матрица имеет главную диагональ, в которую входят элементы, значения индексов которых равны (i = j). Эта диагональ соединяет левый верхний и правый нижний угол квадратной матрицы. Таким образом, диагональ составляют элементы: a[1,1], a[2,2], a[3,3], …, a[n,n].

Элементы квадратной матрицы, расположенные под главной диагональю, образуют нижний треугольник, расположенные над ней, - верхний треугольник.

Кроме главной диагонали, в квадратной матрице есть еще и побочная диагональ, которую составляют элементы, значения индексов которой удовлетворяют условию: i + j = n + 1.

Пример. В квадратной матрице A(n х n) заменить все элементы, расположенные ниже главной диагонали единицей (строк и столбцов не более 10).

Блок-схема:

Program Zamena;

Var

a:array[1..10,1..10] of real;

i,j,n:integer;

Begin

Write('Размер матрицы -');Readln(n);

For i:= 1 to n do

For j:= 1 to n do

begin

Write('a[',i,',',j,',']=');

Readln(a[i,j]);

end;

{Замена элементов на единицу}

For i:= 2 to n do

For j:= 1 to i-1 do a[i,j]:=1;

{Вывод измененной матрицы на экран}

For i:= 1 to n do

begin

For j:= 1 to n do Write(a[i,j]:3);

Writeln;

end;

Readln;

End.

Для замены на единицу элементов расположенных выше главной диагонали квадратной матрицы, произвести следующие изменения в программе:

For i:=1 to n do

For j:=n downto i+1 do a[i,j]:=1;

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

For i:=1 to n-1 do

For j:=1 to n-i do a[i,j]:=1;

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

For i:=2 to n do

For j:=n downto n-i+2 do a[i,j]:=1;

Пример. В матрице размером A(n х m) найти наибольший элемент в каждой строке (строк и столбцов не более 10).

Б

Program Max_str;

Var

a:array[1..10,1..10] of real;

max:real;

i,j,n,m:integer;

Begin

Write('Строк -');Readln(n);

Write('Столбцов -');Readln(m);

For i:= 1 to n do

For j:= 1 to m do

begin

Write('a[',i,',',j,',']=');

Readln(a[i,j]);

end;

{Находим максимальный элемент в строке}

For i:= 1 to n do

begin

max:=a[i,1];

For j:= 2 to m do

If a[i,j]>max then max:=a[i,j];

Writeln(i,’ строка -’,max:5:2);

end;

Readln;

End.

лок-схема:

Для поиска минимального элемента в каждой строке прямоугольной таблицы введите вместо переменной max переменную min, и измените знак

« > » на « < » в операторе условия If.

Если необходимо найти максимальные элементы в каждом столбце, в программе необходимо произвести следующие замены:

For j:= 1 to m do

begin

max:=a[1,j];

For i:= 2 to n do

If a[i,j]>max then max:=a[i,j];

Writeln(j,’ столбец -’,max:5:2);

end;

Для поиска минимального элемента в каждом столбце введите вместо переменной max переменную min, и измените знак « > » на « < » в операторе условия If.

Пример. Осуществить транспонирование матрицы A(n х m):

- с выводом элементов в новый массив В;

- изменения в исходной матрице А, вывод транспонированной А в качестве результата.

1 вариант. Если элементы строк матрицы A(n x m) присвоить соответствующим элементам столбцов матрицы B(m x n), то получим матрицу B, которая называется транспонированной по отношению к матрице A. Таким образом: A[i,j] = B[j,i].

Б

Program Transponir1;

Var

a,b:array[1..10,1..10]of integer;

i,j,n,m:integer;

Begin

Write('Строк -');Readln(n);

Write('Столбцов -');Readln(m);

{Ввод исходной матрицы}

For i:= 1 to n do

For j:= 1 to m do

begin

Write('a[',i,',',j,',']=');

Readln(a[i,j]);

end;

{Транспонирование исходной матрицы}

For i:= 1 to n do

For j:= 1 to m do b[j,i]:=a[i,j];

{Вывод транспонированной матрицы B}

For i:= 1 to m do

begin

For j:=1 to n do Write(b[i,j]:4);

Writeln;

end;

Readln;

End.

лок-схема:

2 вариант. Диагональные элементы в результате обмена остаются на своих местах, обмениваются местами элементы, расположенные симметрично относительно главной диагонали.

For i:=1 to n do{перебираем все строки массива}

For j:=1 to i-1 do {перебираем элементы до главной диагонали}

Begin r:=a[i,j]; a[i,j]:=a[j,i]; a[j,i]:=r; end.

Пример. Задать и распечатать массив 10×10, состоящий из целых случайных чисел в интервале [1,100]. Найти сумму элементов, лежащих выше главной диагонали.

Program M5;

Var

A:array[1..10,1..10] of integer;

i,K: Byte;

S:integer;

begin

S:=0;

for i:=1 to 10 do

begin

for K:=1 to 10 do

begin

A[I,K]:=Trunc(Random*100)+1;

write(A[I,K]:6);

if K>I then S:=S+A[I,K]

end;

writeln

end;

writeln('Сумма элементов выше гл. диагонали равнаV',S)

end.

Пример. Определить, есть ли в данном массиве элемент, равный 0.

Опишем логическую функцию, значение которой равно True, если такой элемент есть, и False в противном случае.

Function Check(X:Myarray; n,m: integer):boolean;

Var

i,j:integer;

Flag: Boolean;

Begin

Flag:= False; {Предполагаем, что искомого элемента в массиве нет}

i:= 1;

while not(Flag) and (i<=n) do {элемент не найден}

{и строки не закончились}

Begin

j:= 1;

while not(j<=m) and (X[i,j]<>0) do {перебираем все элементы текущей} {строки, пропуская ненулевые элементы}

Inc(j);

Flag:=not(j=m+1);{Если искомый элемент найден, то переменной Flag}

{присваиваем значение True}

Inc(i);

end;

Check:= Flag;

end;

Пример. Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали..

Заметим, что если массив является симметричным, то для него выполняется равенство A[i,j]=A[j,i] для всех i=1,…,n и j=1,…,n.

Function Sim(X:Myarray; n,m: integer):boolean;

Var

i,j:integer;

Flag: Boolean;

Begin

Flag:= True; {Предполагаем, что матрица симметрична}

i:= 2;

while Flag and (i<n) do

Begin

j:= 1;

while(j<i) and (X[i,j]= X[j,i]) do

Inc(j);

Flag:=(j=i);

Inc(i);

end;

Sim:= Flag;

end;

Пример. Дан квадратный массив А (n×n). Получить массив В из массива А удалением n–й строки и k-го столбца.

Program DeleteNK;

Const m=20;

Var

A:array[1..m,1..m] of integer;

B: array[1..m-1,1..m-1] of integer;

k,i,j,n: 1..m;

Begin

Write('Введите матрицу А:');

For i:= 1 to m do

For j:= 1 to m do

Read(A[I,j]);

Readln;

Write('Введите номер удаляемой строки-'); Readln (n);

Write('Введите номер удаляемого столбца-');Readln(k);

For i:= 1 to n-1 do

begin

For j:= 1 to k-1 do B[i,j]:=A[i,j];

For j:= k to m-1 do B[i,j]:=A[i,j+1];

end;

For i:=n to m-1 do

begin

For j:= 1 to k-1 do B[i,j]:=A[i+1,j];

For j:= k to m-1 do B[i,j]:=A[i+1,j+1];

end;

Writeln('Полученная матрица В:');

For i:= 1 to m-1 do

begin

For j:= 1 to m-1 do

Write(В[i,j],’ ’);

Writeln;

end;

Readln;

End.

Пример. Дана целочисленная матрица размером 20×30. Упорядочьте её строки по неубыванию суммы элементов строк.

Program Ordering;

Const n=20; n1=30;

Var A:array[1..n,1..n1] of integer;

k,i,j,m:1..n1;

r,s,s_max: integer;

Begin

Write('Введите матрицу А:');

For i:= 1 to n do

For j:= 1 to n1 do

Read(A[I,j]);

Readln;

{Сортировка по неубыванию выбором}

For k:= n downto 2 do

Begin

m:=1; {m–номер строки с максимальной суммой}

s_max:=0; {s_max–сумма элементов первой строки}

For j:= 1 to n1 do B[i,j]:=A[i,j];

s_max:= s_max:+A[1,j];

For i:=2 to k do

Begin

S:=0; {s–сумма элементов i-ой строки}

For j:= 1 to n1 do s:=s+A[i,j];

if s> s_max then

Begin

s_max:=s;

m:=i;

end;

end;

if k<>m then

{перестановка m-й и k–й строк}

For j:= 1 to n1 do

Begin

r:=A[k,j];

A[k,j]:=A[m,j];

A[m,j]:=r;

end;

end;

Writeln('Полученная матрица В:');

For i:= 1 to n do

begin

For j:= 1 to n1 do

Write(A[i,j],’ ’);

Writeln

end;

Readln;

End.

Если модель данных в какой-либо задаче не может свестись к линейной или плоской таблице, то могут использоваться массивы произвольной размерности. N-мерный массив характеризуется N индексами.

Формат описания такого типа данных:

Type

<Имя типа>=Array[<диапазон индекса1>,<диапазон индекса2>,...

<диапазон индекса N>] Of <тип компонент>;

Отдельный элемент именуется так:

<Имя массива>[<Индекс 1>,<Индекс 2>,...,<Индекс N>]

Лабораторная работа №11

Тема: «Решение задач обработки двумерных массивов»

Цель: получение практических навыков при работе с массивами, их ввода, вывода; закрепление навыков по организации программ циклической структуры. Овладение навыками по организации программ вложенной циклической структуры.

Задание №1

  1. Дана квадратная матрица порядка N. Составить программу, транспонирующую эту матрицу. (Транспонированной называется матрица, в которой, в отличие от исходной матрицы, столбцы и строки поменяны местами).

  1. Составить программу, которая находит максимальные элементы каждой строки двумерной матрицы А, состоящей из m строк и n столбцов.

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

  1. Дана прямоугольная матрица размера m×n. Составить программу, которая находит строки с наибольшей и наименьшей суммой элементов. Вывести найденные строки и суммы их элементов.

  1. Составить программу, которая в двумерной В, состоящей из m строк и n столбцов, подсчитывает суммы столбцов и столбец с наименьшей суммой элементов обнуляет.

  1. Дана квадратная матрица А порядка n. Составить программу, которая находит максимальный элемент и все элементы, расположенные в одной строке и в одном столбце с максимальным заменяет на нули. Учесть, что значения в массиве не повторяются.

  1. Дана квадратная матрица А порядка n. Составить программу, которая находит минимальный элемент и все элементы, расположенные в одной строке и в одном столбце с минимальным заменяет на минимальное значение. Учесть, что значения в массиве не повторяются.

  1. Дана квадратная матрица А порядка n. Составить программу, которая находит минимальный элемент каждого столбца.

  1. Дана прямоугольная матрица размером N×M. Составить программу, которая преобразует матрицу следующим образом: поэлементно вычитает последнюю строку из всех строк, кроме последней.

  1. Дана прямоугольная матрица В размером N×M. Составить программу, которая преобразует матрицу следующим образом: поэлементно вычитает первый столбец из всех столбцов, кроме первого.

  1. Дана прямоугольная матрица размера m×n. Составить программу, которая находит столбцы с наибольшей и наименьшей суммой элементов. Вывести найденные столбцы и суммы их элементов.

  1. Дана целочисленная прямоугольная матрица размера m×n. Составить программу, которая находит номер столбца, в котором находится самая длинная серия одинаковых элементов.

  1. Дана прямоугольная матрица размера m×n. Составить программу, которая находит количество строк, среднее арифметическое элементов которых меньше заданной величины.

Задание №2

  1. Сформировать квадратную матрицу порядка n по заданному образцу: 1 2 3 … n-2 n-1 n 2 3 4 … n-1 n 0 3 4 5 … n 0 0 …………………………… n-1 n 0 … 0 0 0 n 0 0 … 0 0 0

  1. Сформировать квадратную матрицу порядка n по заданному образцу: n n-1 n-2 … 3 2 1 n-1 n-2 n-3 … 2 1 0 n-2 n-3 n-4 … 1 0 0 …………………………… 1 0 0 … 0 0 0

  2. Сформировать квадратную матрицу порядка n по заданному образцу: n 0 0 … 0 0 0 n-1 n 0 … 0 0 0 n-2 n-1 n … 0 0 0 …………………………… 2 3 4 … n-1 n 0 1 2 3 … n-2 n-1 n

  1. Сформировать квадратную матрицу порядка n по заданному образцу: 1 2 3 … n n n-1 n-2 … 1 1 2 3 … n n n-1 n-2 … 1 ……………………. n n-1 n-2 … 1

  2. Сформировать квадратную матрицу порядка n по заданному образцу: 0 0 0 … 0 0 1 0 0 0 … 0 2 0 0 0 0 … 3 0 0 ………………………….. 0 n-1 0 … 0 0 0 n 0 0 … 0 0 0

  1. Сформировать квадратную матрицу порядка n по заданному образцу: 1 1 1 … 1 1 1 1 0 0 … 0 0 1 1 0 0 … 0 0 1 ………………………….. 1 0 0 … 0 0 1 1 1 1 … 1 1 1

  2. Сформировать квадратную матрицу порядка n по заданному образцу: n 0 0 … 0 0 0 0 n-1 0 … 0 0 0 0 0 n-2 … 0 0 0 ………………………….. 0 0 0 … 0 2 0 0 0 0 … 0 0 1

  3. Сформировать квадратную матрицу порядка n по заданному образцу: 1∙2 0 0 … 0 0 0 0 2∙3 0 … 0 0 0 0 0 3∙4 … 0 0 0 ……………………………. 0 0 0 … 0 (n-1)∙n 0 0 0 0 … 0 0 n∙(n+1)

  4. Сформировать квадратную матрицу порядка n по заданному образцу: 1 1 1 … 1 1 1 2 2 2 … 2 2 0 3 3 3 … 3 0 0 ………………………….. n-1 n-1 0 … 0 0 0 n 0 0 … 0 0 0

  1. Сформировать квадратную матрицу порядка n по заданному образцу: 0 0 0 … 0 0 0 1 0 … 0 0 0 0 2 … 0 0 ……………………. 0 0 0 … 0 n-1

  2. Сформировать квадратную матрицу по заданному образцу: 1 1 1 … 1 1 1 0 1 1 … 1 1 0 0 0 1 … 1 0 0 ………………………… 0 0 1 … 1 0 0 0 1 1 … 1 1 0 1 1 1 … 1 1 1

  3. Сформировать квадратную матрицу порядка n по заданному образцу: 1 2 3 … n-2 n-1 n 0 1 2 … n-3 n-2 n-1 0 0 1 … n-4 n-3 n-2 …………………………….. 0 0 0 … 0 0 1

  4. Сформировать квадратную матрицу порядка n по заданному образцу:

n n-1 n-2 … 3 2 1 n-1 n-2 n-3 … 2 1 0 n-2 n-3 n-4 … 1 0 0 …………………………… 1 0 0 … 0 0 0

Задание №3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]