Здавалка
Главная | Обратная связь

Операторы организации цикла



Понятие пустого и составного операторов

Составной оператор – это несколько операторов объединенных в блок с помощью фигурных скобок “{}”, или разделенных запятой. Такой блок можно рассматривать как один оператор, например:

#include<stdio.h>

void main ()

{

{ // первый вариант составного оператора

int i=1, j=2, k;

k=i+j; printf(“\n k=i+j = %d”, k);

k*=2; printf(“\n k= %d”, k);

} // второй вариант составного оператора

int i=0, j, k;

k=i+=j, j=4;

}

Пустой оператор – состоит только из знака “;”, например:

#include<stdio.h>

void main ()

{ int i= 2;

i*=3; ; // обычный и пустой операторы

; // пустой оператор

; ; // двойной пустой оператор

} // конец составного оператора и пустой оператор

 

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

В языке С(С++) существует группа операторов позволяющая организовать ветвление в программе. В С(С++) имеются три оператора, которые могут нарушить простой линейный характер выполнения программы. К ним относятся:if (если) else (иначе) (ветвления), switch (переключатель) и goto (безусловного перехода).

Оператор ветвления предназначен для выбора в программе из нескольких возможных вариантов единственного варианта продолжения вычислительного процесса. Выбор выполня­ется исходя из результатов анализа значения некоторого выражения.

Оператор if имеет следующую общую форму записи:

if (проверка условия) {группа операторов 1 }

[else {группа операторов 2 }]

При выполнении оператора if сначала выполняется проверка условия. Если результат - истина (любое отличное от нуля значение), то выполняется группа операторов 1.

Если результат анализа условия - ложь (равен 0 ), то выполняется группа операторов 2. Если слово else отсутствует, то управление передается на следующий после if оператор.

В качестве условия может использоваться арифметическое, логическое выражение, выражение сравнения, целое число, переменная целого типа, вызов функции с соответствующим типом возвращаемого значения.

Ниже приведен пример функции, использующей оператор if . . . else:

void main(void)

#include <stdio.h>

{ short i;

printf("введите число i \n i= ");

scanf("%d",&i);

printf("введенное число ");

if (i>10) printf("больше 10 ");

else printf("меньше 10 ");

}

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

Одним из условий правильности работы программы, использующей конструкции вида if ...; else ...; if ...; else ...; ..., является соблюдение правил:

- каждый оператор else соответствует ближайшему оператору if, если только ближайший if не входит в группу операторов, выполняющихся при условии верхнего (предыдущего if).

- условия проверяются в том порядке, в котором они перечислены в программе;

- если одно из условий истинно, то выполняется оператор соответствующий этому условию, а проверка оставшихся условий не производится;

- если ни одно из проверенных условий не дало истинного результата, то выполняются операторы, относящиеся к последнему else;

- последний else является необязательным, следовательно, он и относящийся к нему оператор может отсутствовать.

. . . . . .

if (i==j){ n++; if (i==j){ n++;

k*=j;} k*=j;

if (n>10 && k<n) if (n>10 && k<n)

printf(”n=%d”,n); printf(”n=%d”,n);

else n%=2; } else n%=2;

Если анализируется более одного логического условия, то они заключаются в () и разделяются логическими операциями || (или) и && (и).

Понятия: истина и ложь. В С(С++) каждое выражение, в том числе и условное, имеет значение. При этом каждое условное значение принимает либо истинное, либо ложное значение.

void main(void)

{ int true,false;

true=(4>2); // истина

false=(3>5); // ложь

printf(”true=%d false=%d”,true,false);

}

Результатом работы функции является:

true = 1 false = 0

Следовательно, значение ”истина” - это 1, а "ложь" - 0. Более того, как следует из приводимого ниже примера, только значение 0 соответствует ложному высказыванию, при остальных значениях выражение в () принимает истинное значение.

#include<stdio.h>

main()

{ if (1) printf("истина1");

else printf("ложь1");

if (0) printf("истина 0");

else printf("ложь 0");

if (-2) printf("истина 2");

else printf("ложь 2");

}

Это свойство может быть использовано для сокращения логических условий. Например, выражения if(k!=0) и if(k) эквивалентны, так как оба принимают значение "ложь" только в случае k=0.

Необходимо различать следующие высказывания:

if(k=3) и if(k==3)

Первое из них имеет всегда истинное значение, так как в результате его выполнения переменная k принимает значение 3, и, следовательно, выражение в скобках не равно 0 (истинно) всегда. Во втором случае выражение истинно только в случае, когда k примет значение 3.

Переключатель switch. Использование оператора if позволяет выбрать один из двух путей. В отличие от него оператор switch используется для выбора одного из многих путей. Общая структура оператора switch имеет следующий вид:

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

{ case константа 1: вариант 1; break;

. . . . .

case константа n: вариант n; break;

[default: вариант n+1; break;]

}

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

#include <stdio.h>

void main(void)

{ int i;

char c;

while((i=getchar())!=EOF) /* EOF --> Ctrl + Z */

{ switch (i)

{ case 97: c='a'; /* из-за отсутствия оператора break выполняется */

/* следующая ветвь и c принимает значение 'b'*/

case 98: c='b'; break;

case 99: c='c'; break;

default: c=NULL; return; /*выход из функции*/

} printf("c= %c\n",c);

}

}

