Принципы написания программ

Пишите тупой код!

Для начинающих:

\
\vskip1cm
\noindent
{\bf \large Глава 2. Принципы написания программы}
\vskip5mm
\noindent
{\bf 2.1. Языки программирования}
\vskip1mm
\noindent
Понятно, что для того, чтобы
общаться с компьютером, нужно либо знать его язык, либо искать переводчика.
Таким переводчиком
сначала был программист, затем написали программу-переводчик — транслятор.
Естественно, автоматизированный перевод наложил ограничения на человеческие
фразы: наш язык столь многозначен, смысл слов может быть размыт и
расплывчат, что возникла необходимость в создании промежуточного языка,
легко воспринимаемого как человеком, так и машиной.

Так появились {\bf алгоритмические языки}. Они отражают структуру
алгоритма и не зависят от компьютера.

{\bf Языки программирования} — это
нечто большее, чем просто система обозначений для команд, которые
воспринимает компьютер. Любой язык программирования вместе с соответствующим
программным обеспечением, которое «понимает» этот язык, полностью преображает
компьютер, как бы порождает новую модель компьютера: компьютер по-прежнему
состоит из тех же микросхем, но у программиста появляется
возможность оперировать переменными вместо ячеек памяти, файлами
данных вместо каналов ввода/вывода, алгебраическими формулами вместо регистров и
сумматоров, и, наконец, вместо двоичных знаков использовать
привычные десятичные числа, английские или русские
слова и их сокращения.

Языков программирования несколько сотен. У каждого языка своя грамматика и
синтаксис, своя манера выражения понятий.

Есть очень много задач, которые можно решить,  пользуясь любым языком,
хотя программы при этом выглядят по-разному. Но может возникнуть задача,
для решения которой
пишется специальный язык программирования, который может использоваться
в дальнейшем  для решения и других задач.
Карл Пятый, римский император, говорил, что по разным поводам лучше использовать
разные (разговорные) языки: с врагами говорить на немецком, с женщинами на
итальянском и т.д. — в этих языках есть необходимые для этого средства,
которых либо нет в других языках, либо набор их ограничен.
(Это не значит, например, что с женщинами нельзя общаться на русском, но на
итальянском общение проходило бы, наверное, изысканнее и утонченнее.)

То же происходит и с языками программирования.
Так, например, с помощью языка Фортран удобно решать инженерные задачи,
экспертными системами и искусственным интеллектом «занимаются» ЛИСП и Пролог,
моделированием
— GPSS и т.д. Такого рода языки называют проблемно-ориентированными языками.
(См. [21], [22].)
\vskip5mm
%\newpage
\noindent
{\bf 2.2. Алгоритм. Исходные данные. Результат}
\vskip1mm
\noindent
Всякий  процесс обработки информации вообще и
вычислений в частности требует введения в компьютер исходной информации.
Эту информацию условно можно разделить на два вида: отвечающую на вопросы
{\it что обрабатывать} (считать) и {\it как это делать}. Информацию первого вида называют
{\bf данными}, второго  — {\bf программой}. В программе
пользователь-программист на специальном, доступном компьютеру языке,
описывает, каким образом следует обрабатывать исходные данные, чтобы
добиться нужного пользователю результата.

Мы часто сталкиваемся с подобными «программами» в жизни.
Например, в рецепте пирога данные — это 3 яйца, полкило муки и проч.,
то есть составные части (ингредиенты) и их количество,
а также  — что и за чем мы должны делать (в какой последовательности мы
должны их смешать, сколько времени выпекать), чтобы «на выходе»
(в программировании это — {\bf выходные данные}) получить пирог.
Правила, предписывающие выполнение последовательности действий,
приводящих к решению задачи называют {\bf алгоритмом}. ([23])

Другой пример. Когда мы  просим кого-то сходить за хлебом,  кефиром и
аспирином, то мы сообщаем лишь исходные данные. Последовательность же
посещения булочной и аптеки —
алгоритм — человек составляет сам. С компьютером такой номер не пройдет:
все должно быть четко расписано, иначе вы останетесь «без хлеба» — без
нужных выходных данных.
\vskip5mm
\noindent
{\bf 2.3. Робот-чертежник}
\vskip1mm
\noindent
Пусть в нашем распоряжении есть робот, у которого в руке карандаш.
Робот может выполнять некоторый набор команд (кто-то из программистов
об этом уже позаботился). Нам надо, используя
эти команды, заставить робота рисовать. (См. [24].)

\noindent
Итак, список команд (я опишу сначала основные, а затем, по мере необходимости,
буду пополнять этот список):
\begin{itemize}
\item
{\it Опустить карандаш} — после выполнения этой команды роботом карандаш
находится в центре чистого листа и
касается бумаги.

\item {\it Вперед \bf см}, где вместо {\bf см} в программе нужно писать
число сантиметров — выполняя команду, робот проводит на листе
прямую линию указанной длины. В случае, когда карандаш поднят, эта команда
означает смещение на заданное количество сантиметров.

\item {\it Направо \bf гр}, где вместо {\bf гр} ставится число градусов,
отсчитываемое от «двенадцати часов».
Эта команда задает направление прямой линии подобно
минутной стрелке: если {\bf гр}=$0^{\circ}$, то
линия будет направлена вертикально вверх, если {\bf гр}=$90^{\circ}$,
то — горизонтально вправо, в направлении оси Ox.

\item
{\it Поднять карандаш} — просто заканчиваем работу.
\end{itemize}

\noindent
Так, например, если после команды {\it направо 135} скомандовать работу
{\it вперед 2},  то робот нарисует линию длиной в 2 сантиметра, направленную
в правый нижний угол листа. Последовательность команд {\it направо 180, вперед~3},
даст вертикальную линию,  стартующую от точки, в которой находился карандаш
до начала выполнения этих команд, в направлении нижнего края бумаги,
перпендикулярно ему. Понятно, что нам не нужна команда «назад» — ее
заменяет только что описанная последовательность команд {\it направо 180,
вперед 3}. Команда {\it влево} нам не нужна по тем же причинам.

\vskip5mm
\hrule
\vskip2mm
{\bf \noindent Упражнение  13.}
\begin{enumerate}
\item
Какие команды нужно записать, чтобы робот нарисовал
горизонтальную линию длиной 7 см, которая начинается в центре листа?
\item Нарисуйте с помощью робота равносторонний треугольник, со сторонами
10 см, основание которого находится выше вершины:
\end{enumerate}
\vskip5mm
\ \qquad\scalebox{0.7}{\includegraphics{treug}}\hskip0.9cm\vbox{\noindent Незнайка бы сказал, что это — «вверхтормашечный» \\
(нарисованный «вверх тормашками») треугольник.  }                     \\*
%\vskip1.8cm
\vskip5mm
\hrule
\vskip5mm

\noindent
Можно ли с помощью описанных выше команд нарисовать что-нибудь
посложнее, например,  звездочку?

%\vskip9mm
\begin{center}
\scalebox{0.7}{\includegraphics{zvezd_large}}\\*
%\vskip3.2cm
\end{center}
%\newpage???????
%Чтобы приказать роботу нарисовать даже самую маленькую звездочку, без
%математики не обойтись.

\noindent
Начнем с пятиконечной звезды, которую большинство читателей, надеюсь,
рисовать умеют:

%\vskip17mm
\begin{center}
\scalebox{0.7}{\includegraphics{zv_1}}\\*
%\vskip1.7cm
\end{center}
\noindent
— начинаем рисовать с «жирной» точки, проводим прямую линию впра\-во-вниз
(на рисунке она толще других), затем, не отрывая карандаша от бумаги, такую
же по длине линию влево-вверх, но под углом к только-что проведенной
(на рисунке эта линия выделена пунктиром), далее линия пошла горизонтально
вправо, затем влево-вниз и, наконец, соединилась со своим началом в «жирной» точке.
Нам не составило бы труда  заставить компьютер нарисовать  такую же
звезду, знай мы, на сколько градусов нужно каждый раз «поворачиваться».

