- •1. Приступаем к изучению языка delphi
- •I love Delhi
- •20 Degrees Celsius is 68 degrees Fahrenheit.
- •4.2 Light are 265608 astronomical units
- •2. Представление данных переменными
- •Integer is 4 bytes
- •Integer is 2147483647
- •Integer is -2147483648
- •3. Составные типы данных
- •Volume: Integer;
- •Volume: 1.40
- •Var a: array of integer;
- •4. Циклы и выражения сравнения
- •1952 Hudson Hornet
- •1951 Kaiser
- •5. Операторы ветвления и логические операции
- •If проверяемое_условие then
- •3 Spaces, 13 charaters total in sentence
- •If проверяемое_условие then
- •27 Is right!
- •6 Entries or enter a negative value.
- •4 Numbers in massive greater then your number
- •2 Spaces
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.
