Разделы
  Delphi
  C++
  PHP
  Windows
  Linux
 

Основы Delphi: 2. Утверждения (statements)



Утверждения (statements) являются выполняемыми единицами любой программы. Существует много видов утверждений, но все они имеют определенную структуру и функциональное назначение. Разделяют простые и составные утверждения.

Все утверждения организованы в блоки. В частности, выполнение программы начинается с первого утверждения главного блока. Каждое утверждение отделено от другого символом ";", который называется сепаратором или семиликоном. Сепаратор не требуется между ключевым словом begin и утверждением, а также между утверждением и ключевым словом end (но не наоборот).


Простые утверждения

Простые утверждения не содержат в себе других утверждений. Существует всего три вида простых утверждений, которые представлены в следующей таблице:

Присваивание или связывание (assignment)Перемещение значения выражения в переменную.
Определение
<переменная> := <выражение>;
<типизированная область памяти> := <выражение>;
Типы переменной и выражения должны совпадать или быть приводимыми.
Примеры
a := 10;
c := a + b;
buffer[i] := GetByte(i);
PInteger(Data)^ := 1;
Вызов процедуры (procedure call)Вызывает процедуру или функцию с соответствующими параметрами.
Определение
<идентификатор процедуры> ;
<идентификатор> ( ) ;
<идентификатор> ( <выражение> ) ;
<идентификатор> ( <выражение 1> , <выражение 2> , ... ) ;
Типы выражений и формальных параметров процедуры должны соответственно совпадать или быть приводимыми. Если вызывается функция, то ее результат отбрасывается.
Примеры
WriteLn('Hello, World!');
CreateWindow(100,100,400,300,'Hello, World');
ReadLn;
Application.Initialize();
Переход на метку (go to label)Безусловный переход указателя выполнения программы на следующее после метки утверждение.
Определение
goto <идентификатор> ;
Для создания метки необходимо объявить ее идентификатор в области объявления. Далее необходимо указать, на какое утверждение можно перейти по этой метки. Для чего перед утверждением пишется идентификатор метки и символ ":".
Пример
label M;

begin
  WriteLn('1');

  goto M;

  WriteLn('2'); // это место никогда не будет достигнуто

M:
  WriteLn('3');
end.
Использование меток считается плохим стилем программирования, однако их можно использовать, когда иные способы создают слишком много избыточного кода.


В качестве закрепления изложенного материала приведем пример:

program Statements;

{$APPTYPE CONSOLE}

var
  x, f: single;

label Start, Exit;

begin
  WriteLn('Hello!'#13#10);

Start:
  Write('x = ? ');
  ReadLn(x);

  if x < 0 then
    goto Exit;

  f := sqrt(x);

  WriteLn('f(x) = ',f:10:4,#13#10);

  goto Start;

Exit:
  WriteLn('Goodbye!');
  ReadLn;
end.

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

Hello!

x = ? 2
f(x) =     1.4142

x = ? 2.25
f(x) =     1.5000

x = ? -1
Goodbye!

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


Составные утверждения

Составные утверждения могут содержать в себе другие утверждения. В следующей таблице представлены основные составные утверждения:

БлокПоследовательное выполнение нескольких утверждений.
Определение
begin
  <утверждение 1> ;
  <утверждение 2> ;
  ...
end;
Блок сам по себе является составным утверждением и может быть использован в других составных утверждениях. Каждое ключевое слово begin должно иметь пару в виде ключевого слова end.
Пример
begin
  a := 10;

  begin
    b := 20;
    c := a + b;
  end;

  if c = 30 then
  begin
    begin
      begin
        Write('C = 30');
        WriteLn;
      end;
    end;
  end;
end;
Условие (if)Определяет истинность значения выражения и выполняет соответствующее утверждение.
Определение
if <выражение> then
  <утверждение 1>   // здесь нельзя ставить сепаратор
else
  <утверждение 2> ;
if <выражение> then
  <утверждение 1> ;
Значение выражения должно быть логического типа (boolean). Если выражение истинно, то выполняется утверждение 1. Иначе выполняется утверждение 2. Если утверждение 2 не задано, то идет переход на следующее после if утверждение.
Пример
if a = b then
  if b = c then
    WriteLn('a = c')
  else  // данный else будет относиться к ближайшему if
    WriteLn('a <> c')
else    // а этот к оставшемуся
  WriteLn('a <> b');
Выбор (case)Сравнение значения выражения с заданными вариантами и выполнение утверждения у совпавшего варианта.
Определение
case <выражение> of
  <вариант 1> : <утверждение 1> ;
  <вариант 2> : <утверждение 2> ;
  ...
else
  <утверждение N> ;
end;
case <выражение> of
  <вариант 1> : <утверждение 1> ;
  <вариант 2> : <утверждение 2> ;
  ...
end;
Значение выражения должно быть исчисляемого типа. Варианты должны быть константами и попарно различаться. Тип варианта и выражения должны совпадать или быть приводимыми. В качестве варианта можно использовать диапазон значений. Если значение выражения совпадает с каким-либо вариантом или входит в его диапазон, то выполняется соответствующее утверждение. Если значение выражения не совпадает ни с одним вариантом, то выполняется утверждение N, если оно присутствует.
Примеры
case Number of
  0:    WriteLn('Number is zero');
  1..9: WriteLn('Number is positive digit');
end;
case Character of
  '+','-','*','/': WriteLn('Sign');
  '0'..'9': WriteLn('Digit');
  '(',')': WriteLn('Bracket');
else
  WriteLn('Invalid symbol');
end;
Цикл с предусловием (while)Выполнение утверждения, пока значение выражения истинно.
Определение
while <выражение> do
   <утверждение> ;
Значение выражения должно быть логического типа. Утверждение может не выполниться ни один раз, если выражение изначально ложно. Если выражение будет постоянно истинным, то произойдет зацикливание, что приведет к зависанию программы.
Примеры
i := 0;
while GetByte(i) <> 0 do
  inc(i);
while a > 0 do
begin
  WriteLn(a mod n);
  a := a div n;
end;
Цикл с постусловием (repeat)Выполнение блока утверждений, пока выражение не станет истинным.
Определение
repeat
  <утверждение 1>
  <утверждение 2>
  ...
until <выражение> ;
Значение выражения должно быть логического типа. Блок утверждений обязательно выполнится хотя бы один раз. Цикл прервется, когда после очередного выполнения блока значение выражения будет истинным. Если выражение будет постоянно ложным, то произойдет зацикливание, что приведет к зависанию программы.
Пример
repeat
  inc(i)
  a := buffer[i];
  b := GetByte(i);
until (a <> b) or (i > size);
Цикл с определенным числом итераций (for)Выполнение утверждения определенное число раз.
Определение
for <переменная> := <выражение 1> to <выражение 2> do
  <утверждение> ;
for <переменная> := <выражение 1> downto <выражение 2> do
  <утверждение> ;
for <переменная> in <выражение 3> do
  <утверждение> ;
Переменная должна быть локальной и ее тип должен быть перечисляемым. Типы выражений 1,2 и переменной должны совпадать или быть приводимыми. Тип выражения 3 должен быть массивом или множеством элементов такого же типа, как и переменная. При использовании ключевого слова to переменная при каждой итерации будет увеличиваться на 1, начиная со значения выражения 1 и заканчивая значением выражения 2 включительно. При использовании ключевого слова downto переменная при каждой итерации будет уменьшаться на 1, начиная со значения выражения 1 и заканчивая значением выражения 2 включительно. Если значение выражения 1 больше значения выражения 2 при использовании to (или меньше при использовании downto), то цикл не выполнится ни разу. После выполнения всех итераций значение переменной не определено.
Примеры
for i:=1 to 10 do
  WriteLn('i = ',i);
for i:='z' downto 'a' do begin
  s := s + i;
  WriteLn(s);
end;
for i in [0..3,7..9] do
  WriteLn(i,' is in the set');
for i in buffer do begin
  SetByte(i);
  crc := (crc shl 8) xor CRCTable[(crc shr 8) xor i];
end;

Подробнее о некоторых составных утверждениях мы поговорим в отдельных статьях.




Copyright (C) ZasKok S.M.S., 2009-2010
Hosted by uCoz