Ниже приведены несколько примеров программ, в которых используется переключатель switch.

Пример простейшего калькулятора:

#include<stdio.h>

void main( )

{ float a, b, res; int prizn= 1;

char opr;

do{ puts("\nВведите выражение (число_1 знак число_2 ):");

scanf("%f%c%f", &a, &opr, &b);

} while( ( b == 0 ) && (( opr ==’/’) || (opr == ‘:’));

switch (opr)

{ case '+': res=a+b; break;

case '-': res=a-b; break;

case '*': res=a*b; break;

case ':': case '/': res=a/b; break;

default: printf("\операция не определена"); prizn= 0; break;

}

if(prizn) printf("\n Результат: %f", res);

}

Операция условия ?:. В С(С++) имеется короткий способ записи оператора if ... else. Он называется "условным выражением" и записывается с помощью операции ?:. Эта операция состоит из двух частей и содержит три операнда. Общий вид условного выражения следующий:

переменная=операнд 1? операнд 2: операнд 3;

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

n=(k>3) ?n++:n+5;

то есть если k>3, то n=n++, иначе n=n+5;

В качестве операндов 2 и 3 могут быть использованы более сложные выражения, например:

i=j>1?(j=4*n,k+=j):(n--,++m*=2);

 

Операторы организации цикла

Цикл предназначен для организации повторения выполнения некоторой инструкции (группы инструкций) некоторое число раз, например сумму чисел некоторого массива. Таким образом, под циклом понимается оператор или группа операторов, повторяющихся некоторое количество раз. Каждый проход по телу цикла называется итерацией.

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

Если в цикле выполняется группа инструкций, то они должны быть выделены в блок (заключены в фигурные скобки). В языке С(С++) существуют три оператора организации циклов: for (для), while (пока) и do ... while (делать пока).

 

Оператор цикла for

Оператор for формально записывается в следующем виде:

for(выражение1; выражение2; выражение3) тело цикла;

Тело цикла составляют одна либо некоторое подмножество инструкций, заключенных в фигурные скобки. В выражениях 1,2,3 фигурирует переменная, называемая управляющей. В операторе for устанавливается нижняя и верхняя граница изменения переменной цикла и величина (шаг) ее изменения. Каждое из выражений в круглых скобках разделены точкой с запятой. Первое выражение служит для инициализации управляющей переменной. Оно выполняется только один раз в начале выполнения цикла. Выражение 2 устанавливает условие, при котором цикл for повторяет свое выполнение. Проверка условия осуществляется перед каждым выполнением цикла. Выражение 3 задает приращение (уменьшение) управляющей переменной. Следует также отметить, что тело цикла может не содержать ни одной инструкции. В этом случае цикл может использоваться, например, для реализации временной задержки:

for (k=1; k<500; k++);

В отличие от аналогичных операторов цикла других языков в С(С++) оператор for имеет некоторые особенности:

- в качестве управляющей переменной может использоваться не только число, но и символьная переменная

char c;

for (c=’A’; c<’H’; c++) {. . .};

- цикл убывающий имеет тот же вид, что и возрастающий, но вместо с++ записывается с--;

- выражение 2 может иметь произвольный вид:

for (k=1; k+j<=56; k*=2) {. . .};

- выражение 3 может быть любым правильно составленным выражением

for (k=1; k>45; k=(j*4)+++3) {. . .};

- выражение 1 может осуществлять инициализацию более чем одной переменной, а в выражениях 2 и 3 могут анализироваться и(или) изменяться более одной переменной

for (i=1, j=2; i>10 && j>=i; i++, j=i+2) {. . .};

- выражение 1 может не выполнять функцию инициализации управляющей переменной. Вместо этого там может стоять оператор специального типа (например, printf)

for (printf(”введите число \n”); k==5;)

scanf("%d",&k);

- любое из трех выражений цикла for может отсутствовать, однако ’;’должна оставаться. Если нет выражений 1 или 3, то управляющая переменная не используется. Если отсутствует выражение 2, то считается, что оно истинно, и цикл не оканчивается. Таким образом,

for (;;) {. . .}

есть бесконечный цикл, выход из которого осуществляется принудительно.

Рассмотрим примеры программ, в которых используется цикл for.

Пример вычисления факториала числа (n!).

#include<stdio.h>

void main()

{ unsigned long a, n, f=1;

printf("Введите n: ");

scanf("%ld", &n);

if(n)

for( a= 2; a <= n; f*= a, a++ ) ;

printf(" %lu! = %lu\n", n,f);

}

Пример программы вычисления суммы четных чисел и количества нечетных чисел вводимых с клавиатуры. Ввод чисел окончить при получении суммы 30 или вводе заданного количества чисел.

#include <stdio.h>

void main()

{ int i, j, k, n, sm;

n=0;

printf(" введите количество чисел =");

scanf("%d",&k);

for(i=0, sm=0; i<j && sm<30; i++) // в выражении2 используется

// операция &&, если вместо && поставить ',' то

// цикл выполняется только при условии j<3 */

{ scanf("%d",&k);

if ( !( k%2 ) ) { sm+=k; continue; } // сумма четных чисел

n++; // число нечетных чисел

}

printf(" сумма=%d, количество=%d \n",sm , n );

}

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.