Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
new_Лекции_1-7.docx
Скачиваний:
117
Добавлен:
05.03.2016
Размер:
1.49 Mб
Скачать

Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции

  1. Использование меток и переходов для организации итераций

  2. Типы циклов в С++

  3. Правила организации циклов

  4. Цикл с предусловием while

  5. Цикл с пост-условием do…while

  6. Сложные условные выражения в циклах

  7. Операторы break и continue

  8. Цикл с параметром for

  9. Бесконечные циклы

  10. Вложенные циклы

  1. Использование меток и переходов для организации итераций

Итерация – многократное повторение одного и того же действия. Основным методом итерации является цикл (loop-петля). Первоначально циклы программировали с помощью метки , оператора if и оператора перехода. В С++ метка представляет собой имя , за которым идет двоеточие (:). Метка помещается слева от обычного оператора. Переход обеспечивается написанием оператора goto, за которым следует имя метки. Оператор goto приобрел плохую репутацию, т.к. его употребление приводит к запутанным, нечитабельным программам («спагетти-код»). Для того, чтобы обойтись без goto были придуманы циклы.

// Пример 7.1.1

// Цикл с ключевым словом goto

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0; // инициализация значения переменной цикла

loop: // метка начала цикла

cout << "Сounter: " << counter << " Нажмите <Enter>\n";

cin.get();

counter++; // изменение значения переменной цикла

if (counter < 5) // проверка условия повторения цикла

goto loop; // переход в начало цикла

cout << "Цикл завершен. Сounter: " << counter << "\n";

cin.get();

}

  1. Типы циклов в С++

В С++ существует три типа циклов :

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

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

  • for - цикл с параметром.

  1. Правила организации циклов

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

  • перед циклом необходимо определить начальное значение параметра цикла (переменной, проверяемой в условном выражении);

  • правильно сформулировать условие повторения цикла;

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

Нарушение этих правил часто приводит к зацикливанию - бесконечному повторению тела цикла.

  1. Цикл с предусловием while

В цикле while сначала проверяется условие, и если оно истинно, то выполняются операторы (тело) цикла. Тело цикла типа while может не выполниться ни разу.

// Пример 7.1.2

// Цикл while

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0; // определение значения переменной цикла

while (counter < 5) { // проверка значения переменной цикла

cout << "Counter: " << counter << " Нажмите <Enter>\n";

counter++; // изменение значения переменной цикла

cin.get();

}

cout << "Цикл завершен. Counter: " << counter << "\n";

cin.get();

}

// Пример 7.1.3

// Пропуск тела цикла while

#include <iostream.>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter; // определение значения переменной цикла

cout << "Сколько раз печатать?: ";

cin >> counter; // вводим 0 и тело цикла не выполняется

while (counter > 0) { // проверка значения переменной цикла

cout << "Hello\n";

counter--; // изменение значения переменной цикла

}

cout << " Цикл завершен. Counter: " << counter << endl;

cin.get();cin.get();

}

  1. Цикл с пост-условием do…while

В цикле dowhile сначала выполняется тело цикла, а затем проверяет условие его повторного выполнения. Тело цикла типа do…while обязательно выполнится хотя бы один раз.

// Пример 7.1.4

// Цикл do...while

#include <iostream.>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter; // определение значения переменной цикла

cout << "Сколько раз печатать?: ";

cin >> counter; // вводим 0

do { // тело цикла выполняется хотя бы один раз

cout << "Hello\n";

counter--; // изменение значения переменной цикла

} while (counter > 0) // проверка значения переменной цикла

cout << " Цикл завершен. Counter: " << counter << endl;

cin.get();

}

  1. Сложные условные выражения в циклах

Условные выражения в циклах могут быть сложными и объединять множество простых условий логическими операторами (&&, ||, ! ).

// Пример 7.1.5

// Сложный цикл while

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

unsigned short small;

unsigned long large;

const unsigned short MAXSMALL=65535;

cout << "Введите небольшое число: ";

cin >> small;

cout << "Введите число побольше: ";

cin >> large;

cout << "\nМалое: " << small << "Большое: " << large << endl;

// цикл со сложным условием

while (small<large && large > 0 && small < MAXSMALL) {

if (small % 3 == 0) cout << ".";

small++;

large-=2;

cout << "\nМалое: " << small << "Большое: " << large << endl;

cin.get();

}

