Управляющие структуры в CTRL

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

if-else

Конструкция «if-else» предназначена для организации ветвления в сценарии. В зависимости от значения проверочного выражения будет выполняться одно из двух утверждений.

Синтаксис

if (<проверочное выражение>)
<утверждение1>

else
<утверждение2>

<утверждение1> (термин «утверждение» соответствует исходному английскому термину «statement») выполнится только в том случае, если значение <проверочного выражения> равно «истина» (не равно нулю). В противном случае <утверждение1> пропускается и выполняется <утверждение2> в секции «else». При отсутствии секции «else», в случае если значение <проверочного выражения> равняется «false» (ЛОЖЬ), выполняются команды, следующие за <утверждением1>.

ЗначокПРИМЕР:

main()
{
int rc;
float x, y, z;
dpGet («Valve17.adjustment:_original.._value», x);
if (x > 0) // В зависимости от величины исходного значения x
{
y = 1; // устанавливаются y и z
z = 2;
}
else
if(x < 0)
 {
 y = -1;
 z = 0;
 }
else
 {
 y = 0;
 z = -1;
 }
 DebugN(x, y, z);
}

switch

Условное ветвление, которое выполняется с помощью нескольких утверждений «if-else», может быть выполнено более эффективно с помощью конструкции «switch», где значение проверочного выражения вычисляется один раз.

Синтаксис

switch(<проверочное выражение>)
{
case <выражение1>: <утверждение1>
case <выражение2>: <утверждение2>….]
[default: Утверждение по умолчанию]
}

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

Значок ВНИМАНИЕ

Необходимо отметить, что допускаются только выражения, значения которых заданы до начала выполнения конструкции и неизменны в процессе её выполнения (константные выражения). Допустимыми выражениями являются:
1. Константы, например, 4 или «example»
2. Выражения, результатами которых являются константы, например, 4*2 или «example1» + «example2»
3. Именованные константы, которые были объявлены и инициализированы ранее. Например, const int i =4; или const string f = «example»;

НЕ ДОПУСКАЮТСЯ выражения, значения которых могут быть определены только в процессе выполнения. Недопустимыми выражениями являются:
1. Арифметические операции с двумя константами, например:

const string f = «Example»; //Именованная константа
const string c = «example1»;//Именованная константа
//Код программы……
case f + c :

2. Функции (example())
3. Переменные (а не именованные константы)
4. Результаты условных операций (i > 0 ? 1: 2);

ЗначокПРИМЕР:margin-top: 14pt;» cellspacing=»0″ width=»80%»> main()

{

float y =2;

string s = «ab»;

const string f = «example1»; //Именованная константа

const string c = «example2»;

string fo = «example1»;

switch(y)

{

   case 1.0 + 1.0 : //Выражение, результатом которого является константа

   DebugN(«case 1 = 2»);

   break;

   case 4.2 + 5.3 :  //Выражение, результатом которого является константа

   DebugN(«case 2= 9.5»);

   break;

   default:

   DebugN(«Результат по умолчанию»);

}

switch(s)

{

   case «a» + «b» :  //Выражение, результатом которого является константа

   DebugN(«Значение s равно ab (тип string)»);

   break;

   case «a»:         //Выражение, результатом которого является константа

   DebugN(«Значение s равно a (тип string)»);   

   break;   

   default:    

   DebugN(«Результат по умолчанию»);

}

switch(fo)

{    

   case f :

   DebugN(«Значение fo равняется значению именованной константы f»); //Именованная константа   

   break;    

   case c :    

   DebugN(«Значение fo равняется значению именованной константы c»); //Именованная константа  

   break;  

   default:

   DebugN(«Результат по умолчанию»);

}

}

while

Цикл «while» позволяет повторять некоторый набор утверждений до тех пор, пока значение проверочного выражения равно TRUE (истина). В противном случае выполнение прекращается.

Синтаксис

while (<проверочное выражение>)
<тело цикла>

Тело цикла выполняется только в том случае, если значение проверочного выражения равно TRUE (истина). Значение «истина» соответствует любому ненулевому значению. Непосредственно после выполнения тела цикла значение проверочного выражения оценивается повторно. В случае, если его значение по-прежнему равно TRUE, то тело цикла будет выполнено повторно. В противном случае тело цикла пропускается, выполняются команды, следующие после цикла.

ЗначокПРИМЕР:

В примере ниже представлено вычисление факториала 10 (10! = 1*2*3*…*10):

main()
{
int i,n,nfact;
n = 10;
nfact = 1;
i = 1;
while (i<=n) // пока i <= 10
{
nfact*=i; // nfact умножается на i
i++; // i увеличивается на 1
}
DebugN(nfact); // Результат 10! = 3628 800
}

for

Цикл «for» позволяет повторять некоторый набор утверждений до тех пор, пока значение проверочного выражения равно TRUE (истина). Чаще всего данную конструкцию используют для выполнения необходимого набора действий строго определённое число раз.

Синтаксис

for ([<выражение1>]; [<проверочное выражение>]; [<выражение3>])
<тело цикла>

