Переменные, выражения, присваивания
1.2. Массивы
В следующих задачах переменные предполагаются описанными как 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, причем известно, что . Найти количество различных чисел среди элементов этого массива.
Решение. Вариант 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. Найти количество различных чисел среди элементов этого массива. (Число действий должно быть порядка )
1.2.7. Та же задача, если требуется, чтобы количество действий было порядка .
Указание. Смотри "Сортировка" (Сортировка)
1.2.8.Та же задача, если известно, что все элементы массива - числа от 1 до k и число действий должно быть порядка .
1.2.9. (Сообщил А. Л. Брудно) Прямоугольное поле разбито на квадратных клеток. Некоторые клетки покрашены в черный цвет. Известно, что все черные клетки могут быть разбиты на несколько непересекающихся и не имеющих общих вершин черных прямоугольников. Считая, что цвета клеток даны в виде массива типа
array [1..m] of array [1..n] of boolean;
подсчитать число черных прямоугольников, о которых шла речь. Число действий должно быть порядка .
Решение. Число прямоугольников равно числу их левых верхних углов. Является ли клетка верхним углом, можно узнать, посмотрев на ее цвет, а также цвет верхнего и левого соседей. (Не забудьте, что их может не быть, если клетка с краю.)