Олег Деревенец - Песни о Паскале
- Название:Песни о Паскале
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Деревенец - Песни о Паскале краткое содержание
Песни о Паскале - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Counter:= 0; { Счетчик "завоевательных кампаний" }
{ Цикл, пока не будет присоединена страна C2 }
repeat
{ Подготовка к "завоевательной кампании" }
C:='A'; { Первый индекс в массиве множеств границ }
Temp:= EmpireB ; { Запоминаем предыдущие границы империи }
{ Цикл очередной "завоевательной кампании" по всем странам массива }
while C in Names do begin
{ Если страна имеет общую границу, присоединяем её к империи }
if (Temp * States[C]) <> [] then begin
EmpireB:= EmpireB + States[C]; { Добавляем границы }
EmpireN:= EmpireN + [C]; { Добавляем имя страны }
end;
C:= Succ(C) ; { Следующий индекс в массиве множеств границ }
end; { очередная кампания завершена }
Inc(Counter); { Наращиваем счетчик "завоевательных кампаний" }
until C2 in EmpireN ; { Пока не будет присоединена страна C2 }
{ Печать результата }
Writeln('Пересечений границ: ', Counter); Readln;
end.
Так была решена задача о минимальной сумме пошлин. Купцы, было, обрадовались, но вскоре явились с новым поклоном. Много ль толку от знания расходов, если не знаешь пути, по которому надо двигаться? «Сделай нам, братан, что-то типа навигатора для поиска кратчайшего пути между странами. Так, чтобы нам меньше этих пошлин платить, – умоляли купцы, – мы не поскупимся!» Ник обещал подумать, и продолжение истории следует.
Кто не любовался яркой световой рекламой? Рекламный щит составлен из лампочек, а изображение «рисуется» их включением и отключением, – этим управляет микропроцессор. Компьютер у нас под рукой, почему бы не соорудить такой рекламный щит прямо на экране? Научим компьютер выполнять с изображением на нашем щите три действия: два зеркальных отражения (относительно горизонтальной и вертикальной осей), а также инверсию изображения (рис. 113).

Прежде всего, определим, как представить исходное изображение так, чтобы ввод его в компьютер был по возможности прост. Неплохим вариантом будет текстовый файл, где исходная картинка нарисована двумя символами, например, крестиком и ноликом. Присмотревшись к рис. 114, вы разглядите в правом верхнем углу изображенную таким способом букву «F».

Размер картинки выберем таким, чтобы она помещалась на экране монитора. В текстовом режиме экран содержит 25 строк по 80 символов в каждой. Мы ограничимся 20 строками по 40 символов. Тогда воображаемая вертикальная ось нашего щита пройдет между 20-м и 21-м столбцами, а горизонтальная – между 10-й и 11- строками.
Разобравшись с видимым представлением щита, обратимся к невидимому: придумаем способ хранения в памяти «лампочек» щита. Годятся ли символьные переменные, – те же крестики и нолики? Да, но мне приглянулся способ, лучше отвечающий природе рекламного щита. Ведь каждая из лампочек может быть либо включена либо погашена, – их состояние можно отразить в булевых переменных. А сколько их понадобится? Не так уж мало – 800 штук (20 строк по 40 в каждой). Разумеется, нужен массив, но каким он будет? Предположим, что тип «рекламный щит» (Desk) объявлен так:
type TDesk = array [1..800] of Boolean;
Здесь разумеем, что первые 40 элементов массива хранят верхнюю строку щита, следующие 40 элементов, – вторую строку и так далее. Не очень удобно, правда?
Можно сделать иначе: сначала объявить отдельную строку щита TLine как массив из 40 лампочек.
type TLine = array [1..40] of Boolean;
И тогда весь щит представится массивом из 20 таких строк, – это будет массив массивов.
type TDesk = array [1..20] of TLine;
То же самое можно записать развернуто, вот так:
type TDesk = array [1..20] of array [1..40] of boolean ;
Подчеркнутое означает отдельную строку щита. Паскаль разрешает собрать все индексы объявления внутри одних скобок и записать всё это ещё короче.
type TDesk = array [1..20, 1..40] of boolean;
Так мы получили структуру, которую математики называют матрицей, а программисты – двумерным массивом. Матрицы состоят из строк и столбцов. Для доступа к элементам матрицы нужны два индекса, один из которых указывает номер столбца, а другой – номер строки. Например, элемент матрицы Desk, стоящий в 5-м столбце 3-й строки, доступен так:
Desk[3, 5]
Разумеется, что для индексов позволены числовые выражения, значения которых должны лежать в объявленных пределах. При обработке матриц применяют циклы, их можно организовать как по строкам, так и по столбцам. Возьмем для примера наш рекламный щит, объявим его тип, а потом заполним значением FALSE.
const Cx = 40; { количество столбцов (ширина) }
Cy = 20; { количество строк (высота) }
type TDesk = array [1..Cy, 1..Cx] of boolean; { тип «рекламный щит» }
var Desk : TDesk; { переменная «рекламный щит» }
Здесь пределы для индексов указаны через константы Cx и Cy. Заполнить матрицу значением FALSE можно двумя вложенными циклами:
for y:=1 to Cy do
for x:=1 to Cx do Desk[y, x]:= False;
То же самое делается быстрее и короче известной вам процедурой заполнения FillChar:
FillChar(Desk, SizeOf(Desk), false);
Здесь значение SizeOf(Desk) составит 800 – это количество элементов матрицы.
Можно обрабатывать и отдельные строки, и отдельные столбцы матрицы. Например, заполнить значением TRUE 5-й столбец:
for y:=1 to Cy do Desk[y, 5] := True;
А для заполнения 3-й строки организовать такой цикл:
for x:=1 to Cx do Desk[3, x] := True;
Если вам понятна техника работы с матрицами, перейдем к программе «P_49_2».
Начнем с процедуры ReadDesk, что вводит матрицу из файла. Условимся считать, что крестикам в матрице Desk соответствует TRUE, а ноликам – FALSE. Входной файл обрабатываем построчно: сначала очередную строку читаем во вспомогательную строковую переменную S, а затем символы этой строки преобразуем в булевы значения оператором сравнения (вы помните, что оператор сравнения дает булев результат?).
Desk[y,x]:= S[x]='+'; { TRUE, если S[x] содержит крестик }
Следовательно, для ввода матрицы нужны два вложенных цикла: внешний – по строкам и внутренний – по столбцам.
Схоже работает и процедура WriteDesk, выводящая матрицу на экран. Здесь внутренний цикл формирует строку из 40 символов, каждый из которых может быть либо крестиком либо ноликом. Выбор пары символов – дело вкуса, в нашем случае пара определяется строковой константой CSymbols.
Читать дальшеИнтервал:
Закладка: