- •Пространство имен.
- •Представление целых чисел
- •Определение переменных
- •Особенности использования некоторых типов данных: переполнение регистров переменных
- •Базовые конструкции структурного программирования
- •Условный оператор if
- •Ветвление процесса выполнения программ
- •Перегрузка функций
- •Конструкторы и деструкторы
Ветвление процесса выполнения программ
Для решения многих задач требуется многократное повторение одних и тех же действий. На практике это реализуется либо с помощью рекурсии либо с помощью итерации. Итерация – это повторение одних и тех же действий определенное количество раз. Основным методом итерации является цикл. Циклы в С++ могут быть трех видов:
цикл с предусловием – while
цикл с постусловием – do…while
цикл с управляющей переменной – for
Оператор цикла While
С помощью оператора цикла в программе создается цикл, который будет повторять последовательность операторов до тех пор, пока условие, определенное в начале цикла остается истинным.
Синтаксис оператора цикла с предусловием следующий:
while (выражение условия)
{
операторы тела цикла;
}
Выражение условия – это любое выражения языка С++ , а оператор – любой допустимый оператор или блок операторов. Если выражение истинно – возвращает значение 1, выполняется тело цикла (блок операторов), после чего выражение условия проверяется снова. Так будет продолжаться до тех пор, пока выражение не станет ложным (0); тогда цикл while завершится, а выполнение программы продолжится со следующей строки.
Таким образом, в цикле с предусловием сначала выполняется проверка условия, а затем, в зависимости от результата проверки, выполняется или нет тело цикла.
Пример. В приведенном ниже листинге программы на экран выводятся все значения переменной х, начиная с начального (х=0), увеличиваясь на единицу с каждой итерацией, до тех пор, пока х < 5.
#include <iostream>
int main()
{
int x=0; //присвоение начального значения
while(x<5) // проверка, истинно ли еще условие
{
x++; // тело цикла
std::cout<<"x= "<<x<<"\n";
}
std::cout<<" Complete. x: "<<x<<"\n";
return 0;
}
Сначала проверяется условие, и если оно истинно, то выполняется тело цикла. В данном случае условию удовлетворяют все х значения переменной х, меньшие 5. Если условие истинно, то значение переменной х увеличивается на 1 (выполняются операторы тела цикла), а следующая строка выводит это значение на экран. Как только значение счетчика достигает 5 (условие ложно), все тело цикла пропускается и программа переходит к строке 11.
Результат работы программы:
x= 1
x= 2
x= 3
x= 4
x= 5
Complete x: 5
Условие, проверяемое в цикле while может состоять из нескольких выражений, объединенных логическими операторами: &&, | |, ! . Например, приведенная ниже программа демонстрирует реализацию логической задачи. Вводятся два положительных числа – одно меньше, другое больше, их значения размещаются соответственно в переменных small и large. Далее меньшее начинает увеличиваться на единицу, а большее уменьшаться на два, процесс продолжается до тех пор, пока значения чисел не «встретятся». Цель задачи – определить эти числа. Для решения необходимо проверить три условия продолжения цикла:
- меньшее число меньше большего (small < large);
- большее больше нуля (0 < large);
- меньшее число меньше максимально допустимого.
#include <iostream>
using namespace std;
int main() {
unsigned short small; // от 0 до 65 535
unsigned long large; // от 0 до 4 294 967 295
const unsigned short MAX= 65535; //объявление константы МАХ и
//присвоение ей значения3
cout<<"Enter a small number: ";
cin>>small;
cout<<"Enter a large number: ";
cin>>large;
// при каждой итерации проверяются три условия
while (small<large && large > 0 && small < MAX)
{
small++;
large -=2;
}
cout<<"\nSmall: "<<small<<" Large: "<<large<<endl;
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;
}
