Страницы

Уроки 51, 52 Строки и столбцы матрицы

Заполнение массива случайными элементами

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

Procedure zap(Var A : mas; var n, m: integer);
Var i, j : integer;
Begin

assign(input,'input.txt');
reset(input);
readln(n,m);
close(input);
Randomize;
for i := 1 to n do {просматривая последовательно строки массива}
for j := 1 to m do {просмотрим каждую  ячейку массива текущего столбца}
a[i, j]:= Random(50); {и запишем туда случайное число в диапазоне [0..49]}
End;


Теперь, чтобы воспользоваться этой процедурой, достаточно вызвать ее в основном разделе программы.


Задания

Задание 1. Составьте программу формирования квадратной матрицы 10х10 случайными вещественными числами в диапазоне [-0.3,0.3). Вывести массив в файл. В работе использовать процедуры.


Формат вывода:
Построчно выводятся элементы таблицы с точностью до двух  знаков после запятой.

Примечание: Если мы хотим получить случайное число на промежутке от a до b, запишем формулу random(b-a+1)+a.


        Посмотреть решение       


Экспериментальный раздел 

1. Составьте программу формирования квадратной матрицы 10х10 случайными целыми числами в диапазоне [-4,10]. Вывести массив в файл. 

2. Составьте программу формирования матрицы mхn случайными целыми числами в диапазоне [x,y]. Вывести массив в файл. 


Вставка строк и столбцов

Допустим, необходимо вставить строку после k-ой строки.

Для решения задачи вставки строки необходимо:

1. Первые k строк оставить без изменения.

2. Все строки после k-ой сдвинуть на одну назад, это лучше сделать, начиная с последней строки и идти до (k+1)-ой.

3. Элементам строки k+1 присвоить заданное значение.

4. Увеличить количество строк.

5. Кроме того, необходимо изменить размерность массива. Так как мы вставляем строку, то число строк будет на одну больше.




Задание 2. Вставить строку из нулей после строки с номером k.

Формат ввода:
В первой строке вводятся числа n и m - количество строк и столбцов массива
Во второй строке вводится число k - номер строки
В следующих строках находятся элементы массива построчно

Формат вывода:
Построчно выводятся элементы таблицы с точностью до одного знака после запятой.

           Тесты         Посмотреть решение       

Рассмотрим процедуру вставки строки:

Procedure vstavka(Var A :mas; Var m, n : integer; k : integer);
Var i, j : integer;
Begin
for i := n downto k +1 do
for j := 1 to  m do
A[i+1, j] := A[i, j]; {элементу столбца j присваиваем элемент этого же столбца, но из предыдущей строки}
for j := 1 to m do
A[k+1, j]:=0; 

Inc(n);
End;

Экспериментальный раздел

1. Вставить столбец из нулей после столбца с номером k.

Для вставки столбца пользуемся правилом вставки строки, только размерность увеличивается для столбцов и сдвигаем  столбцы.

2. Вставить строку из нулей после строки с номером k, вставить столбец из нулей после столбца с номером t.



Задание 3. Напишите программу, содержащую процедуру вставки  столбца из заданного одномерного массива.

Формат ввода:
В первой строке вводятся числа n, m  - количество строк и столбцов массива
Во второй строке вводятся число k - номер столбца
В третьей строке находятся элементы одномерного массива
В следующих строках находятся элементы двумерного массива построчно

Формат вывода:
Построчно выводятся элементы таблицы с точностью до одного знака после запятой.

          Тесты      Посмотреть решение          

Примечание. Если необходимо вставить после строки, удовлетворяющей какому-либо условию, то надо найти, лишь ее номер и задача сводится к рассмотренной выше.

Если надо вставлять после всех строк с заданным условием, то надо увеличить размерность по строкам, и если строка удовлетворяет условию, то к ней применять вставку. При этом надо заметить, что лучше просматривать строки с последней и ввести счетчик вставленных строк.

Вставка перед строкой с данным номером отличается лишь тем, что сдвигать назад надо не с (k+1)-ой строки, а с k-ой.


Удаление строк и столбцов

Для решения задачи удаления строки необходимо:

1. Сдвинуть все строки, начиная с данной на одну вверх.

2.  Последнюю строку обнулить.

3. Уменьшить количество строк.


Процедура удаления строки:

Procedure Udal(k : integer);
Begin
for i := k to n-1 do
for j := 1 to m do
a[i, j] := a[i+1, j];
dec(n)
End;

Удаление столбца аналогично удалению строки.

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



Задание 4. Удалите строки, содержащие ноль, а затем столбцы, в которых только отрицательные элементы. Если такого столбца или строки нет, то вывести сообщение об этом.

Формат ввода:
В первой строке вводятся числа n и m - количество строк и столбцов массива
Во второй строке вводится число k - номер строки
В следующих строках находятся элементы массива построчно

Формат вывода:
Построчно выводятся элементы таблицы с точностью до одного знака после запятой.


         Тесты    Посмотреть решение          


Задачи для самостоятельного решения

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

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

3. Вставить перед всеми строками, в которых есть 0, первую строку, а после всех столбцов, в которых есть отрицательные элементы - первый столбец.

4. Вставить нулевую строку и столбец перед строкой и после столбца, в которых встретился элемент, равный сумме своих индексов. Если такого столбца или строки нет, то вывести сообщение об этом.

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