Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi через Прат.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
632 Кб
Скачать
☆

6 Entries or enter a negative value.

1

2

3

4

5

6

Enter your number: 2

4 Numbers in massive greater then your number

Примечания к программе

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

Readln(temp);

while (i <= ArSize) and (temp > 0) do //два критерия выхода

begin

naaq[i] := temp;

Inc(i);

if i <= ArSize then //в массиве остается свободное место,

Readln(temp); //поэтому получаем следующее значение

end;

Программа начинает работу с чтения первого введенного значения во временную переменную temp. Затем выражение условия продолжения цикла while проверяет, имеется ли свободное место в массиве (i <= ArSize) и не является ли введенное значение отрицательным (temp > 0). Если это условие выполняется, программа копирует значение temp в массив и увеличивает индекс массива на 1. На этот момент, поскольку нумерация массива начинается с 1, значение i равно общему количеству записей. Другими словами, если начальное значение i составляет 1, то в результате первой итерации цикла присваивается значение элементу массива naaq[1], а затем переменной i присваивается значение 1.

Цикл завершается, когда массив будет заполнен или когда пользователь введет отрицательное число. Обратите внимание на то, что цикл считывает следующее значение в переменную temp только если i меньше ArSize, т.е. только в случае, когда в массиве есть свободное место.

После получения данных программа использует оператор if else для отображения комментария, если никакие новые данные не были введены (т.е. если первое введенное значение было отрицательным числом), и для обработки данных, если таковые имеются.

Определение диапазонов с помощью операции AND

Операция and позволяет также задавать последовательности операторов if else if else, каждая ветвь которых соответствует конкретному диапазону значений. Данная возможность демонстрируется в листинге 5.6. В программе из листинга 5.6 массив qualify используется для хранения адресов четырех строк. Например, элемент qualify[1] содержит адрес строки "molodoy". Программа может использовать qualify[1] подобно любой другой переменой, например, с оператором Writeln.

Листинг 5.6

//использование логического И

program Project1;

{$APPTYPE CONSOLE}

var

qualify: array[1..4] of string = ('molodoy', 'sredniy', 'nemolodoy',

'pozhiloy');

age, index: Integer;

begin

Write('Enter your age in years: ');

Readln(age);

if (age > 17) and (age <= 35) then

index := 1

else if (age > 35) and (age <= 50) then

index := 2

else if (age > 50) and (age < 65) then

index := 3

else

index := 4;

Writeln('You qualify for the ', qualify[index]);

Readln;

end.

Результат:

Enter your age in years: 87

You qualify for the pozhiloy

Введенный возраст не соответствует ни одному из проверяемых диапазонов, поэтому программа устанавливает значение индекса равным 4, а затем выводит соответствующую строку.

Примечания к программе

С помощью выражения (age > 17) and (age < 35) проверяется соответствие возраста диапазону 18-34. В выражении (age >= 35) and (age < 50) операция <= используется для включения значения 35 в указанный диапазон, который составляет 35-49. Если бы в программе использовалось выражение (age > 35) and (age < 50), значение 35 не охватывалось бы ни одной проверкой. При использовании выражений проверки на соответствие диапазону нужно обеспечить отсутствие пробелов между диапазонами и накладок диапазонов. Кроме того, следует правильно определить каждый диапазон.

Оператор if else служит для выбора индекса массива, который, в свою очередь, идентифицирует конкретную строку.

Операция логическое НЕ: not

Операция not реализует отрицание, или инвертирование следующего за ним выражения сравнения. Таким образом, если выражение имеет значение true, то not выражение имеет значение false и, наоборот.

Как правило, отношение можно выразить в более понятном виде, не прибегая к этому оператору:

if not х > 5 // выражение if (x <= 5) понятней

Однако операция not может быть удобной при работе с функциями, которые возвращают значение true или false, либо значения, которые могут интерпретироваться таким образом.

В программе, приведенной в листинге 5.7, эта методика (выполнение операции not по отношению к возвращаемому значению функции) используется для отображения соответствия введенных значений типу int. Определяемая пользователем функция is_int(), которая будет описана далее, возвращает значение true, если ее аргумент находится в диапазоне значений, допустимых для типа int. Затем программа использует выражение while not is_int(num) для отсечения значений, не соответствующих этому диапазону.

Листинг 5.7

//реализация операции отрицания

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

num: Double;

val: Integer;

function is_in(x: Double): Boolean;

begin

if (x >= Low(Integer)) and (x <= High(Integer)) then

Result := True

else

Result := False;

end;

begin

Write('Enter an integer value: ');

Readln(num);

while not is_in(num) do //продолжается, пока значение типа num

begin //не становится допустимым для типа Integer

Write('Out of range-please try again: ');

Readln(num);

end;

val := Round(num);

Writeln('You entered the integer: ', val);

Readln;

end.

Результат:

Enter an integer value: 3000000000

Out of range-please try again: -3000000000

Out of range-please try again: 100

You entered the integer: 100

Примечание к программе