cout << "\nМалое: " << small << "Большое: " << large << endl;

cin.get();

}

  1. Операторы break и continue

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

// Пример 7.1.6

// Использование continue и break

#include <iostream>

using namespace std;

void main(){

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

unsigned short small;

unsigned long large, skip, target;

const unsigned short MAXSMALL=65535;

cout << "Введите небольшое число: ";

cin >> small;

cout << "Введите число побольше: ";

cin >> large;

cout << "Введите число для пропуска: ";

cin >> skip;

cout << "Введите число для результата: ";

cin >> target;

cout << "\n";

while (small<large && large > 0 && small < MAXSMALL) {

small++;

if (small % skip == 0) {

cout << "Цикл пропущен для малого числа " << small << endl;

continue; // переход к следующей итерации , т.е. к while

}

if (large==target) {

cout << " Цикл завершен. Результат получен! ";

break; // переход к оператору после цикла, т.е. завершение цикла

}

large-=2;

}

cout << "\nМалое: " << small << "Большое: " << large << endl;

cin.get();

}

  1. Цикл с параметром for

Цикл for - другая, удобная форма записи цикла с предусловием. Цикл типа for объединяет все три этапа построения цикла : инициализацию параметра цикла, проверку условия повторения цикла и изменение параметра цикла.

// Пример 7.1.7

// Правила программирования циклов

#include <iostream>

using namespace std;

void main(){

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0; // определение начального значения счетчика

while (counter < 5) { //проверка условия

counter++; // изменение счетчика

cout << "В цикле! ";

}

cout << "\nCounter: " << counter << endl;

cin.get();

}

// Пример 7.1.8

// Цикл for

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter;

// определение начального значения,проверка условия, изменение счетчика

for (counter=0; counter <5; counter++) {

cout << " В цикле! ";

}

cout << "\nCounter: " << counter << endl;

cin.get();

}

Причем возможны инициализация и изменение значений нескольких параметров.

// Пример 7.1.9

// Цикл for с несколькими операторами

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int i, j, k;

for (i=0, j=0 ,k=0; i<3 && j<2; i++, j++, k--)

cout << "i: " << i << "\tj: " << j << "\tk:" << k << endl;

cin.get();

}

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

// Пример 7.1.10

// Пропуск составляющих цикла for

#include <iostream.>

using namespace std;

void main()

{

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0;

for ( ; counter < 5 ; ) {

counter++;

cout << " В цикле! ";

cin.get();

}

cout << "\nCounter: " << counter << endl;

cin.get();cin.get();

}

Тела у цикла for может не быть. Параметр в цикле for можно объявить непосредственно внутри цикла. В этом случае нужно вспомнить, что областью видимости в С++ является блок и после завершения цикла этот параметр может стать недоступным.

// Пример 7.1.11

// Пустые циклы for

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

//int i;

for (int i=0; i<5; cout << "i: " << ++i << endl);

// Возможна ошибка

//cout << "i=" << i << endl;

cin.get();

}

  1. Бесконечные циклы

Циклы типа while(1) , do…while(1) или for(;;) часто применяются на практике для выполнения повторяющихся действий. Это примеры бесконечных циклов. Для завершения их работы в теле подобного цикла обязательно должен быть оператор break.

// Пример 7.1.12

// Бесконечные циклы

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0;

while (true) { //while (1)

counter++;

cout << "\nCounter: " << counter << endl;

if (counter > 10)

break; // завершить цикл

}

cout << "\nCounter: " << counter << endl;

cin.get();

}

// Пример 7.1.13

// Цикл for с пустыми операторами(бесконечный цикл)

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int counter=0, max=0;

cout << " Сколько раз печатать?:";

cin >> max;

for ( ; ;) {

if (counter < max) {

cout << "Hello\n";

counter++;

}

else break;

}

cin.get();cin.get();

}

  1. Вложенные циклы

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

// Пример 7.1.14

// Вложенные циклы

#include <iostream>

using namespace std;

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int rows,columns;

char theChar;

cout << "Сколько строк?: ";

cin >> rows;

cout << " Сколько столбцов?:";

cin >> columns;

cout << "Символ?:";

cin >> theChar;

for (int i=0; i < rows; i++) {

for (int j=0; j < columns; j++)

cout << theChar;

//int j=0;

//while(j<columns) {

// cout << theChar; j++;

//}

cout << "\n";

}

cin.get();cin.get();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]