Текстовый и числовой ввод-вывод

Ada 95 — это язык для разработки программ реального мира, программ, которые могут быть очень большими (включать сотни тысяч операторов). При этом желательно, чтобы отдельный программный файл имел разумно малый размер. Для обеспечения такого ограничения Ada 95 построена на идее библиотек и пакетов. В библиотеку, составленную из пакетов, помещаются программные тексты, предназначенные для многократного использования.

Пакеты ввода-вывода

Пакет подключается к программе с помощью указания (спецификатора) контекста, имеющего вид

with <Имя_Пакета>;

Размещение в пакетах процедур ввода-вывода (для величин предопределенных типов) иллюстрирует табл. В.1.

Таблица В.1.Основные пакеты ввода-вывода

Имя пакета Тип вводимых-выводимых величин
Ada.Text_IO Ada.lnteger_Text_IO Ada.Float_Text_IO Character, String Integer Float

Для поддержки ввода-вывода величин других типов, определяемых пользователем, используются шаблоны (заготовки) пакетов — родовые пакеты. Родовой пакет перед использованием должен быть настроен на конкретный тип.

Как показано в табл. В.2, родовые пакеты ввода-вывода всегда находятся внутри пакета-библиотеки Ada.Text_IO.

Таблица В.2.Внутренние пакеты из пакета-библиотеки Ada.Text_IO

Имя родового пакета Нужна настройка на тип
Integer_IO Float_IO Enumeration_IO Fixed_IO Decimal_IO Modular_IO Любой целый тип со знаком Любой вещественный тип с плавающей точкой Любой перечисляемый тип Любой двоичный вещественный тип с фиксированной точкой Любой десятичный вещественный тип с фиксированной точкой Любой целый тип без знака

Для обращения к внутренним родовым пакетам используют составные имена, например Ada.Text_IO.Modular_IO, Ada.Text_IO.Enumeration _IO.

Процесс настройки родового пакета называют конкретизацией. В результате конкретизации образуется экземпляр родового пакета. Экземпляр помещается в библиотеку и может быть подключен к любой программе.

Конкретизация задается предложением следующего формата:

with <Полное имя родового пакета>;

package <Имя пакета-экземпляра> is

new <Имя родового пакета> (<Имя типа настройки>);

Например, введем перечисляемый тип:

Type Summer is ( may. jun, jul. aug );

Создадим экземпляр пакета для ввода-вывода величин этого типа:

with Ada.Text_IO.Enumeration_IO;

package Summer_IO is new Ada.Text_IO.Enumeration_IO (Summer);

Теперь пакет SummerJO может использоваться в любой программе.

Процедуры ввода

Формат вызова процедуры:

<ИмяПакета> . Get (<ФактическиеАргументы>);

Например, для ввода величины типа Character записывается оператор вызова

Ada.Text_IO.Get (Var);

В результате переменной Var (типа Character) присваивается значение символа, введенного с клавиатуры. Пробел считается символом, нажатие на клавишу Enter не учитывается.

Еще один пример оператор вызова:

Ada.Integer_Text_IO.Get (Var2);

В этом случае в переменную Var2 типа Integer заносится строка числовых символов. Все ведущие пробелы и нажатия на клавишу Enter игнорируются. Первым символом, отличным от пробела, может быть знак +, - или цифра. Строка данных прекращается при вводе нечислового символа или нажатии на клавишу Enter.

Процедуры вывода

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

Put (<ФактическийПараметр1>,

<ФормальныйПараметрЗ> => <ФактическийПараметрЗ>, ...);

При такой форме порядок записи параметров безразличен.

Например, по оператору вызова

Ada.Text_IO.Put ( Item => Var3 )

значение переменной Var3 (типа Character) отображается на дисплее, а курсор перемещается в следующую позицию.

По оператору вызова

Ada.Integer_Text_IO.Put ( Var4. Width => 4 )

на экране отображается значение целой переменной Var4, используются текущие Width позиций (в примере — 4). Если значение (включая знак) занимает меньше, чем Width, позиций, ему предшествует соответствующее количество пробелов. Если значение занимает больше, чем Width, позиций, то используется реальное количество позиций. Если параметр Width пропущен, то используется ширина, заданная компилятором по умолчанию.

Основные операторы

Оператор присваивания

<ИмяПеременной> := <Выражение>;

предписывает: вычислить значение выражения и присвоить это значение переменной, имя которой указано в левой части.

Условный оператор

if <условие 1> then

<последовательность операторов 1>

elsif <условие 2> then

<последовательность операторов 2>

else

последовательность операторов 3>

end if;

обеспечивает ветвление — выполнение операторов в зависимости от значения условий.

ПРИМЕЧАНИЕ

Возможны сокращенные формы оператора (отсутствует ветвь elsif, ветвь else).

Оператор выбора позволяет сделать выбор из произвольного количества вариантов, имеет вид

