- •Введение
- •План лекции
- •Лекция 1.2. Работа в среде Visual Studio План лекции
- •Практические задания
- •Контрольные вопросы
- •Лекция 2.1. Структура простой программы План лекции
- •Лекция 2.2. Использование функций План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 3: Переменные и константы Лекция 3.1. Встроенные типы данных. План лекции
- •Лекция 3.2. Константы, перечисления, синонимы типа План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 4: Операции и выражения Лекция 4.1. Математические операторы и выражения План лекции
- •Лекция 4.2. Логические операторы и выражения. План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции
- •Основные библиотечные функции c для работы с символьными массивами (string.H)
- •Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции
- •Inline-функции
- •Практические задания
- •Контрольные вопросы
- •Тема 6: Структуры. Классы и объекты. Лекция 6.1. Структуры в языке с. План лекции
- •Лекция 6.2. Классы с открытыми данными. План лекции
- •Лекция 6.3. Конструкторы и деструктор.Cкрытие данных. План лекции
- •Лекция 6.4. Введение в библиотеки классов План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции
- •Лекция 7.2. Выбор из вариантов. План лекции
- •Практические задания
- •Контрольные вопросы
- •Заключение
- •Литература
- •Содержание
Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции
Использование меток и переходов для организации итераций
Типы циклов в С++
Правила организации циклов
Цикл с предусловием while
Цикл с пост-условием do…while
Сложные условные выражения в циклах
Операторы break и continue
Цикл с параметром for
Бесконечные циклы
Вложенные циклы
Использование меток и переходов для организации итераций
Итерация – многократное повторение одного и того же действия. Основным методом итерации является цикл (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();
}
Типы циклов в С++
В С++ существует три типа циклов :
while - цикл с предусловием ;
do…while - цикл с постусловием;
for - цикл с параметром.
Правила организации циклов
При программировании любого типа циклов необходимо придерживаться следующих правил:
перед циклом необходимо определить начальное значение параметра цикла (переменной, проверяемой в условном выражении);
правильно сформулировать условие повторения цикла;
проконтролировать наличие операторов в теле цикла, которые будут изменять значение параметра цикла.
Нарушение этих правил часто приводит к зацикливанию - бесконечному повторению тела цикла.
Цикл с предусловием 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();
}
Цикл с пост-условием do…while
В цикле do…while сначала выполняется тело цикла, а затем проверяет условие его повторного выполнения. Тело цикла типа 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();
}
Сложные условные выражения в циклах
Условные выражения в циклах могут быть сложными и объединять множество простых условий логическими операторами (&&, ||, ! ).
// Пример 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();
}
Операторы 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();
}
Цикл с параметром 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();
}
Бесконечные циклы
Циклы типа 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();
}
Вложенные циклы
Циклы могут быть вложенными, т.е. в теле одного цикла может находится другой цикл любого типа.
// Пример 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();
}