Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++(краткая теория к зачету).doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
280.06 Кб
Скачать

Ветвление процесса выполнения программ

Для решения многих задач требуется многократное повторение одних и тех же действий. На практике это реализуется либо с помощью рекурсии либо с помощью итерации. Итерация – это повторение одних и тех же действий определенное количество раз. Основным методом итерации является цикл. Циклы в С++ могут быть трех видов:

  • цикл с предусловием – while

  • цикл с постусловием – do…while

  • цикл с управляющей переменной – for

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

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

Синтаксис оператора цикла с предусловием следующий:

while (выражение условия)

{

операторы тела цикла;

}

Выражение условия – это любое выражения языка С++ , а оператор – любой допустимый оператор или блок операторов. Если выражение истинно – возвращает значение 1, выполняется тело цикла (блок операторов), после чего выражение условия проверяется снова. Так будет продолжаться до тех пор, пока выражение не станет ложным (0); тогда цикл while завершится, а выполнение программы продолжится со следующей строки.

Таким образом, в цикле с предусловием сначала выполняется проверка условия, а затем, в зависимости от результата проверки, выполняется или нет тело цикла.

Пример. В приведенном ниже листинге программы на экран выводятся все значения переменной х, начиная с начального (х=0), увеличиваясь на единицу с каждой итерацией, до тех пор, пока х < 5.

  1. #include <iostream>

  2. int main()

  3. {

  4. int x=0; //присвоение начального значения

  5. while(x<5) // проверка, истинно ли еще условие

  6. {

  7. x++; // тело цикла

  8. std::cout<<"x= "<<x<<"\n";

  9. }

  10. std::cout<<" Complete. x: "<<x<<"\n";

  11. return 0;

  12. }

Сначала проверяется условие, и если оно истинно, то выполняется тело цикла. В данном случае условию удовлетворяют все х значения переменной х, меньшие 5. Если условие истинно, то значение переменной х увеличивается на 1 (выполняются операторы тела цикла), а следующая строка выводит это значение на экран. Как только значение счетчика достигает 5 (условие ложно), все тело цикла пропускается и программа переходит к строке 11.

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

x= 1

x= 2

x= 3

x= 4

x= 5

Complete x: 5

Условие, проверяемое в цикле while может состоять из нескольких выражений, объединенных логическими операторами: &&, | |, ! . Например, приведенная ниже программа демонстрирует реализацию логической задачи. Вводятся два положительных числа – одно меньше, другое больше, их значения размещаются соответственно в переменных small и large. Далее меньшее начинает увеличиваться на единицу, а большее уменьшаться на два, процесс продолжается до тех пор, пока значения чисел не «встретятся». Цель задачи – определить эти числа. Для решения необходимо проверить три условия продолжения цикла:

- меньшее число меньше большего (small < large);

- большее больше нуля (0 < large);

- меньшее число меньше максимально допустимого.

  1. #include <iostream>

  2. using namespace std;

  3. int main() {

  4. unsigned short small; // от 0 до 65 535

  5. unsigned long large; // от 0 до 4 294 967 295

  6. const unsigned short MAX= 65535; //объявление константы МАХ и

  7. //присвоение ей значения3

  8. cout<<"Enter a small number: ";

  9. cin>>small;

  10. cout<<"Enter a large number: ";

  11. cin>>large;

  12. // при каждой итерации проверяются три условия

  13. while (small<large && large > 0 && small < MAX)

  14. {

  15. small++;

  16. large -=2;

  17. }

  18. cout<<"\nSmall: "<<small<<" Large: "<<large<<endl;

  19. return 0; }

Результат

Enter a small number: 2

Enter a large number: 100000

Small: 33335 Large: 33334

Оператор цикла do…while

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

// Пример игнорирования цикла при заведомо ложном условии

#include <iostream>

#include <windows.h>

using namespace std;

int main()

{

char str[20];

int x;

CharToOem("Сколько приветов? : ", str);

cout<<str;

cin>>x;

while (x>0)

{

CharToOem("Привет!\n", str);

cout<<str;

x--;

}

return 0;

}

Результаты:

Сколько приветов? : 2

Привет!

Привет!

Сколько приветов? : 0

Press any key to continue

Анализ. Пользователю предлагается ввести начальное значение счетчика х. Далее это значение проверяется (оно должно быть больше нуля), а затем в теле цикла уменьшается на единицу. При первом запуске программы начальное значение счетчика равнялось двум, поэтому тело цикла выполнялось дважды. Во втором случае было введено число 0, выражение в строке проверки условия возвращает false, поскольку х не больше 0. Условие цикла не выполняется, поэтому все его тело пропускается и на экран ничего не выводится.

Для того, чтобы сообщение в приведенном выше примере выводилось по крайней мере один раз при х=0 можно воспользоваться циклом do…while, в котором сначала выполняет тело цикла, а условие продолжения проверяет потом. Это гарантирует выполнение операторов тела цикла по крайней мере один раз.

Синтаксис оператора do…while:

do

{

операторы тела цикла;

}

while (выражение условия);

Сначала выполняется оператор, а затем проверяется результат выражения. Если результат истинен, то цикл повторяется, в противном случае он завершается. Например

    int a = 77;

    do

{   

cout << a << "\n";   

a += 4;

}

while( a < 23 )

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

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

Цикл с управляющей переменной задается при помощи ключевого слова for. В таком цикле, будет выполнятся его тело или нет, определяется путем проверки заданной управляющей переменной.

Синтаксис оператора for следующий:

for (инициализация; проверка; приращение)

//операторы тела цикла;

