Меня часто спрашивают, как же сделать программу по настоящему интерактивной, то есть работающей в зависимости от действий пользователя, не всегда заканчивающей работу после того, как она выполнит какие-нибудь действия. Это возможно, причем просто и мы сейчас этим займемся. А поможет нам в этом процедура goto.
Процедура Goto - осуществляет переход в какое-нибудь место в программе из любой ее точки. То есть с ее помощью можно "прыгать" по программе. Обычно эти прыжки происходят из-за каких либо условий, вот пример:
1. Вводим два числа;
2. Складываем их и выводим сумму на экран;
3. Спрашиваем, повторить ли действие?
4. Если ответ утвердительный, переходим (прыгаем) на пункт 1 данного алгоритма.
5. Завершаем программу.
В этом примере программа может выполняться бесконечно, пока ответ пользователя будет утвердительным. Как же это сделать?
Команда goto переходит к определенному месту, которое помечатется так называемой "меткой". Эти метки - особенный тип Паскаля, можно даже сказать и не тип, а часть языка. До того, как их использовать, метки нужно описать - сообщить Паскалю о их наличии. Описание меток поисходит также, как и описание переменных.
Для описания меток имеется специальный раздел, наподобие var (помните, я говорил, что var и begin-end не единственные разделы?) только гораздо проще его. Метки не имеют типа, нужно просто задать им имя. Раздел с метками назвается label и оформляется следующим образом:
Program UseGOTO;
label
First;
var
A,B: Integer;
begin
First:
Write('Введите A: ');
Readln(A);
Write('Введите B: ');
Readln(B);
If A > B Then goto First;
Readln;
end.
Этот пример хорошо демонстрирует использование процедуры goto. Посмотрите внимательно на программу. Что она делает? Запрашивает два числа и если 1-е больше чем 2-е, то повторяется сначала. Необходимые комментарии:
1. label
Это и есть раздел описания меток. Служебное слово label озаглавливает этот раздел, после него идут имена меток. Если меток несколько, то они перечисляются через запятую.
2. First:
Так устанавливается метка в программе. Обратите внимание на синтаксис - после имени метки ставиться двоеточие - ":".
3. If A > B Then goto First;
А это и есть переход при выполнении условия. Заметьте, в конструкии if...then...else отсутсвует слово else, оно нам не нужно, так как мы не делаем ничего при невыполнении условия.
Вот, собственно и все. А теперь давайте вспомним ту задачу, которую я представил вначале - ввести два числа, сложить и запросить повтор. (см. выше).
Итак, напишем эту программу с учетом пройденного материала:
Program UseGOTO;
label
Again;
var
A,B: Integer;
S: String;
Begin
Again:
Write('Введите A: ');
Readln(A);
Write('Введите B: ');
Readln(B);
Writeln('A+B = ',A+B);
Write('Еще раз? (Y/N): ');
Readln(S);
If S = 'Y' Then goto First;
Readln;
end.
Откройте Паскаль и введите эту программу. Запустите ее на выполнение - видите, она уже полностью реагирует на действия пользователя и как бы самостоятельно принимает решение, что делать дальше. Вот это уже полностью интерактивная программа, хотя и простая.
Особых комментариев, думаю, не требуется - все рассказывал ранее. Вот только я использовал одну процедуру, которую мы с вами пока не проходили - думаю, стоит объяснить ее работу.
Процедура Writeln - эта процедура работает точно так же, как и Write, но после того, как выведет строку, она переносит курсор на новую строку. Если вы читали про HTML в прошлых выпусках, то увидите сходство с тэгом <ВR>
Мне часто задавали вопрос, как переносить строки, отделяя таким образом переменные и прочие части вывода. Запомните, для этого и используется эта процедура. Ею можно вообще просто отделять строки - сколько раз вы ее напишите, столько строк будет попущено.
В нашем примере я вывожу с ее помощью строку A+B = (результат), после чего сразу же переноситься курсор и уже обычной процедурой Write выводиться Еще раз? (Y/N). В общем, это очень полезная процедура и невероятно необходимая.
Ну а сейчас мы продолжаем и следующий раздел - типы.