В звезде с любым количеством лучей угол между отрезками, выходящими из
одной вершины, равен числу, полученному если $180^\circ$ разделить на число
лучей.

В случае пятиконечной звезды:  $180^\circ/5=36^\circ$, следовательно угол, на
который надо изменить направление линии, рисуемой роботом, равен
$180^\circ-36^\circ=144^\circ.$

%\vskip2cm
%Вставить рисунки (что в рукописи + показать отдельно углы 180-144-36)

\begin{center}
\scalebox{0.7}{\includegraphics{zv_2}}\\*
%\vskip1.7cm
\end{center}

\noindent
Вот команды, «рисующие» эту звезду:

\noindent
{\it
\begin{tabular}{lc}
опустить карандаш;&\\
вправо 144;&\\
вперед 2;&\\
вправо 144;&\\
вперед 2;&\\
вправо 144;&\\
вперед 2;&\\
вправо 144;&\\
вперед 2;&\\
вправо 144;&\\
вперед 2;&\\
поднять карандаш.&
\end{tabular}
}
\vskip3mm

\noindent
Чтобы нарисовать девятиконечную звезду, нужно  каждый раз изменять направление
движения карандаша на $180^\circ-180^\circ/9=160^\circ$ градусов.

\vskip5mm
\hrule
\vskip2mm
{\bf \noindent Упражнение  14.}
Напишите последовательность
команд, заставляющих робота рисовать девятиконечную звезду
из линий размером в 5 см.

\vskip3mm
\hrule
\vskip5mm

\noindent
Как вы заметили, не очень удобно много раз подряд писать одни и те же
команды. Последовательность команд, рисующих пятиконечную звезду, состоит
из пяти пар повторяющихся команд, рисующих девятиконечную звезду — из
девяти пар, стоконечную — из ста \dots .
Программист (в целях экономии своего времени и усилий)
старается   не писать одно и то же несколько раз. С этой целью
вводится команда {\it повторить} {\bf раз}, где вместо «{\bf раз}» пишется
число повторений.   Вот как будет выглядеть программа, рисующая пятиконечную
звезду, после нововведения:

\vskip3mm
\noindent
{\it
\hskip-2.7mm\begin{tabular}{lc}
опустить карандаш;&\\
повторить 5  [вправо 144; вперед 2];&\\
поднять карандаш.&
\end{tabular}
}
%%%%%%%%%%%%%Спросить у Зои, как автоматически расставлять номара упражнений!!!
%%%%%%%%%%%%%%

\vskip3mm
%\newpage
\hrule
\vskip2mm
{\bf \noindent Упражнение  15.}
«Модернизируйте» вашу программу (Упражнение  14.),
рисующую  девятиконечную звезду.
\vskip3mm
\hrule
\vskip5mm

\noindent
Если мы захотим нарисовать две пятиконечных звезды разного размера, нам нужно
будет писать две программы, которые будут отличаться только в одном месте~—
там, где указан размер:

\vskip3mm
\noindent
{\it
\hskip-2.7mm\begin{tabular}{l|l}
опустить карандаш;& опустить карандаш;\\
повторить 5  [вправо 144; вперед \underbar{2}] & повторить 5  [вправо 144; вперед
\underbar{7}];\\
поднять карандаш.& поднять карандаш.\\
\end{tabular}
}

\vskip3mm
\noindent
Понятно, что лучше всего написать одну программу для всех пятиконечных
звезд, а их размер вводить, например, с клавиатуры:
\vskip3mm
\begin{tabular}{lc}
{\it опустить карандаш;}&\\
\underbar{\it ввести}
{\bf размер};&\\
{\it повторить 5 [вправо 144;
вперед {\bf размер}];}&\\
{\it поднять карандаш.}&
\end{tabular}