Оператор инициализация (описание управляющей переменной) устанавливает начальное состояние счетчика, оператор проверка – это любое выражение языка С++, результат которого проверяется на каждом цикле и суть которого состоит в проверке заданной управляющей переменной. Если результат этого выражения «истина», то выполняется тело цикла, а затем после изменения счетчика на величину приращение – действие с управляющей переменной повторяются.

Пример.

for( int i=5; i < 21; i++ )

{ cout << i << "\n"; }

Первое выражение int i=5; цикла является инициализацией счетчика цикла (установка его начального значения). Счетчик, как правило, представляет собой целочисленную переменную, но может быть любым допустимым выражением, способным установить начальное значение счетчика.

Второй параметр цикла i < 21; (проверка) представляет собой условие продолжения цикла, которое так же может быть любым выражением. Важно помнить, что для установки этого параметра должно использоваться выражение, возвращающее логическое значение.

Третий параметр i++ устанавливает значение приращения счетчика цикла (по умолчанию увеличение на единицу). Здесь так же может использоваться любое корректное выражение или оператор С++.

В данном примере как управляющая задана переменная i, с начальным значением 5. В качестве условия прекращения цикла задано достижение управляющей переменной значения 21. В качестве действия над управляющей переменной задано увеличение ее на единицу при каждом выполнении тела цикла (оператор i++). В результате работы примера на экран будут выведены числа от 5 до 20 включительно. Цикл for, также как и цикл while, проверяет условие перед выполнением своего тела, т.е. если задать i =34, то тело цикла будет пропущено.

Пустые операторы цикла for. В приведенном примере представлена каноническая форма записи цикла for. На самом деле вариантов записи его очень много. Любой оператор цикла может отсутствовать. Чтобы отметить позицию пропущенного оператора, используется точка с запятой «;».

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

// Пример_1

int i=5;

for( ; i < 21; i++ )

{ cout << i << "\n"; }

Можно также убрать в другое место действие с управляющей переменной:

// Пример_2

int i;

for(i=5 ; i < 21; )

{

i++ ;

cout << i << "\n";

}

А можно и так:

// Пример_3

int i=5;

for(; i < 21; )

{

i++ ;

cout << i << "\n";

}

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

Рассмотренные примеры показывают, что возможности языка С++ позволяют решить задачу множеством способов. Листинг примера 4 приведен для иллюстрации гибкости возможностей языка С++, поскольку ни один опытный программист не будет использовать цикл for подобным образом. Тем не менее, можно опустить даже все три параметра цикла, а для управления циклом использовать операторы перехода, они выполняют безусловную передачу управления.

Оператор прерывания цикла break. Когда оператор выполняется в структурах while, for, do…while происходит немедленный выход из структуры и программа продолжает выполнение первого оператора, стоящего после нее. Типичное назначение оператора break – досрочно прервать цикл.

Пример формата использования оператора break в цикле while:

while (условие1)

{

if ( условие2)

break;

//операторы

}

Оператор break целесообразно использовать, когда условие продолжения итераций надо проверять в середине цикла, например:

// применение оператора break в структуре for

int main() {

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

{ if ( x==7) break; // цикл прервется при х = 7

сout << x << " "; }

cout << endl <<" Цикл прерван при х = " << x << endl;

return 0; }

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

1 2 3 4 5 6 7

Цикл прерван при х = 7

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

В структурах while и do…while немедленно после выполнения оператора сontinue производится проверка условия продолжения цикла. В структуре for выполняется выражение приращения, а затем осуществляется проверка условия продолжения, например:

// применение оператора сontinue в структуре for

int main() {

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

{ if ( x==7) ; сontinue // оставшаяся часть цикла пропускается при

// х = 7

сout << x << " "; }

cout << endl <<" Пропущен х = 7 " << x << endl;

return 0; }

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

1 2 3 4 5 6 8 9 10

Пропущен х = 7

Структура множественного выбора switch

Операторы if и if…else относятся к структурам с единственным выбором. Но в некоторых сложных ситуациях, алгоритм может содержать ряд альтернативных решений, причем некоторую переменную (или выражение) требуется проверять отдельно для каждого постоянного целого значения, которое она может принимать – в зависимости от результата этой проверки должны выполняться те или иные действия. Все это может привести к возникновению очень сложных конструкций с большим числом вложенных операторов.

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

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

{

case первое_значение: оператор;

case второе_значение: оператор;

case N_значение: оператор;

default: оператор;

}

Здесь выражение – любое допустимое выражение языка С++, оператор – любой допустимый оператор или блок операторов, который возвращает целочисленное значение, поэтому использование логических операций или выражений сравнения здесь недопустимо.

Переход осуществляется к той строке оператора switch, где после ключевого слова case находится значение, соответствующее результату выражения. С этой строки выполнение всех операторов продолжится до тех пор, пока не закончится тело оператора switch или не встретится оператор break.

Если ни одно из значений операторов case не совпадает с возвращенным значений, то выполняются строки программы, стоящие после оператора default4, а в случае его отсутствия, оператор завершается.

Пример.

#include <iostream>

using namespace std;

int main()

{

unsigned short int myNumber;

cout<< "Enter number between 1 and 5: ";

cin>> myNumber;

switch (myNumber)

{

case 0: cout<<"Out-of-range!\n";

break;

case 5: cout<<"Excellent!\n";

case 4: cout<<"Good!\n";

case 3: cout<<"Satisfactory!\n";

case 2: cout<<"Bad!\n";

case 1: cout<<"Very bad!\n";

break;

default: cout<<"Out-of-range!\n";

break;

}

cout<<"\n\n";

return 0;

}