<Выражение1> вычисляется до начала первого прохождения цикла. Как правило, в <выражении1> инициализируется переменная счетчика. Тело цикла выполняется только в том случае, если значение проверочного выражения равно TRUE (не равно нулю). Непосредственно после выполнения тела цикла вычисляется значение <выражения3>, затем значение проверочного выражения оценивается повторно. В том случае, если значение проверочного выражения по-прежнему равно TRUE, тело цикла выполняется повторно. Если значение проверочного выражения равно FALSE, то тело цикла пропускается, выполняются команды, следующие после цикла. Каждое из трех выражений (<выражение1>, <проверочное выражение>, <выражение3>) не является обязательным. При отсутствии проверочного выражения его значение всегда принимается равным TRUE. В первом примере ниже представлен бесконечный цикл:

ЗначокПРИМЕР БЕСКОНЕЧНОГО ЦИКЛА

main()
{
int i,n,nfact;
n = 10;
nfact = 1;
i = 1;
for (i=1;;i++) // Данный цикл является бесконечным!
nfact *= i;
DebugN(nfact); // Вывод в журнал не будет осуществлён, так как цикл бесконечен
}

ЗначокПРИМЕР 2

main()
{
int i,n,nfact;
n = 10;
nfact = 1;
i = 1;
for(i=1; i<=n; i++)
 nfact *= i;
DebugN(nfakc); // Результат: 10! = 3 628 800
}

do-while

Управляющая конструкция «do-while» аналогична циклу «while». В отличие от цикла «while» утверждения в теле цикла «do-while» выполнятся хотя бы 1 раз.

Синтаксис

  1. do
    1. <тело цикла>
    while (<проверочное выражение>)

do
<тело цикла>
while (<проверочное выражение>)

Значение проверочного выражения оценивается после выполнения тела цикла. В том случае, если значение проверочного выражения равно TRUE, тело цикла выполняется повторно. В противном случае выполняется выход из конструкции «do-while».

ЗначокПРИМЕР:

main()
{
int i,n,nfact;
n = 10;
nfact = 1;
i = 0;
do
{
++i;
nfact *= i;
}
while(i<=n);
DebugN(nfact);
}

break

Оператор «break» используется в управляющих конструкциях «switch» и циклах «for», «while» и «do-while» для принудительного выхода из управляющей конструкции.

Синтаксис

break;

После применения «break» выполнение сценария продолжается с утверждения, которое следует сразу после управляющей конструкции «while», «do-while», «for» или «switch».

continue

Оператор «continue» используется для того, чтобы немедленно перейти к следующей итерации цикла «for», «while» или «do-while».

Синтаксис

  1. continue;

При использовании утверждения «continue;» выполнение сценария (непосредственно после утверждения «continue;») продолжается с начала цикла «do», «while» или «for». При этом повторно оценивается значение проверочного выражения.

ЗначокПРИМЕР:

for (i=0; i < len; i++)
{
if (field[i] == 0)
continue;
field[i] = 1 / field[i];
}

try — catch/finally — throw

Управляющая конструкция «try-catch» необходима для обработки исключительных ситуаций или, как их называют иначе, исключений (exception). При их возникновении дальнейшее выполнение программы невозможно или бессмысленно (например, не объявлена переменная, указатель за пределами массива, деление на ноль и так далее). Также исключительная ситуация (exception) может быть специально вызвана при помощи функции throw().
 

Синтаксис

try {

    <утверждения>;

    throw(errClass e)      // при необходимости формирования исключения

}
catch            

{                                           

    <утверждения>;                 

}
finally         
{                                 

    <утверждения>;

}

Утверждения, которые могут вызвать исключения, указываются в блоке «try». При возникновении исключительной ситуации во время выполнения блока «try» выполнятся команды в блоке «catch». Затем выполняются команды из блока «finally».

Первым блоком всегда является «try». Далее следует блок «catch», затем — «finally». ВАЖНО ОТМЕТИТЬ, что один из блоков «catch» или «finally» может отсутствовать, однако хотя бы один из них должен использоваться в конструкции!

В блоке «catch» выполняется обработка исключения. В блоке «finally» указываются команды, которые необходимо выполнить после блока «catch».

Блок «finally» выполняется вне зависимости от причины возникновения исключения или наличия блока «catch». В блоке «finally» указывается код, который должен быть выполнен в любом случае, даже если на данном этапе исключение не может быть обработано. Например, в блоке «finally» может быть размещён код для обнуления переменной.

Функция throw(errClass e) формирует исключение (‘е’). Исключение всегда имеет тип данных «errClass».

Исключения в блоках catch-finally

Наличие исключений в блоках «catch» и/или «finally» может приводить к непредсказуемым результатам. В связи с этим настоятельно рекомендуется избегать подобных ситуаций.

ЗначокПРИМЕР:

main()

{

  try

  {

    DebugN(«main: try»);

    throw(makeError(«», PRIO_SEVERE, ERR_PARAM, 54, «In main:try»));

    DebugN(«main: try end»);

  }

  catch

  {

    DebugN(«main: catch»);

    DebugN(getLastException());

        //…   

    DebugN(«main: catch end»);

  }

  finally

  {

    DebugN(«main: finally»);

        //…   

    DebugN(«main: finally end»);

  }

  DebugN(«main: end»);

}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *