Общий вид структуры выбора if/else:

if (выражение) оператор1;

else оператор2;

Если выражение истинно (отлично от нуля), то выполняется оператор 1, в противном случае оператор 2.

В языке Си предусмотрена условная операция (?:), которая тесно связана со структурой if/else. Для нее необходимо три операнда. Операнды вместе с условной операцией образуют условное выражение. Первый операнд является условием, второй операнд значением для всего условного выражения, если условие истинно, и третий операнд значением для всего условного выражения, если условие ложно. Например,

x>y? printf(“max=%d\n”, x) : printf(“max=%d\n”, y);

Вложенные структуры if/else служат для проверки составных условий, при этом одни структуры if/else помещаются внутри других структур if/else.

Приведем следующую форму записи:

if (выраж. 1)

оператор 1;

else if (выраж. 2)

оператор 2;

else

оператор 3

Если выражение 1 истинно, выполняется оператор 1. Если выражение 1 ложно, но выражение 2 истинно, выполняется оператор 2. В случае, когда оба выражения ложны, выполняется оператор 3.

Логические операции. При объединении двух или более условных выражений используются логические операции. В языке Си имеются три логические операции: & & (и), !! (или), ! (не).

1. fl1 && fl2 истинно в том и только в том случае, когда оба выражения fl1 или fl2 истинны.

2. fl1 || fl2 истинно в том и только в том случае, когда оба выражения fl1 или fl2 истинно или оба истинны.

3. !fl1 истинно, если выражение fl1 ложно, и наоборот.

НЕ нашли? Не то? Что вы ищете?

Пример: 15>12 && 8>10 - ложно (истинно таким образом одно подвыражение)

15>12 | | 8>10 – истинно (по крайней мере одно подвыражение истинно)

! (8>10) истинно

Операция! имеет очень высокий приоритет, только круглые скобки имеют более высокий приоритет. Приоритет операции && выше, чем операции ||, а обе эти операции имеют более низкий приоритет, чем операция присваивания.

При использовании операции && и || необходимо отметить следующее: выполнение этих операций прекращается, как только становится ясно, будет ли результат иметь значение истина или ложь. Предположим, что имеется выражение вида: fl1 && fl2.

Если fl1 – ложь, значит и все выражение ложь, таким образом, fl2 не будет вычисляться.

Аналогично, если мы имеем выражение вида fl1 || fl2,

То fl2 не будет вычисляться, если fl1 – верно.

В следующей программе показан пример использования структуры выбора if/else с двойным выбором.

// Вычисление стоимости покупки с учетом скидки

#include <stdio. h>

#include <conio. h>

void main()

{

float sum; /* сумма покупки */

printf(“\nВычисление стоимости покупки с учетом ”);

printf(“скидки\n”);

printf(“Введите стоимость покупки ->”);

scanf(“%f”, &sum);

if (sum<1000) printf(“Скидка не предоставляется.\n”);

else { printf(“Вам предоставляется скидка ”);

if (sum>3000) { printf(“5%\n”);

sum = 0.95 * sum; }

else { printf(“3%\n”);

sum = 0.97 * sum; };

printf(“Сумма с учетом скидки %.2f тг\n”, sum); }

printf(“\nДля завершения нажмите <Enter>”);

getch(); }

Результат программы:

Вычисление стоимости покупки с учетом скидки

Введите стоимость покупки -> 2250

Вам предоставляется скидка 3%.

Стоимость покупки с учетом скидки: 2182.50 тг.

Оператор выбора switch (переключатель)

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

Общий вид оператора switch:

switch (выражение)

{

case метка 1:

операторы;

case метка 2:

операторы;

---------------------------------

default:

операторы;

}

Выражения и метки должны иметь значения целого типа (включая тип char); метки должны быть константами или константными выражениями. Вначале вычисляется выражение в скобках, затем происходит сравнение вычисленного значения выражения с каждым значением метки. Если они совпадают, начинается выполнение операторов данной метки, которое продолжается либо до конца оператора switch. Оператор break используется для выхода из switch и осуществляется переход к следующему за ним оператору. Если значения выражения не совпадает ни с одной из меток, но в операторе switch существует метка default, то будут выполняться операторы этой метки. Если метки default нет, происходит переход к оператору, расположенному за оператором switch.

В операторе switch нельзя использовать вещественные типы данных, строки и других структуры данных, но разрешает использовать элементы структур данных совместимых с целыми значениями.

main ( )

{char ch;

while ((ch=getchar ( ))!='#'

{ switch (ch){

case f:

case 'F': do_file_menu; break;

case 'r':

case 'R': run_program ( ); break;

case 'c':

case 'C':do_compile ( ); break;

default: Ex ( ); break; }

printf (“Введите букву или #”); }

Основная литература: 1осн[94-101], 2осн[168-209], 3осн[53-57]

Дополнительная литература: 10доп[108-115]

Контрольные вопросы:

1. Назовите логическую операцию самого высокого приоритета?

2. Какой оператор используется для выбора одного варианта из нескольких?

3. В каком случае используется операторы метки default?

4. Какие структуры используются для проверки составных условий?

5. Какой тип данных используются для выражений и меток в операторе выбора switch?

Тема 3. Управляющие структуры. Структуры повторения While, do – While, For. Управляющие операторы break и continue.

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

Общий вид оператора while:

while ( выражение) оператор;

В качестве выражения используются условные выражения. Оператор может быть простым или составным. В процессе выполнения цикла while, вычисляется значение выражения. Если оно истинно или в общем случае не равно нулю, то оператор выполняется, затем выражение вычисляется снова. Если выражение становится ложным или в общем случае равно нулю, то цикл завершается.

Пример 1:

main()

{ int k1 =1;

while (k1<=20)

{ printf (“ % 10d % 10d ”, k1, k1*k1);

k1++; } }

Пример 2:

main()

{ int k1 =1;

while (k1++<=20)

printf (“ % 10d % 10d\n “, k1, k1*k1);

}

Общий вид оператора for

for (выр 1; выр2; выр3)

оператор;

где выражение 1 – обычно задает начальное значение переменной цикла;

выражение 2 – условие продолжение цикла;

выражение 3 – обычно задает некоторую модификацию (приращение) переменной цикла за каждое выполнение цикла.

Выражение 1 вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если выражение 2 оказывается истинным (или не равным нулю), тело цикла выполняется один раз, затем вычисляется величина выражения 3, и значение выражение 2 определяется вновь. Оператор может быть как простым, так и составным.

Пример:

main ( )

{ int x;

for (x=1; x<=10; x++)

printf (“%8d %8d \n”, x, x*x*x); }

в операторе for в выражении 3 можно использовать операцию уменьшения, например:

for (n=10; n>0; n--)

printf (“%d \n”, n);

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

x=2;

for (n=4; x<=100;)

x=x*n,

В качестве выражения 3 можно использовать вообще любое правильно составленное выражение например:

for (n=5; n<100; n=n+10)

printf (“ %d \n”, n);

for (d=10.0; d<500.0; d=d*1.5)

printf (“%f \n”, d);

Язык Си поддерживает несколько операций присваивания, эти операции присваивания представляют некоторые сокращения при описании выражений. Так любое выражение вида <переменная>=<переменная><операция><выражение>; может быть заменено на:

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

Ниже приводится некоторые примеры таких выражений и способы их сокращения:

а=а+b; сокращается до а+=b;

a=a-b; сокращается до a-=b;

a=a*b; сокращается до a*=b;

a=a/b; сокращается до a/=b;

a=a%b; сокращается до a%=b;

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

В соответствии с рассмотренными дополнительными операциями присваивания выражения 3 двух последних пример можно записать в виде n+=10 и d*=1.5;

Операция ''запятая''. Операция ''запятая'' позволяет организовать составные выражения. При использовании операции ''запятая'' выражения, разделенные занятой, вычисляются слева направо. Операция ''запятая'' часто используется в операторе for, что позволяет увеличить гибкость использования цикла for.

Рассмотрим пример использования составных выражений в операторе for.

main ( )

{ int x; y;

for (x=1, y=9; x<=10; x++, y--)

printf (“% 2d, %2d \n”, x, y); }

Первое и третье выражение в этом цикле for состоит из двух выражений, инициализирующих и модифицирующих переменные x и y.

Общий вид оператора do while:

do

оператор;

while (выражение);

Оператор может быть простым и составным. Тело цикла do while всегда выполняется, по крайней мере, один раз, поскольку проверка осуществляется только после его завершения. Цикл do while выполняется до тех пор, пока проверяемое выражение не станет ложным или равным нулю.

main ( )

{ float a, bc;

char ch;

do

{ printf (“введите два числа:”);

scantf (“%f %f”, &a, &b);

if (b= =0.0)

printf (“\n деление на ноль!”);

else { c=a\b;

printf (“\n результат деления двух чисел: %f”, c); }

printf (“\n Нажмите 'q' для выхода или любую клавишу для продолжения”); }

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27