Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие для учеников .doc
Скачиваний:
12
Добавлен:
18.12.2018
Размер:
2.27 Mб
Скачать

Решение

Для того чтобы заполнить массив указанным об­разом, надо вывести правило заполнения. В данном случае правило будет таким: если ряд нечетный (то есть когда номер строки − нечетное число), то А[i, j]=(i-1)*m+j, иначе (то есть когда строка чет­ная) A[i, j]=i*m-j+1. В соответствии с этим прави­лом составляем процедуру заполнения массива:

Program Example_121;

Procedure Fill (Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

For j:=1 To m Do

If i Mod 2=1 Then x[i, j]:=(i-1)*m+j

Else x[i, j]:=i*m-j+1;

End;

§48. Вставка и удаление элементов Вставка строки

Мы уже рассматривали операции вставки для одно­мерных массивов. Обобщим их для двухмерных.

Пример

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

Решение

Для решения этой задачи необходимо:

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

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

  3. Присвоить значения элементам (k+1) строки.

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

Program Example_122;

Const n=5; m:=7;

Type dmyarray=Array[1..n+1,1..m]

Of Integer;

Var A: dmyarray; k:Integer;

Теперь опишем процедуру вставки:

Procedure Insert(k1: Integer;

Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=n Downto k1+1 Do

For j:=1 To m Do x[i+1, j]:=x[i, j];

{Элементу столбца с номером j присваиваем

элемент этого же столбца, но из

предыдущей строки}

For j:=1 То m Do x[k1+1, j]:=0;

End;

Так как число строк меняется, то процедуру Print надо изменить. Она должна выводить указанное количест­во строк, начиная с первой:

Procedure Print1 (n1: Integer;

x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n1 Do

Begin

For j:=1 To m Do Write(x[i, j]: 4);

Writeln;

End;

End;

Часть основной программы будет такой:

Begin

Init(A);

Print(n, A);

Writeln ('Введите номер строки, после

которой надо вставить новую строку');

Readln(k);

Insert(k, A);

Print1(n+1, A);

Readln;

End.

Примечания

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

  2. Если надо вставлять новые строки после всех строк с заданным условием, то надо учесть это при описании масси­ва. Заметим, что удобнее просматривать строки с последней и ввести счетчик вставленных строк.

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

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

Удаление строки Пример

Удалить строку с номером k.

Решение

Дли того чтобы удалить строку с номером k, необходимо:

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

  • Последнюю строку "обнулить", то есть всем эле­ментам последней строки присвоить значение 0.

Описание массивов оставим прежним (размером nxm). Также в программе будем использовать процеду­ру вывода Print1 из предыдущего параграфа. Будем выводить на экран сначала все строки, а второй раз, после удаления, на одну меньше. Теперь опишем процеду­ру удаления строки с данным номером:

Program Example_123;

Procedure Delete (k1: Integer;

Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=k1 To n-1 Do

For j:=1 To m Do

x [i, j]:=x[i+1, j];

For j:=1 To m Do x[n, j]:=0;

End;