При вводе значения, превышающего допустимые значения типа Integer, многие реализации языка просто усекают значения до допустимого размера, не сообщая о потере данных. В приведенной программе этот недостаток устраняется путем считывания потенциального значения Integer как значения типа Double. Тип Double имеет более чем достаточную точность для хранения типичного значения Integer, а его диапазон допустимых значений намного больше.

В логической функции is_in() используются функции Low и High, для определения соответствия ее аргумента допустимому диапазону. В случае соответствия программа возвращает значение true; в противном случае – false.

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

Оператор множественного выбора case

Оператор case позволяет провести анализ значения некоторого выражения и в зависимости от его значения выполнять те или иные действия. В общем случае формат записи оператора case следующий:

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

<список значений 1>: <оператор 1>;

<список значений п>: <оператор п>;

else

<оператор>

end;

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

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

Если значение выражения не соответствует ни одному из перечисленных во всех списках, то выполняется оператор, следующий после ключевого слова else. Впрочем, раздел else не обязательно должен включаться в структуру case. В этом случае, если в списках не нашлось соответствующего значения выражения, то ни один оператор не будет выполнен.

Приведенный ниже пример анализирует переменную Key типа Char, содержащую символ, введенный пользователем в ответ на некоторый вопрос. При положительном ответе вызывается процедура FYes, при отрицательном — FNo, при иных ответах отображается сообщение об ошибке.

case Key of

'у', 'У': FYes;

'n', 'N': FNo;

else

ShowMessage('Ошибочный ответ');

end;

Приведем другой пример, использующий, в частности, ограниченные типы в списках и целую переменную I:

case I of

1..5 : Caption := 'Low';

6..9 : Caption := 'High';

0,10..99: Caption := 'Out of range';

else

Caption := '';

end;

Использование оператора case для реализации простого меню показано в листинге 5.8. Для отображения набора вариантов в программе применяется функция showmenu(). Затем оператор case выбирает действие, исходя из ответа пользователя.

Листинг 5.8

//использование оператора case

program Project1;

{$APPTYPE CONSOLE}

var

choice: Integer;

procedure showmenu;

begin

Writeln('Please enter 1, 2, 3, 4, or 5:');

Writeln('1) alarm 2) report');

Writeln('3) alibi 4) comfort');

Writeln('5) quit');

end;

procedure report;

begin

Writeln('It''s been an excelent week for business.');

Writeln('Sales are up 120%. Expenses are down 35%.');

end;

procedure comfort;

begin

Writeln('comfort');

end;

begin

showmenu;

Readln(choice);

while choice <> 5 do

begin

case choice of

1: Writeln(#7);

2: report;

3: Writeln('The boss was in all day.');

4: comfort;

else

Writeln('That''s not a choice.');

end;

showmenu;

Readln(choice);

end;

Writeln('Bye!');

Readln;

end.

Выполнение цикла while прерывается, когда пользователь вводит 5. Ввод чисел от 1 до 4 приводит к выбору соответствующего варианта из списка case, а ввод 6 — к переходу к операторам, определенным по умолчанию оператором else.

Процедуры Break и Continue

Процедуры Break

Вызов процедуры Break внутри цикла while, for или repeat … until организует немедленный выход программы из цикла. Подобный метод полезен в тех случаях, когда во время выполнения цикла возникло некоторое обстоятельство, требующее немедленного завершения его выполнения. В приведенном ниже примере выполнение цикла прекращается после выполнения пяти итераций:

var

i: Integer;

begin

for i := 1 to 1000 do

begin

MessageBeep(0); //подача звукового сигнала

if i = 5 then Break;

end;

end;

Процедура Continue

Вызов процедуры Continue в некотором цикле приводит к опусканию оставшейся части блока кода цикла и переходу к началу следующей итерации. В частности, в приведенном ниже примере при первой итерации второй оператор вывода строки выполнен не будет:

var

i: Integer;

begin

for i := 1 to 3 do

begin

Writeln(i, '. Before continue');

if i = 1 then Continue;

Writeln(i, '. After continue');

end;

end.

Применение обоих операторов показано в листинге 5.9. Пользователь вводит строку текста. Цикл отображает на экране каждый символ; если встречается точка, то используется оператор break для завершения цикла. Этот пример демонстрирует, как можно использовать оператор break для завершения цикла изнутри, если некоторое условие становится истинным. Затем программа подсчитывает количество пробелов, но не остальных символов. Оператор continue используется для пропуска связанной с подсчетом части цикла, когда символ не является пробелом.

Листинг 5.9

//использование операторов continue и break

program Project1;

{$APPTYPE CONSOLE}

var

spaces: Integer = 0;

i: Integer;

line: string;

begin

Writeln('Enter a line of text: ');

Readln(line);

for i := 1 to Length(line) do

begin

Write(line[i]); //отображение символа

if line[i] = '.' then

Break; //выход, если точка

if line[i] <> ' ' then //пропуск остальной части

Continue;

Inc(spaces);

end;

Writeln(#10, spaces, ' spaces');

Writeln('Done');

Readln;

end.

Результат:

Enter a line of text:

Make the plan. This is a map.

Make the plan.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]