Книга: Песни о Паскале

Глава 8 Постоянные и переменные

Глава 8

Постоянные и переменные


Знаком ли вам Эдсон Арантес ду Насименту? Неужто не слышали о великом Пеле? Ведь оба имени принадлежат одному человеку! В Бразилии полно отменных футболистов, и у всех – пышные имена. Но от футбольных комментаторов вы их не услышите. Бразильцы – а все они фанаты – дали своим любимцам короткие клички. Так на весь мир прославились Пеле, Зико, Ривалдо…

Константы

Придумка бразильских фанатов напомнила решение сходной проблемы программистами. В разных частях программы нередко попадаются одни и те же данные – строчки текста или числа. Взять хотя бы предыдущую программу, где в начале и в конце приветствия печатаются две горизонтальные черты. Если в этих операторах задать линии разной длины, то красота слегка пострадает. Пустяки? Конечно. Но в иных случаях ошибочка обойдется втридорога, например, в программе управления ракетой.

Предположим, что в расчете полета ракеты учитывается масса её полезной нагрузки, и это число разбросано по всем частям программы. Вы должны указать его везде одинаково, без ошибки, иначе ракета улетит «за бугор». А если переделка ракеты повлечет изменение этого числа? Тогда доведется тщательно «прочесать» программу в поисках всех исправляемых операторов.

Проблема очевидна, но Паскаль даёт средство её решения – это символические константы. «Константа» в переводе на русский означает «постоянный», «неизменный». Константа подобна кличке бразильского футболиста: любому элементу данных – числу или строке – вы можете назначить удобное имя, а затем подставлять это имя вместо самих данных. Покажем это на примере нашей программы.

Прежде, чем применить символическую константу, её надо объявить, то есть дать ей имя и значение. Для объявления используют ключевое слово CONST, за которым следует нечто, похожее на простую формулу.

      const Имя_константы = Значение_константы;

Слева от знака равенства указывают имя константы, а справа – её значение. Предположим, что длинный прочерк я обозначил словом Line – «линия». Тогда объявление константы для линии будет таким.

      const Line = ’---------------------------’;

Обратите внимание, что объявление константы – это оператор, и после него следует точка с запятой! Теперь в любом месте программы я могу напечатать прочерк, пользуясь именем этой константы.

      Writeln(Line);

Параметром процедуры печати Writeln здесь по-прежнему является всё та же строковая константа, только теперь она обозначена через свое имя Line.

Слово CONST открывает секцию объявления констант, внутри которой надо объявить хотя бы одну константу, – секция не терпит пустоты! Вот объявление двух констант, где для наглядности слово CONST записано в отдельной строке.

Const
      C1 = ’Мой повелитель!’;
      Pele = ’Эдсон Арантес ду Насименту’;

Секцию констант располагают до слова BEGIN перед началом выполняемых операторов. Следовательно, новый вариант нашей программы будет таким.

const
      Line = ’---------------------------’;
begin
Writeln(Line);
Writeln(’Мой повелитель!’);
Writeln(’Поздравляю тебя с написанием первой программы!’);
Writeln(’Твой верный слуга Паскаль’);
Writeln(Line);
Readln
end.

Программа будет работать точь-в-точь, как и раньше. Но теперь мы уверены, что линии будут одинаковыми. А если потребуется изменить линию и составить её из звездочек? Тогда исправим лишь объявление константы:

const       Line = ’***************************’;

и после повторной компиляции программа заработает по-новому.

Константы облегчают жизнь программиста и повышают надежность программ. Но, повторяю, после изменения константы вы должны повторно откомпилировать программу!

Идентификаторы

Для констант придумывают подходящие имена. Впрочем, это касается и других объектов программы, о которых вы скоро узнаете. Выдуманные программистом имена называют идентификаторами (IDENTIFIER). Запомните это словцо, оно ещё «намозолит» вам глаза. Изобретатель идентификаторов ограничен следующими рамками.

• В идентификаторах допустимы лишь латинские буквы, знак подчеркивания и цифры.

