Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 1:

Переменные, выражения, присваивания

1.2. Массивы

В следующих задачах переменные x,y,z предполагаются описанными как array[1..n] of integer (где n - некоторое натуральное число, большее 0 ), если иное не оговорено явно.

1.2.1. Заполнить массив x нулями. (Это означает, что нужно составить фрагмент программы, после выполнения которого все значения x[1]..x[n ] равнялись бы нулю, независимо от начального значения переменной x.)

Решение.

i := 0; 
{инвариант: первые i значений x[1]..x[i] равны 0} 
while i <> n do begin 
| i := i + 1; 
| {x[1]..x[i-1] = 0} 
| x[i] := 0; 
end;

1.2.2. Подсчитать количество нулей в массиве x. (Составить фрагмент программы, не меняющий значения x, после исполнения которого значение некоторой целой переменной k равнялось бы числу нулей среди компонент массива x.)

Решение.

... 
{инвариант: k = число нулей среди x[1]...x[i] } 
...

1.2.3.Не используя оператора присваивания для массивов, составить фрагмент программы, эквивалентный оператору x:=y.

Решение.

i := 0; 
{инвариант: значение y не изменилось, x[l]=y[l] при l<=i} 
while i <> n do begin 
| i := i + 1; 
| x[i] := y[i]; 
end;

1.2.4.Найти максимум из x[1]..x[n].

Решение.

i := 1; max := x[1]; 
{инвариант: max = максимум из x[1]..x[i]} 
while i <> n do begin 
| i := i + 1; 
| {max = максимум из x[1]..x[i-1]} 
| if x[i] > max then begin 
| | max := x[i]; 
| end; 
end;

1.2.5.Дан массив x: array[1..n] of integer, причем известно, что x[1]\le x[2]\le\ldots\le x[n]]. Найти количество различных чисел среди элементов этого массива.

Решение. Вариант 1.

i := 1; k := 1; 
{инвариант: k - количество различных среди x[1]..x[i]} 
while i <> n do begin 
| i := i + 1; 
| if x[i] <> x[i-1] then begin 
| | k := k + 1; 
| end; 
end;

Вариант 2. Искомое число на 1 больше количества тех чисел i из 1..n-1, для которых x[i] не равно x[i+1].

k := 1; 
for i := 1 to n-1 do begin 
| if x[i]<> x[i+1] then begin 
| | k := k + 1; 
| end; 
end;

1.2.6. Дан массив x: array[1..n] of integer. Найти количество различных чисел среди элементов этого массива. (Число действий должно быть порядка n^2 )

1.2.7. Та же задача, если требуется, чтобы количество действий было порядка n log n.

Указание. Смотри "Сортировка" (Сортировка)

1.2.8.Та же задача, если известно, что все элементы массива - числа от 1 до k и число действий должно быть порядка n+k.

1.2.9. (Сообщил А. Л. Брудно) Прямоугольное поле m\times n разбито на mn квадратных клеток. Некоторые клетки покрашены в черный цвет. Известно, что все черные клетки могут быть разбиты на несколько непересекающихся и не имеющих общих вершин черных прямоугольников. Считая, что цвета клеток даны в виде массива типа

array [1..m] of array [1..n] of boolean;

подсчитать число черных прямоугольников, о которых шла речь. Число действий должно быть порядка mn.

Решение. Число прямоугольников равно числу их левых верхних углов. Является ли клетка верхним углом, можно узнать, посмотрев на ее цвет, а также цвет верхнего и левого соседей. (Не забудьте, что их может не быть, если клетка с краю.)