case < выражение > is

when <список выбора 1> =>

<последовательность операторов 1>

when <список выбора n> =>

<последовательность операторов n>

when others =>

<последовательность операторов n+1>

end case;

Порядок выполнения оператора:

1) вычисляется значение выражения;

2) каждый список выбора (от первого до последнего) проверяется на соответствие значению;

3) если найдено соответствие, то выполняется соответствующая последовательность операторов, после чего происходит выход из оператора case;

4) если не найдено соответствие, то выполняются операторы, указанные после условия when others.

Элементы списка выбора отделяются друг от друга вертикальной чертой ('|') и могут иметь следующий вид:

q <выражение>;

q <выражение n>..<выражение m>.

Примеры:

case Number is

when 1 | 7 => Put ("Is 1 or 7");

when 5 => Put ("Is 5");

when 25..100 => Put ("Is number between 25 and 100");

when others => Put ("Is unknown number");

end case;

case Answer is

when 'A'..'Z' | 'a'..'z' => Put_Line ("It's a letter!");

when others => Put_Line ("It's not a letter!")

end case;

Оператор блока объединяет последовательность операторов в отдельную структурную единицу, имеет вид

declare

<последовательность объявлений>

begin

<последовательность операторов>

end;

ПРИМЕЧАНИЕ

Объявления из раздела declare действуют только внутри раздела операторов блока.

Пример:

declare

Ch : Character;

begin

Ch := 'A';

Put ( Ch );

end;

Операторы цикла

Оператор цикла loop

loop

<последовательность операторов 1>

exit when <условие выхода>

<последовательность операторов 2>

end loop;

служит для организации циклов с заранее неизвестным количеством повторений.

Порядок выполнения.

1. Выполняется последовательность операторов 1.

2. Вычисляется значение условия выхода. Если значение равно True, происходит выход из цикла.

3. Выполняется последовательность операторов 2. Осуществляется переход к пункту 1.

ПРИМЕЧАНИЕ

Операторы тела повторяются, пока условие равно False. В теле должен быть оператор, влияющий на значение условия, иначе цикл будет выполняться бесконечно. В теле цикла возможно использование безусловного оператора выхода exit или условного оператора выхода exit when <условие>.

Пример:

Count := 1;

loop

Ada.Integer_Text_IO.Put ( Count );

exit when Count = 10;

Count := Count + 1;

end loop:

При выполнении цикла на экран выводится:

Аналогичные вычисления можно задать в следующем виде:

Count := 1

loop

Ada.Integer_Text_IO.Put ( Count );

if Count = 10 then

exit;

end if;

Count := Count + 1;

end loop;

Оператор цикла while также позволяет определить цикл с заранее неизвестным количеством повторений, имеет вид

while <условие продолжения> loop

<последовательность операторов>

end loop;

Порядок выполнения.

1. Вычисляется значение условия. Если значение равно True, выполняется переход к пункту 2. В противном случае (при значении False) происходит выход из цикла.

2. Выполняются операторы тела цикла. Осуществляется переход к пункту 1.

Таким образом, это цикл с предусловием.

Перечислим характерные особенности оператора while.

1. Операторы тела могут выполняться нуль и более раз.

2. Операторы тела повторяются, пока условие равно True.

3. В теле должен быть оператор, влияющий на значение условия (для исключения бесконечного повторения).

Пример:

Count :=1;

loop

while Count <= 10 loop

Put ( Count ):

Count := Count + 1;

end loop;

При выполнении цикла на экран выводится:

Оператор цикла for обеспечивает организацию циклов с известным количеством повторений. Используются две формы оператора.

Первая форма оператора for имеет вид:

for <параметр цикла> in <дискретный диапазон> loop

<операторы тела цикла>

end loop;

Параметр цикла — это переменная, которая заранее не описывается (в программе). Данная переменная определена только внутри оператора цикла. Параметру цикла последовательно присваиваются значения из дискретного диапазона. Дискретный диапазон всегда записывается в порядке возрастания в виде

min .. max;

Операторы тела повторяются для каждого значения параметра цикла (от минимального до максимального).

Пример:

for Count in 1 .. 10 loop

Put ( Count );

end loop;

При выполнении цикла на экран выводится:

1 2 3 4 5 б 7 8 9 10

Вторая форма оператора for имеет вид

for <параметр цикла> in reverse <дискретный диапазон> loop

<операторы тела цикла>

end loop;

Отличие этой формы состоит в том, что значения параметру присваиваются в порядке убывания (от максимального к минимальному). Диапазон же задается по-прежнему, в порядке возрастания.

Пример:

for Count in reverse 1 .. 10 loop

Put ( Count );

end loop;

При выполнении цикла на экран выводится:

ПРИМЕЧАНИЕ

Операторы exit и exit when могут использоваться и в операторах цикла while, for.

Наши рекомендации