• Идентификатор начинают либо с буквы, либо с подчеркивания (но только не с цифры!).

• Идентификатор может содержать до 127 символов, (в Borland Pascal учитываются только первые 63 из них).

• Не допускается совпадение идентификатора с ключевым словом.

Русские буквы и знаки препинания в именах запрещены. Большие и маленькие латинские буквы равнозначны (регистр букв не учитывается), поэтому идентификаторы Pascal и PASCAL считаются одинаковыми.

Вот примеры правильных идентификаторов:

A, b, C       - однобуквенные имена
R1, U28, _13_       - имена с цифрами и подчеркиванием
Cosmos, ABBA       - однословные имена
NextStep, Next_Step – имена, составленные из двух слов

А это ошибочные имена:

7Up – начинается с цифры
End – совпадает с ключевым словом

Изобретая имена, мы будем придерживаться некоторой системы с тем, чтобы меньше путаться в своих придумках. Так, имена констант условимся начинать с латинской буквы «C» (например, CLine).

Переменные

Согласитесь, наш последний шедевр – программа P_07_1 – пока не слишком умна, при каждом запуске она тупо твердит одно и то же. Сотворим нечто поумней: пусть наша следующая программа сначала спросит имя пользователя, а затем обратится к нему по этому имени. На экране это будет выглядеть так:

Как тебя зовут?
Антон
Здравствуй, Антон
Нажми Enter

Здесь выделенное курсивом слово «Антон» во второй строке ввёл пользователь. Такие программы называют диалоговыми.

Ясно, что неизвестное имя собеседника в программу заранее не вставишь. Константа тут бесполезна, – ведь она вбивается в программу заранее и не меняется после компиляции. Если данные вводятся пользователем в ходе выполнения программы, им нужно нечто иное, – этим данным надо отвести место для хранения их в памяти. И тогда мы сможем как-то работать с этими сохраненными данными (например, печатать).

Где хранят предметы? В ящиках, карманах, кошельках. Для хранения данных в памяти используют переменные (VARIABLE). Переменная – это своего рода «карман» с именем, данным ему программистом. В ходе работы программа может «укладывать» в переменную данные, и затем обращаться с ними по своему усмотрению. Этот «карман» действует по принципу: что положил, то и взял. Иначе говоря, в переменной хранится то, что было положено последним. Но, в отличие от кошелька, единожды положенное в переменную можно извлекать многократно, – этот «карман» никогда не опустеет!

Прежде, чем пользоваться переменной, её, как и константу, надо объявить. Для этого служит секция объявления переменных, которую открывают ключевым словом VAR (сокращение от VARIABLE), секцию помещают до исполняемых операторов – перед словом BEGIN. Внутри секции объявляют одну или несколько переменных. Каждое такое объявление содержит два элемента: имя переменной и её тип, разделяемые двоеточием:

var Имя_переменной : Тип_переменной;

Ну, с именем все ясно – это обычный идентификатор, который вы изобретаете сами. А что такое тип, и в чем его смысл? В этой обширной теме мы со временем разберемся основательно, а сейчас затронем лишь слегка.

Укладывая предметы, вы учитываете их размеры, вес и назначение. Пылесосу удобно в своей коробке, а монете – в кошельке. «Каждый сверчок – знай свой шесток». Встретив в программе объявление переменной, компилятор отводит ей место в оперативной памяти с тем, чтобы хранимые данные поместились там. То есть, кроит «карман» подходящего размера. Это первое.

А ещё компилятору надо знать набор допустимых действий с теми данными, что «лежат» в переменной: можно ли их складывать и умножать? Или это строка текста, предназначенная для вывода на экран? Ответ на эти вопросы заключен в типе переменной. По нему компилятор определяет и размер переменной, и набор допустимых операций с нею.

Паскаль содержит ряд встроенных типов данных, со временем вы познакомитесь с ними, но сейчас нам позарез нужен только один из них. Это тип STRING, что в переводе значит «строка» – это ключевое слово языка. Переменная этого типа может хранить в себе строчку какого-нибудь текста.

