Прежде чем заселять жителей в город, нужно на каждом доме написать, кто в нем живет, и вообще, проследить, чтобы трамваи ходили правильно. А то возникнет неразбериха и люди не смогут ездить друг к другу в гости.
Прежде чем наполнять паскалевским содержимым наши части и процедуры, нужно сделать “скелет” программы, то есть “пустую” программу, в которой все части и процедуры ничего не делают, а только рапортуют о своем существовании, примерно так: “Работает процедура Дом”. Когда мы запустим такую программу-скелет и увидим, что все части и процедуры рапортуют в нужном порядке, мы можем надеяться, что ничего не перепутали и структура программы правильная. Вот после этого и можно постепенно заселять жителей, то есть наполнять пустые процедуры реальным содержанием. Если мы не проделаем этого заранее, то при отладке не будем знать, отчего у нас на экране получается ерунда - то ли оттого, что мы неправильно запрограммировали процедуру, то ли от того, что перепутали порядок вызова процедур.
|
|
Сначала для простоты отладим “пустую” программу без разбивки пейзажа, и если она работает правильно, тогда составим “пустую” программу полностью. Вот программа без разбивки пейзажа:
USES Graph,CRT;
VAR Device, Mode:Integer;
PROCEDURE Landscape;
BEGIN WriteLn(‘Работает процедура Пейзаж’) END;
PROCEDURE Music;
BEGIN WriteLn(‘Работает процедура Музыка’) END;
PROCEDURE Flying_Saucer;
BEGIN WriteLn(‘Работает процедура Летающая тарелка’) END;
BEGIN
Device:=0;
InitGraph(Device, Mode, ’< путь к гр.др.> ’);
DirectVideo:=false;
Landscape; { рисование пейзажа }
WriteLn(‘Работает пауза 3 секунды’); { пауза три секунды }
Music; { музыка }
Flying_Saucer; { движение тарелки }
Music; { музыка }
WriteLn(‘Работает свет в окне’); { свет в окне }
ReadLn;
CloseGraph
END.
Пояснение. В нашей программе мы используем и модуль Graph и модуль CRT, так как нам понадобятся и графика и музыка. В этом случае оператор WriteLn просто так не работает. Чтобы он все-таки заработал, необходимо предварительно выполнить оператор DirectVideo:=false. Смысл его рассматривать не будем.
В разделе операторов операторы приведены в той последовательности, в которой они должны согласно мультфильму выполняться программой. В разделе описаний процедуры описаны пока в произвольной последовательности. Каждая процедура внутри себя содержит рапорт о своей работе, чтобы мы знали “правильно ли ходят наши трамваи”. Те части программы, которые не удостоились стать процедурами (пауза, свет), рапортуют с того места, где в дальнейшем будут записаны на Паскале.
Если все у нас правильно, то результатом работы программы будет такая последовательность сообщений:
Работает процедура Пейзаж
Работает пауза 3 секунды
|
|
Работает процедура Музыка
Работает процедура Летающая тарелка
Работает процедура Музыка
Работает свет в окне
Теперь составим “пустую” программу полностью, с разбивкой пейзажа.
USES Graph,CRT;
VAR Device, Mode:Integer;
PROCEDURE Tree;
BEGIN WriteLn(‘Работает процедура Дерево’) END;
PROCEDURE House;
BEGIN WriteLn(‘Работает процедура Дом’) END;
PROCEDURE Landscape;
BEGIN
WriteLn(‘Работает процедура Пейзаж’);
WriteLn(‘Работает Горизонт процедуры Пейзаж’); { горизонт }
WriteLn(‘Работает Синева процедуры Пейзаж’); { синева }
WriteLn(‘Работает Луна процедуры Пейзаж’); { луна }
WriteLn(‘Работают Звезды процедуры Пейзаж’); { звезды }
Tree; { дерево }
Tree; { дерево }
Tree; { дерево }
House; { дом }
House; { дом }
WriteLn(‘Работает Трава процедуры Пейзаж’); { трава }
END;
PROCEDURE Music;
BEGIN WriteLn(‘Работает процедура Музыка’) END;
PROCEDURE Flying_Saucer;
BEGIN WriteLn(‘Работает процедура Летающая тарелка’) END;
BEGIN
Device:=0;
InitGraph(Device, Mode, ’< путь к гр.др.> ’);
DirectVideo:=false;
Landscape; { рисование пейзажа }
WriteLn(‘Работает пауза 3 секунды’); { пауза три секунды }
Music; { музыка }
Flying_Saucer; { движение тарелки }
Music; { музыка }
WriteLn(‘Работает свет в окне’); { свет в окне }
ReadLn;
CloseGraph
END.
Пояснения: То новое, что появилось по сравнению с укороченным вариантом программы, я выделил жирным шрифтом. Обратите внимание, что раздел операторов совершенно не изменился. Изменилось только содержание процедуры Landscape и выше нее появились описания новых процедур, каждая из которых о себе рапортует. (Они описаны именно выше, согласно требованию из 8.2.) Порядок записи операторов внутри процедуры Landscape строго соответствует порядку рисования, который я выбрал ранее.
Если наша “пустая” программа верна, то результатом ее работы будет такая последовательность сообщений (новые сообщения я выделил жирным шрифтом):
Работает процедура Пейзаж