Листинг 4.1 .Текст линейной программы
Команда 1
Команда 2
Команда 3
...
Команда N.
Используя такой подход к программированию, можно было сделать очень немного. Единственное, что было доступно программисту для создания логики в данном случае, — это условные переходы. Под условным переходом понимается переход на какую-то команду при определенных условиях, которые сложились в процессе обработки данных на процессоре.
Например листинг 4.2.
Если выполнено условие, то перейти на
команду 1,
иначе на команду 3.
Команда 1
Команда 2
Команда 3
Команда N.
Это единственная логика, с помощью которой можно было выполнять определенные действия, зависящие от конкретных ситуаций, которые могут сложиться в процессе вычислений. Но программы оставались плоскими и неудобными, потому что написать таким образом сложную логику невозможно. Линейным программированием можно
создать только линейную логику, которая проведет вас по определенным шагам. Например, мастера в программах имеют линейную логику. Она может разветвляться по ходу выполнения шагов мастера, но не может делать что- то более сложное.
Взгляните на программу MS Word. В ней трудно представить себе линейность, потому что здесь как бы присутствует диалог с программой. Вы говорите, что вам надо, а она выполняет ваши действия. При линейном программировании можно создать только такую логику, при которой компьютер запрашивает определенные параметры (данные), и вы вводите их, а отступить от линейности, заложенной в такую логику, очень сложно.
Следующим шагом стал процедурный подход. При этом подходе какой-то код программы мог объединяться в отдельные блоки (процедуры). После этого такой блок команд можно вызывать из любой части программы. Например листинг 4.3.
Начало процедуры1
Команда 1
Команда 2
Конец процедуры 1
Начало программы
Команда 1
Команда 2
Если выполнено условие, то выполнить код процедуры 1.
Команда 3
Конец программы.
В результате появилась возможность использовать один и тот же код в одной программе неоднократно. Код программ стал более удобным и простым для понимания. Именно таким был отец Delphi — язык программирования Turbo/Borland Pascal, который со временем превратился в Object Pascal. И именно на этом языке, учился программированию ваш покорный слуга. Это потом уже я изучил C/C++, Assembler и Java, а первым был именно Turbo Pascal.
Но вернемся к процедурам. Процедуры (и их разновидность — методы) сохранились до сих пор и используются везде, поэтому их понимание очень важно. В процедуры можно передавать различные значения, заставляя их что-то рассчитывать.
Начало процедуры 1 (Переменная 1: строка)
Команда 1
Команда 2
Конец процедуры 1
Начало программы
Команда 1
Команда 2
Если выполнено условие, то выполнить код процедуры 1.
Команда 3
Конец программы.
В этом примере (листинг 4.4) после начала процедуры в скобках указан тип передаваемой переменной. Таким образом, в процедуру можно поместить код какой- нибудь математики и определить параметры в виде переменных, которые используются в этом коде, а затем только передавать ей разные значения в качестве этих параметров. Процедуры остались и в наше время. Чуть позже мы познакомимся с ними на практике применительно к Delphi.
Сразу хочу заметить, что использование процедуры часто называют "Вызов процедуры". Это действительно так, т. е. процедура как бы вызывается.
Давайте рассмотрим пример процедуры (листинг 4.5), приближенный к реальности.
Начало процедуры 1 (Переменная 1: Целое число)
Посчитать факториал числа, находящегося в Переменной 1.
Вывести результат на экран.
Конец процедуры 1
Начало программы
Процедура 1 (10)
Процедура 1 (5)
Процедура 1 (8)
Конец программы.
В этом примере условно используется процедура, которая вычисляет факториал переданного ей значения и потом выводит результат на экран. В самой программе эта процедура используется как процедура 1 (Ю), где цифра в скобках означает переданное ей значение. Вот так получается универсальная процедура, которая считает факториал и выводит результат на экран. Как это все работает? Давай рассмотрим следующий алгоритм.
1. Начало программы.
2. Вызов процедуры Процедура 1 (10) и передача ей значения 10.
3. Процедура вычисляет факториал числа 10 и выводит результат на экран.
4. Выход из процедуры и продолжение выполнения программы.
5. Вызов процедуры Процедура 1 (5) и передача ей значения 5.
6. Процедура вычисляет факториал числа 5 и выводит результат на экран. И т. д. Как видите, код программы очень удобен.
Но процедуры — это мелочи жизни. Более удобным стало использование функций. Функция — это та же процедура, только она умеет возвращать значение, т. е. результат своего выполнения (листинг 4.6).
Начало Функции 1: Тип возвращаемого значения — целое число
Команда 1
Команда 2
Конец Функции 1
Начало программы
Команда 1
Команда 2
Если выполнено условие, то выполнить код процедуры 1.
Команда 3
Конец программы.
Заметьте, что после двоеточия идет описание типа возвращаемого значения. Теперь рассмотрим ту же ситуацию с факториалом.
Допустим, нам надо рассчитать факториал для последующего использования, но не для вывода на экран. Такая задача легко решается с помощью функций (листинг 4.7).
Начало Функции 1 (Переменная 1: Целое число): Целое число
Посчитать факториал числа, находящегося в Переменной 1.
Вернуть результат расчета.
Конец Функции 1
Начало программы
Переменная 1 := Функция 1 (10)
Переменная 2 := Функция 1 (5)
Переменная 3 := Переменная 1+Переменная 2 Вывести на экран Переменную 3
Конец программы.
В этом примере в "переменную 1" записывается результат расчета факториала 10! (переменная1 := Функция 1 (Ю)). В "переменную 2" записывается результат расчета факториала 5!. После этого значения переменных складываются и результат сложения записывается в переменную 3. Последнее действие программы — вывод на экран содержимого переменной 3.