\vskip3mm
\noindent
Допустим компьютер умеет, выполняя команду {\it ввести},
выдавать вам чистое окно и ждать от вас ввода данных,
затем нажатия какой-либо условной клавиши, например, клавиши «ввод»,
чтобы знать, что ввод информации закончен и ее надо
занести  в память компьютера.
Если мы запустим написанную программу, то в специальное
«хранилище» — ячейку памяти с
названием «размер» (слово выделено в нашей программе жирным шрифтом)
компьютер поместит введенное нами с клавиатуры число-размер звезды.
Когда поступит команда: {\it вперед} {\bf размер}, компьютер извлечет
из «хранилища» с именем Размер число и проведет прямую линию
заданной длины. Со следующим запуском программы, мы сможем
ввести другой размер звезды и в «хранилище»-Размер попадет
другое число (а старое пропадет).

Под одним и тем же именем можно запоминать разные
величины,  с каждым новым {\it запуском} программы значение размера
звезды можно {\it изменить}. Числа, заносимые при этом
в ячейку памяти «Размер» могут {\it «меняться»}:
место одних чисел могут занимать другие, поэтому такого рода «хранилища»
в программировании называют {\bf переменными}.

Пойдем дальше. Если мы можем вместо конкретного размера ввести переменную,
то почему бы в качестве переменной не описать и количество лучей звезды,
и также вводить его с клавиатуры: одна и та же программа будет рисовать звезды
различных размеров и с различным количеством лучей, в зависимости от того,
какие числа мы захотим ввести.

\vskip3mm
\noindent
{\it
\hskip-2.7mm\begin{tabular}{lc}
опустить карандаш;&\\
ввести {\bf размер, \underbar{количество}};&\\
\underbar{{\bf градусы} приравнять: $180-180/${\bf количество}};&\\
повторить \underbar{{\bf количество}} [вправо \underbar{{\bf градусы}}; вперед {\bf размер}];&\\
поднять карандаш.&
\end{tabular}
}

\vskip3mm
\noindent Изменения, внесенные в предыдущую программу, дабы
придать ей универсальный вид, подчеркнуты. Поясним их.

{\bf Градусы} {\it приравнять} чему-то — значит в переменную
{\bf Градусы} поместить это что-то (в нашем примере  $180-180/${\bf количество}).
Кроме «хранилищ» Размер и Градусы у нас введена новая переменная —
{\bf Количество}.

Мы говорим, что наша программа рисует «любые
звезды». А что значит нарисовать
звезду длины «минус три сантиметра»?

\vskip5mm
\hrule
\vskip2mm
{\bf \noindent Упражнение  16.}
Нарисуйте звезды с
количеством лучей, равным 2, 3, 4, 6, 8 и 10.

\vskip1cm
\hrule
\vskip5mm

\noindent
Если звезды с тремя,
четырьмя, шестью, восемью и десятью лучами с трудом,
но можно назвать «звездами», то звезды с двумя, четырьмя и «минус пятью»
лучами звездами назвать очень сложно. Поэтому, чтобы не дать нашему
роботу рисовать неизвестно что, когда мы хотим увидеть именно {\it звезду},
введена команда, проверяющая введенные нами числа:

\vskip3mm
\noindent
{\it
\hskip-2.7mm
\begin{tabular}{lc}
опустить карандаш;&\\
ввести {\bf размер, количество};&\\
\underbar{если {\bf размер} $>0$ и {\bf количество} $>2$ и {\bf количество} $\ne 4$, то}&\\
\ $\;${\bf [} \ $\;$
\ $\;$\ $\;$
{\bf градусы} приравнять:  $180-180/${\bf размер};&{\bf (*)}\\
\ $\;$\ $\;$
повторить {\bf количество} [ вправо {\bf градусы}; вперед {\bf размер} ]&{\bf (*)}\\
\ $\;${\bf ]}; \ $\;$ &\\
поднять карандаш.&\\
\end{tabular}
}

\vskip3mm
\noindent Если введенные числа ({\it размер} и {\it количество}),
удовлетворяют этим условиям ({\it размер} звезды должен быть числом
положительным, а {\it количество} лучей звезды должно быть больше двух
и не равно четырем), то робот будет рисовать звезду~—  выполнятся команды
в (строго вертикальных) квадратных скобках [{\bf (*)}].