Объявим переменную для хранения в ней имени пользователя. Как назовем её? Да так и назовем – Name, что переводится как «имя». Итак, объявление переменной Name строкового типа STRING выглядит так:

var Name : string;

Напомню, что имя и тип переменной разделяются двоеточием, а завершается оператор точкой с запятой.

Ввод и вывод данных

Теперь, когда мы объявили переменную, попробуем ввести в неё данные, а затем вывести данные на экран.

Ввод данных в переменную выполняется знакомой вам процедурой Readln. Мы уже пользовались ею, чтобы заставить компьютер ждать нажатия Enter. Но процедура придумана в основном не для этого, а для ввода разнообразных данных, в том числе строк. С этой целью процедуре передают параметры – переменные, куда вводятся данные. В нашем случае оператор ввода имени будет таким:

      Readln(Name);

Выполняя этот оператор, компьютер тоже остановится в ожидании нажатия Enter. Но символы, которые пользователь напечатает до этого нажатия, попадут в переменную Name и сохранятся там. Так в строковую переменную можно ввести слово, и даже целое предложение, завершив ввод нажатием Enter.

А как напечатать содержимое переменной? Справится ли с этим процедура Writeln? Без сомнения! Ведь нечто подобное мы уже проделывали с константой. Вот оператор печати для этого случая:

      Writeln(Name);

Все хорошо, да вот незадача! Этот оператор напечатает имя в отдельной строке, а нам хочется объединить его со словом «Привет» в одной строчке. Как это сделать? Очень просто! Ведь в процедуре печати можно указать несколько параметров, разделяя их запятыми, и тогда все они напечатаются в одной строке. В нашем случае через запятую укажем два параметра:

Writeln(’Здравствуй, ’, Name);

Здесь первый параметр – строковая константа «Здравствуй,» (с пробелом в конце), а второй – переменная Name.

Теперь все готово для рождения новой программы. Создайте пустой файл с именем «P_08_1.PAS», а затем введите в него плод наших размышлений.

var Name : string;
begin
Writeln(’Как тебя зовут?’);
Readln(Name);
Writeln(’Здравствуй, ’, Name);
Writeln(’Нажми Enter’); Readln;
end.

Откомпилируйте программу и проверьте, работает ли она.

Итоги

• Константы полезны для именования неизменяемых данных. Они облегчают работу и повышают надежность программ. Но константы не могут изменяться в ходе выполнения программы.

• Переменные предназначены для хранения в оперативной памяти компьютера изменяемых данных. Переменные могут изменяться в ходе выполнения программы.

• Каждая переменная относится к некоторому типу данных, который определяет и объём занимаемой ею памяти и правила действия с переменной.

• Ввод данных в переменные выполняется оператором Readln, а вывод – оператором Writeln.

• Процедура Writeln может напечатать в одной строке несколько параметров – констант и переменных, разделенных запятыми.

• Имена констант и переменных – это идентификаторы. Программист составляет их по своему усмотрению из латинских букв, цифр и знака подчеркивания.

А слабо?

А) Что напечатает следующая программа, если ваша любимая команда – «Спартак»?

const
      Champ = ’ – чемпион!';
var
      Team : string;
begin
Writeln(’Ваша любимая команда?’);
Readln(Team);
Writeln(Team, Champ);
Readln
end.

Б) Найдите (и исправьте, если можно) ошибки в следующих программах.

begin
const Pele = ’Эдсон Арантес ду Насименту’;
Writeln(’Лучший футболист мира – ’, Pele);
Readln
end.
begin
Writeln(’Как тебя зовут?’);
var Name : string;
Readln(Name);
Writeln(’Здравствуй, ’, Name);
Writeln(’Нажми Enter’); Readln;
end.
const Pele = ’Эдсон Арантес ду Насименту’;
begin
Writeln(’Лучший футболист мира’);
Readln(Pele);
Writeln(Pele);
Readln
end.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.026. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз