Ну, что… посчитали? Тогда продолжим. Нас, разумеется, будет интересовать не столько конкретное количество кубиков именно в данной пирамидке, сколько алгоритм подсчета количества кубиков в пирамидке любой высоты. Не исключено, что во времена Френсиса Дрейка (был такой знаменитый пират) этот вопрос имел принципиальное военно-стратегическое значение. Дело в том, что ядра старинных пушек складывали возле орудий именно в такие пирамидки. Таким образом, взглянув в подзорную трубу и оценив высоту пирамидок возле пушек вражеского фрегата и, разумеется, владея алгоритмом расчета количества ядер в пирамидке, можно было прикинуть, сколько пушечных залпов способен произвести корабль противника. Как же подсчитать, сколько всего кубиков (или ядер) ложится в такую пирамидку. Можно, например, рассуждать следующим образом. Видимые кубики сверху вниз образуют ряд натуральных чисел - 1, 2, 3, 4, 5. Каждый кубик, кроме кубиков самого нижнего уровня, должен на чем-то стоять. Вернее они совершенно точно стоят на кубиках нижнего ряда. На самом верху стоит один единственный кубик. Ниже него расположен "слой" из трех кубиков - двух видимых и одном невидимом, на котором стоит верхний. Далее количество кубиков в каждом следующем нижнем слое можно рассчитать как сумму номера слоя, начиная сверху, плюс количество кубиков в предыдущем слое. То есть, количество кубиков в каждом из слоев, начиная с первого, будет следующим
1
2+1=3
3+3=6
4+6=10
5+10=15
Таким образом, общее количество кубиков в пирамидке составит 1+3+6+10+15=35. Теперь, когда мы знаем, как можно решить эту задачку, составим алгоритм и программу ее решения для пирамидки из N уровней. Характерной особенностью описанного выше хода мыслей (далеко, впрочем, не единственно возможного) является получение конечного результата путем многократного повторения одного и того же действия. Не будет преувеличением сказать, что в этом едва ли не главная сущность и сильная сторона компьютерного подхода к решению разнообразных сложных проблем - свести все к повторяющимся операциям и заставить компьютер тупо это выполнить множество раз. Для этой цели во всех существующих языках программирования имеются операторы для организации циклов. В принципе повторяющиеся вычисления или циклы можно запрограммировать и не используя специальных средств. Вполне достаточно уже известного нам условного оператора if в сочетании с оператором перехода goto. Причем, проделав это, мы лучше поймем, для чего нужны, как работают, и какие бывают операторы циклов. Для того, чтобы организовать циклически повторяющиеся вычисления при помощи операторов if и goto нам понадобиться вставить в программу пустую неисполняемую инструкцию, которая называется меткой. Метка выполняет единственную функцию - быть точкой для изменения последовательности выполнения инструкций с помощью операторов перехода. В SmallBasic возможны два вида меток - числовые и буквенные. Можно просто создать в нужном месте программы пустую строку, и присвоить ей какой-либо произвольный числовой номер, например, 137. Затем из любого места нашего программного кода можно при помощи оператора goto 137 перенаправить ход выполнения программы на эту отмеченную позицию. Если мы захотим использовать метку, содержащую буквенные обозначения, то ее придется предварить специальным ключевым словом "label", которое проинформирует компьютер о том, что следующую за ним последовательность символов следует рассматривать именно как метку, а не что-либо иное, например, переменную. Вот как примерно может выглядеть программный код для расчета количества кубиков в пирамидке.
input N
k=0
L=0
S=0
label M1:
k=k+1
L=L+k
S=S+L
if k<N then goto M1
print S
stop
В данном фрагменте k - это счетчик рядов, L - количество кубиков (или ядер) в отдельном ряду, а S - сумма всех кубиков. Промоделируйте мысленно работу данной программы и объясните себе - почему она печатает в конце правильный результат. Приведенная конструкция по своей сути является одной из главных в программировании - его квинтэссенцией. Поскольку использовать ее приходится весьма часто, то для ее упрощенного построения во все языки программирования были введены специальные операторы, называемые операторами циклов. В SmallBasic таких операторов несколько. Цикл со счетчиком for/next имеет вид
for счетчик = начальное_значение to конечное_значение [step шаг]
инструкция 1
инструкция 2
…
инструкция n
next счетчик
С его помощью нашу программу можно переписать в следующем виде
input N
L=0
S=0
for k=1 to N
L=L+k
S=S+L
next k
print S
stop
Все, что находится между строкой "for" и строкой "next" называется телом цикла. Тело цикла повториться столько раз, сколько указано в операторе for (в нашем случае N раз). Изначально переменная цикла или счетчик k получает значение 1. Затем на каждом очередном шаге цикла значение счетчика автоматически увеличивается на 1 (если в операторе отсутствует явное указание шага, например, step 2). И так происходит до тех пор, пока значение k не достигнет N. После этого цикл прекратится и управление будет передано инструкции, непосредственно следующей за next. В нашем случае это - print S. В программировании принято при написании текста программы смещать на несколько позиций вправо инструкции, находящиеся внутри циклов. Это впоследствии очень помогает читать программные коды.
Оператор while/wend еще называют - цикл с предусловием. С его помощью наша программа может быть записана в следующем виде
input N
k=0
L=0
S=0
while k<N
k=k+1
L=L+k
S=S+L
wend
print S
stop
Оператор repeat/until - цикл с постусловием. С его помощью код перепишется так
input N
k=0
L=0
S=0
repeat
k=k+1
L=L+k
S=S+L
until k=N
print S
stop
При использовании оператора while/wend тело цикла выполняется пока остается истинным условие k<N. Тело цикло при использовании оператора repeat/until повторяется, пока не станет истинным условие k=N.
Количества кубиков, о которых мы вели речь сегодня, носят название - пирамидальные числа. Разумеется, существуют и прямые методы расчета пирамидальных чисел. Пирамидальные числа составляют также одну из диагоналей треугольника Паскаля, о котором я уже писал в одной из своих прошлых статей. Таким образом, поставленную задачу можно было решить и без компьютера, но нас интересовал ведь, прежде всего процесс, а не результат...
Колесников А.
andr61@mail.ru