%\newpage
\noindent
А если мы захотим нарисовать звездное
небо со множеством разных по величине и количеству лучей звезд?
Для этого попробуем сначала решить задачу попроще: разделим лист бумаги
на воображаемые квадраты со стороной в один сантиметр и попробуем в каждом
нарисовать по пятиконечной звезде:

\begin{center}
\scalebox{0.7}{\includegraphics{zv_mn_1}}\\*
%\vskip3cm
\end{center}

%&&&
%%%%%% рисунок с квадратами и звездами

%\vskip5.5cm
\noindent
Видоизменим команду {\it опустить карандаш}, которая, как вы помните,
переносила карандаш в центр листа: {\it опустить карандаш} {\bf $x, y$},
\noindent где вместо {\bf $x$} и {\bf $y$} будем писать положительные
действительные числа (0, 1, 2, 7.5, 3.14, \dots )
Пусть теперь команда {\it опустить карандаш} {\bf 0, 0} перенесет карандаш в
левый верхний угол листа, команда {\it опустить карандаш} {\bf 1, 3} перенесет
карандаш на один сантиметр вправо и на три сантиметра вниз относительно
начала координат или с любой точки текущего положения. А, например,
команда {\it опустить карандаш} {\bf 7, 5.5} перенесет карандаш на 7 см
вправо и на 5.5 см вниз:
\begin{center}
\scalebox{0.7}{\includegraphics{coord_1}}\\*
%\vskip2cm
\end{center}

%%%%%%%% рисунок с координатами.
%\vskip1.5cm

\vskip5mm
\hrule
\vskip2mm
{\bf \noindent Упражнение  17.}
В какой точке листа будет находиться карандаш после выполнения команд:
{\it опустить карандаш 1, 2.5; вперед 1.5; вправо 130; вперед
20.124612;
вправо 210; вперед 19; вправо 270; вперед 10; поднять карандаш}?
\vskip5mm
\hrule
\vskip5mm
\noindent
Итак, программа

\noindent
{\it
\begin{tabular}{lc} опустить карандаш  0.5, 0;&\\
повторить 5 [вправо 144; вперед 1];&\\
поднять карандаш.&
\end{tabular}}

\noindent нарисует пятиконечную звезду в левом верхнем квадрате (со
стороной 1 см) листа. Поскольку одинаковых звезд нам рисовать придется
много, чтобы сократить
запись программы, выделим отдельно маленькую часть программы (программисты
называют ее {\bf  подпрограммой}), которая рисует пятиконечную
звезду размером в 1 см, дадим имя этой программке-подпрограмме:

\centerline{
\noindent\begin{tabular}{lc}
\underbar{назвать {\bf звезда\_5}}{\bf [}
{\it повторить 5 [вправо 144; вперед 1]} {\bf ]}.&\\
\end{tabular}}

\noindent
Теперь если мы в любом месте любой другой программы напишем название
этой подпрограммы — {\bf звезда\_5}, то она выполнится от начала и до конца,
то есть будет нарисована пятиконечная звезда.

\noindent
Назовем следующую подпрограмму {\bf звезда\_9}:

\centerline{
\noindent\begin{tabular}{lc}
\underbar{назвать {\bf звезда\_9}}{\bf [}
{\it повторить 9 [вправо 160; вперед 1]} {\bf ]}.&\\
\end{tabular}}
\noindent
Если мы, например хотим, чтобы
программа рисовала нам то пятиконечную звезду, то девятиконечную —
ту, которую мы попросим. Сделать, например, так, что если мы
нажмем на клавиатуре на цифру «5», то будет нарисована
пятиконечная звезда, если на цифру «9», то — девятиконечная.
\begin{tabular}{lc}
{\it опустить карандаш;}&\\
{\it ввести} {\bf число};&\\
{\it если} {\bf число} = 5, {\it то} {\bf [ звезда\_5 ]};&\\
{\it если} {\bf число} = 9, {\it то} {\bf [ звезда\_9 ]};&\\
{\it поднять карандаш.}&\\
\end{tabular}
\noindent
Пусть ширина нашего листа равна 30 сантиметрам, длина — 21.
Тогда лист разбивается на $30\times 21=630$ квадратов и нам,
следовательно, нужно нарисовать 630 звезд.
%\vskip3cm
%\newpage
\noindent
Попробуйте самостоятельно разобраться в том, что делает эта программа
(«нововведения» подчеркнуты; строки пронумерованы, комментарии к каждой
строке даны после программы):

\begin{tabular}{llc}
1&\underbar{{\bf $x$} {\it приравнять:} {\bf 0.5}};&\\
2&\underbar{{\bf $y$} {\it приравнять:} {\bf 0}};&\\
3&\underbar{\it пока {\bf $x\le 30$} повторять }&\\
4&\ $\;${\bf [}\ $\;$
\underbar{\it пока {\bf $y\le 21$} повторять}&\\
5&\ $\;$\ $\;${\bf [} \ $\;$
{\it опустить карандаш {\bf $x, y$}};&\\
6&\ $\;$\ $\;$\ \ $\;$
{\bf звезда\_5};&\\
7&\ $\;$\ $\;$\ \ $\;${\it y} {\it приравнять:} {\bf $y+1$};&\\
8&\ $\;$\ $\;${\bf ]}; \ $\;$&\\
9&\ $\;$\ \ $\;${\it x} {\it приравнять:} {\bf $x+1$};&\\
10&\ $\;${\bf ];}\ $\;$&\\
{\it поднять карандаш}.&
\end{tabular}

\newpage
\begin{itemize}
\item[1.,2.] {\it $x=0.5, y=0$} — обозначаем начальное положение
карандаша — верхний край листа, на 0.5 см правее верхнего левого угла
— туда карандаш перенесется командой {\it опустить карандаш {\bf $x, y$}}
(5-ая строка программы) перед тем, как нарисовать первую звезду.% при первом «прогоне» повторяющихся
%последовательностей команд (после команды {\it повторять} в квадратных скобках
% [\dots ]).
\item[3.] %Компьютер последовательно выполняет одну команду за другой,
Как только компьютер встречает слово «пока» (3-я строка), он будет повторять
несколько раз подряд все строки с 4-ой по 9-ую (все инструкции, заключенные
в {\it ближайшие} квадратные скобки
— от скобки «{\bf [}», стоящей
в начале 4-ой строки и до скобки «{\bf ]}», находящейся в 10 строке).
Сколько именно раз будут повторяться эти инструкции, можно определить
по значению $x$. До выполнения инструкций в квадратных скобках
значение, находящееся в переменной $x$ было равно 0.5 (см. 1-ую строку),
после выполнения 9-ой строки значение $x$ изменится: к предыдущему значению
(0.5) добавиться 1, то есть $x=0.5+1=1.5$. Затем это новое значение
$x$ сравнивается с 30 (после выполнения 9-ой строки мы опять
возвращаемся в 3-ю), и если значение $x$ меньше 30, то инструкции
в квадратных скобках повторяются снова. И так продолжается до тех
пор, пока $x$ не станет равным 30.5 — не превысит значение 30.
Такая конструкция называется {\bf циклом}.
\item[4.] При каждом фиксированном значении  $x$ величина $y$ «пробегает»
все значения от 0 до 21, с каждым «пробегом» увеличиваясь на 1 (см. 7-ую строку),
при этом каждый раз повторяются все команды, заключенные в квадратные скобки
— от скобки {\bf [ }, стоящей в конце 4-ой строки и до скобки {\bf ]} ,
находящейся в 8-ой строке. При этом очередная звезда (рисуется командой
{\bf звезда\_5} — см. 6-ую строку) будет рисоваться {\it под} предыдущей, в
соседнем квадрате, расположенном ниже. На рисунке показан порядок
«появления» звезд: первой рисуется звезда 1 в верхнем левом углу
({\it $x=0.5,\; y=$} {\bf 0}), второй — звезда 2 ({\it $x=0.5,\; y=$}
{\bf 1}) и так далее\dots \  Как только $y$ станет
%\end{itemize}
%\newpage
%\noindent
равным 21.5, этот
цикл {\bf по у} закончится, и будет выполняться не снова 5-ая строка,
а 9-ая — $x$ увеличится на 1 — звезды начнут рисоваться опять сверху
вниз, но правее уже нарисованного столбика звезд.
То есть $x$ последовательно равен
0.5, 1.5, 2.5, 3.5, \dots , 29.5 и с каждым из этих значений $x$ перебираются
все значения $y$ — от 0 до 20 — работает {\bf вложенный цикл}
по $y$.
\end{itemize}

