Тема 7. Представление основных управляющих структур программирования

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

Оператор присваивания записывается в виде:

<переменная> = <выражение>;

Значение выражения из правой части присваивается переменной из левой части оператора присваивания. При присваивании необходимо обеспечивать совместимость типов (иногда говорят – совместимость по присваиванию), т.е. тип, полученный при вычислении выражения, должен быть совместим с типом переменной, которой это значение должно быть присвоено. Значение типа T1 является совместимым по присваиванию с типом T2 (то есть, допустим, оператор T1=T2), если выполняется одно из следующих условий:

· T1 и T2 имеют тождественные типы, и ни один из них не является файловым типом или структурным типом, содержащим компонент с файловым типом на одном из своих уровней.

· T1 и T2 являются совместимыми порядковыми типами, и значения типа T2 попадают в диапазон возможных значений T1.

· T1 и T2 являются вещественными типами, и значения типа T2 попадают в диапазон возможных значений T1.

· T1 является вещественным типом, а T2 является целочисленным типом.

· T1 и T2 являются строковыми типами.

· T1 является строковым типом, а T2 является символьным типом (Char).

· T1 и T2 являются совместимыми множественными типами, и все члены значения типа T2 попадают в диапазон возможных значений T1.

· T1 и T2 являются совместимыми типами указателей.

· T1 и T2 являются совместимыми процедурными типами.

· T1 представляет собой процедурный тип, а T2 – процедура или функция с идентичным типом результата, идентичным числом параметров и соответствием между типами параметров.

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

Составной оператор

Синтаксис оператора

{ <операторы> }

Здесь «операторы» – один или несколько любых операторов языка Си, разделенных точкой с запятой. Составной оператор предназначен для объединения нескольких операторов в один, что имеет решающее значение там, где синтаксис языка Си допускает использование только одного оператора.

Оператор перехода Goto

Синтаксис оператора

goto <метка>;

«Метка» - это любой идентификатор, после которого поставлено двоеточие. Оператор goto указывает на то, что выполнение программы необходимо продолжить, начиная с оператора, перед которым записана метка. Метку можно поставить перед любым оператором в той функции, где находится соответствующий ей оператор goto. Ее не надо объявлять.

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

В синтаксисе языка Си предусмотрены две конструкции для записи условного оператора: условный оператор с одним вариантом действии (сокращенная форма) и условный оператор с двумя вариантами действии (полная форма).

Синтаксис оператора if можно представить следующим образом:

if (<условие>) <оператор1> [else <оператор2>];

Здесь «условие» – логическое выражение. В результате его вычисления должен получаться результат, имеющий стандартный логический тип. Если результатом является значение True (Истина), то выполняется «оператор1». Если логическое выражение принимает значение False, и ключевое слово else отсутствует (сокращенная форма), то управление передается оператору, следующему за оператором if. В полной форме условного оператора в этом случае сначала будет выполнен «оператор2».

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

Приведем примеры использования оператора if.

if (A != B) Z = X+Y;

else Z = 1;

if (P1 = null)

{

P1 = Pl^.next;

if (a > 0)

{

if (b > 0)

{

if (c > 0) d = a*b*c;

else

if (d < 0)

{

d = SQRT(–a*b*c);

c = –c*b;

}

else d = SQR(d);

}

else d = a*b;

else d = a;

}

 

Пример 15. Используем оператор if для разработки программы и блок-схемы алгоритма поиска действительных корней квадратного уравнения (рис.31).

float a,b,c,z; /*Даны коэффициенты квадратного уравнения*/

float x1,x2; /*Найти и вычислить их корни*/

 

printf("\nВведите коэффициент а:\n");

scanf("%f",&a);

printf("Введите коэффициент b:\n");

scanf("%f",&b);

printf("Введите коэффициент с:\n");

scanf("%f",&c);

 

z=b*b-4*a*c; /*Z-дискриминант*/

 

if(z>=0.0)

{

x1=(-b+sqrt(z))/2/a;

x2=(-b-sqrt(z))/2/a;

 

printf("\nКорни уравнения:x1=%f,\nx2=%f",x1,x2);

}

else

printf("\nДействительные корни отсутствуют.");

 

Оператор выбора switch

Оператор swith (переключатель), вызывает передачу управления к одному из нескольких операторов, в зависимости от значения выражения. Оператор имеет форму

switch (селектор)

{

case констанстное выражение_1: оператор_1; [break;]

case констанстное выражение_2: оператор_2; [break;]

. . .

case констанстное выражение_n: оператор_n; [break;]

 

[default: оператор; [break;]]

}

 

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

При выполнении оператора swith вычисляется входящий в него селектор и сравнивается с каждой вариантной константой. Если одна из вариантных констант оказывается равной значению этого выражения, то управление передается оператору, который следует за совпадающим вариантным префиксом. Если ни одна из вариантных констант не совпадает со значением выражения и если при этом присутствует префикс default, то управление передается оператору, помеченному этим префиксом. Если ни один из вариантов не подходит и префикс default отсутствует, то ни один из операторов в переключателе не выполняется.

Сами по себе префиксы case и default не изменяют поток управления, которое беспрепятсвенно проходит через такие префиксы. Для выхода из переключателя используется оператор break.

Пример 16. Напишем два эквивалентных оператора: на основе swith и на основе последовательности условных операторов для выбора времени года в зависимости от целочисленного значения переменной months, в которой хранится номер текущего месяца.

// выбор на основе оператора switch

switch (months)

{

case 1 : season = “Зима”; break;

case 2 : season = “Зима”; break;

case 12 : season = “Зима”; break;

case 3 : season = “Весна”; break;

case 4 : season = “Весна”; break;

case 5 : season = “Весна”; break;

case 6 : season = “Лето”; break;

case 7 : season = “Лето”; break;

case 8 : season = “Лето”; break;

default : season = “Осень”; break;

}

// теперь тоже самое на основе операторов if

if (months==1 || months==2 || months==12) season = "Зима";

else

if (months==3 || months==4 || months==5) season = "Весна";

else

if (months==6 || months==7 || months==8) season = "Лето";

else season = "Осень";

 

На блок-схемах алгоритмов оператор выбора изображается следующим образом (рис.32):