Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций_2015.doc
Скачиваний:
36
Добавлен:
03.03.2016
Размер:
532.48 Кб
Скачать

9 Управление в си

Управление – определенный порядок выполнения вычислений в программе.

    1. Инструкции и блоки

Если в конце выражения поставить ‘ ; ’, то выражение становится инструкцией.

<инструкция>::=<выражение>;

Пример 9.1:

x=0 j++ /* выражения */

x=0; j++; /* инструкции */

Составная инструкция ( блок ).

<блок>::={ [<декларация>]

<инструкция1>;

………………….

<инструкция n> ;

}

Внутри блока разрешены как операторы декларации так и исполнимые операторы.

    1. Инструкция if – else

Синтаксис

if(<выражение>) либо if (<выражение>)

<инструкция1> <инструкция1>

else <инструкция2>

Семантика

Вычисляется значение выражения, если значение выражения истинно, то выполняется <инструкция1>, если ложно то <инструкция2>

Пример 9.2:

int a,b,c; /* исходные данные */

int x; /* результат */

……..

if(a>b) /* вариант 1 */

if(a>c) x=a;

else x=c;

else if(b>c) x=b;

else x=c;

/* вариант 2 */

………………………..

x=a;

if (b>x) x=b;

if(c>x) x=c;

9.3Переключатель switch

Используется для разветвления алгоритма более чем на 2 направления.

Синтаксис

Switch(<выражение>)

{ case <константное выражение1>:<инструкции 1>

case< константное выражение n>:< инструкции n>

default:<инструкции>

}

Семантика

Каждая ветвь case помечена одной или несколькими целочисленными константами или константными выражениями.

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

Пример 9.3:

/* kd – количество дней месяца */

if (j==1|| j==3|| j==5|| j==7|| j==8|| j==10|| j==12) kd=31;

else if(j==2) kd=28;

else kd=30;

Пример 9.4:

………………………………..

switch (j)

{

case 1: kd=31; break;

case 2: kd=28;break;

case 3: kd=31;break;

…………………………….

case 12: kd=31;break;

default:printf(”Ошибка”);break;}

Пример 9.5:

switch (j)

{

case 1: case 3: case 5: case 7: case 8: case 10: case 12: kd=31; break;

case 4 :case 6: case 9: case 11: kd=30;break;

default: if (j==2) kd=28;

else printf(”Ошибка”);break; }

9.6 Цикл while

Синтаксис:

While (<выражение>)

<инструкция>

Аналог ”пока” языка алгоритмов. Это цикл с неизвестным количеством повторений, с предусловием.

Семантика:

Вычисляется выражение, если оно отлично от 0 (истинно),

то выполняется инструкция и снова переход на проверку выражения.

Как только выражение станет равным 0 цикл while завершается. Если необходимо в теле цикла выполнить больше чем 1 инструкцию, то надо взять в { }

Пример 9.6:

/* е в степени х (с точностью eps ) */

float y,s,,eps,x;

int i,n;

………………………………………… /* Ввод х */

y=1; n=1; i=1; S=x;

while (s/n>eps)

{

y+=s/n;

i++;

n*=i;

s*=x;

}

9.7 Цикл for

Синтаксис

For (<выражение 1>;<выражение 2>;<выражение 3>)

<инструкция>

Это цикл с известным числом повторений.

Семантика

< выражение 1>

while(<выражение 2>)

{< инструкция >;

< выражение 3>;

}

<выражение 1> - инициализация

<выражение 2> - условие завершения цикла

<выражение 3> - изменение

Любое из этих 3 выражений может отсутствовать, но ‘;’ обязательно!!!

Пример 9.7:

/* бесконечный цикл */

for( ; ;)

{……...}

Если опущены <выражение1> и <выражение3> - они не используются.

<выражение1> берется до цикла.

<выражение3> изменяется внутри цикла

Пример 9.8-9.9

#define N 10

float X[N]

int i;

float s;

………………………………..

s=0;

for(i=0;i<N;i++)

s+=X[i];

Либо:

for(s=0,i=0;i<N;i++)

s+=X[i];

Особенности цикла for в языке С:

Переменная цикла и ее предельное значение могут изменятся внутри цикла. По завершению цикла переменная цикла определена. В выражениях 1, 2 и 3 может быть использовано более одного выражения, разделенных оператором ‘,’

‘,’- бинарный, инфиксный, левоассоциативный оператор.

Приммер 9.10 Реверсировать массив.

0 1 2 3 4

1

2

3

4

5

5

4

3

2

1

#define N 10

…………….

float x[N];

int i, j;

float r;

…………….

For( i=0 , j=N-1; i<j ;i++ , j--)

{

r=x[i];

x[i]=x[j];

x[j]=r;

}

9.6 Цикл do while

Синтаксис: do <инструкция> while (<выражение>)

- цикл с неизвестным числом повторений.

Семантика: 1.выполняется <инструкция>

2.вычисляется значение <выражения>

3.если <выражение> истинно(не равно 0), то снова переходим на пункт 1. Если <выражение> равно 0 (ложно) – конец цикла.

    1. Инструкция break и continue

Break используется в циклах while, for, do while и в конструкции zwitch. В циклах использование break приводит к немедленному их завершению (до достижения предельного значения переменной цикла for или до достижения условия завершения цикла в while или do while).

Пример 9.11 Определить, является ли матрица А положительно определенной (все элементы больше 0).

Aij>0 , i принадлежит [1,m], j принадлежит [1,n]

#define N 10

#define M 15

float a[M][N];

int i,j;

int pr=1;

for (i=0; i<=M-1;i++)

for(j=0; j<N; j++)

if (a[i][j]<=0 )

{ pr=0; break; }

if (pr) printf(“A - положительно определенная ”);

else printf(“A – не положительно определенная ”);

! Break завершает немедленно ближайший , охватывающий его цикл.

Continue вызывает переход к следующей итерации цикла : в for изменяет переменную цикла согласно закона , указанного в шапке цикла, в while , do while приводит к вычислению выражения , которое является условием продолжения цикла.

Пример 9.12 . Найти сумму S отрицательных элементов массива x[N]

#define N 5

float x[N] ;

int i;

float s=0;

for(i=0;i<=N-1;i++) или for(i=0;i<N;i++)

if (x[i]<0) s+=x[i]; {if (x[i]>=0 )continue;

s+=x[i];}