\newpage
\
%\vskip3.2cm
\begin{center}
\scalebox{0.7}{\includegraphics{zv_mn_2}}\\*
\end{center}

%%%%%%%%рисунок со звездами
%\vskip4cm
%\newpage
%\vskip1cm
\noindent
Если вам пока сложно понять принципы работы последней программы (или вообще
всех программ этой главы), не огорчайтесь: в следующей главе, изучая
конкретный язык программирования, мы не только подробнее остановимся
на каждой из описанных команд, но вы сами сможете увидеть результаты
работы написанных вами программ на своем компьютере, а не воображая
робота с карандашом.
Для сохранивших же до сих пор некоторую ясность мышления опишем программу
рисования «звездного неба». (Словосочетание «звездное небо» взято в кавычки,
поскольку мы будем рисовать не астрономическую карту, а просто много-много звезд
разной величины и с
разным количеством лучей.)
%%%%%%%%рис звездного неба
%\vskip3cm
Введем команду {\it случайное число}. Каждый раз, когда эта команда будет
выполняться, компьютер будет выдавать несколько цифр, составляющих число, и
при этом каждый раз {\it новое} число, причем таким образом, что вы не можете
предугадать, какое именно.  (Более подробно о случайных числах можно прочесть
в {\bf Приложении 3} этой книги.)

Так вот, если в программу, рисующую звезды, ввести,
например, команду

{\it размер приравнять:} {\bf случайное число},

\noindent
и эту команду выполнить несколько раз, то каждый раз размер звезды будет
новым и притом полученным {\it случайным образом} (раньше мы размер вводили
сами c помощью команды {\it ввести} {\bf размер}). Таким же случайным образом
можно получать и количество
лучей очередной звезды и ее месторасположение на листе бумаги. Если при этом
еще проверять\footnote{{\it если \dots то  [\dots]} — мы использовали
эту конструкцию в предыдущих программах, где перед началом рисования проверяли
правильность введенных чисел — размера звезды и количества лучей (см. стр. 50)}
%%%%%%%%вставить  N страницы!!!!!
получаемые случайные числа на предмет того, чтобы они, {\it приравниваемые}
размеру звезд, не были бы чересчур большими и давали бы
именно звезды, а не что-то другое (линии, треугольники,\dots),
и при этом  следили бы еще за тем, чтобы звезды
не перекрывали одна другую (месторасположение звезды, например, тоже может
быть случайным числом), то какое-то подобие звездного неба мы бы получили, при
этом его «качество» зависело бы от того, насколько тщательно
мы продумали  бы детали и насколько  последовательно воплотили бы наши
«фантастические» замыслы в программе.

Все это выглядит достаточно нечетко и громоздко. Но если всю работу
по созданию звездного неба разбить на небольшие блоки~— последовательности
команд (продумайте,
каких!),~— каждый
из блоков запрограммировать отдельно, а затем «склеить»,
то, возможно, все получится очень даже неплохо.

\vskip1cm
\begin{center}
\scalebox{0.9}{\includegraphics{cat1}}\\*
%%%%???????????cat_.eps????????????????????????
\end{center}

%Последнее упражнение — 17???
%%%%%%%%%%%%%Спросить у Зои, как автоматически расставлять номара упражнений!!!
%%%%%%%%%%%%%%

\newpage

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

методические материалы по информатике