Оператор выбора (Оператор switch)

Предназначен для организации выбора из нескольких вариантов в зависимости от значения выражения в скобках. Синтаксис:

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

{

[case константное-выражение1:список-операторов1]

[case константное-выражение2:список-операторов2]

[default:[список-операторов]]

}

Константы в вариантах case должны быть различными, и если проверяемое значение не совпадает ни с одной из констант, выбирается вариант default. Программисту не обязательно предусматривать default, но его наличие иногда сможет устранить неожиданные ошибки, а иногда необходимо и по логике программы.

Для иллюстрации приведём фрагмент программы из предыдущего примера (перевод см в дюймы или наоборот) с использованием оператора switch вместо оператора if:

// альтернативный вариант реализации ветвления для примера 1.3

switch (ch) {

case 'i':

in = x; cm = x*fac; break;

case 'c':

in = x/fac; cm=x; break;

default:

in = cm = 0;

}

Здесь операторы break применяются для выхода из оператора switch, без них будут выполнены все операторы, следующие за выбранным вариантом, т.е. программа будет работать неверно.

Циклы

Они служат для реализации многократно повторяющихся действий. Как и в других языках программирования, в С++ имеется три основных типа операторов цикла:

· Цикл for

· Цикл с предусловием (while)

· Цикл с постусловием (do…while)

В стандарте c++ 11 введён ещё один цикл for по диапазону – его синтаксис использует массив, поэтому пример с эти оператором цикла рассмотрим в следующем разделе, посвящённому массивам.

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

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

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

Здесь и далее тело цикла может представлять собой как одиночный оператор, так и блок (составной оператор).

В качестве примера приведём простую короткую программу, которая вычисляет сумму квадратов натуральных чисел от 1 до 9. На этом примере разберём использование различных операторов цикла.

//Пример 1.4 с оператором for – вычисление суммы квадратов от 1 до 9

#include <iostream>

using namespace std;

int main(){

int i, b=0;

for(i=1; i<10; i++)

b += i * i;

cout << b << endl;

system("pause"); return 0;

}

Оператор while - цикл с предусловием.

while (выражение) тело цикла

Пример 1.4 запишем, используя оператор while:

// фрагмент примера 1.4 с использованием while

int i=1, b=0;

while (i<10) {

b += i * i; i++;

}

cout << b << endl;

Оператор do while – цикл с постусловием.

do тело цикла while (выражение);

Тело цикла выполняется хотя бы один раз. Если выражение ложно, выполнение цикла заканчивается, иначе продолжается.

Тот же пример 1.4, но с использованием цикла do….while:

// фрагмент примера 1.4 с использованием do…while

int i=1,b=0;

do {

b+=i*i; i++;

} while(i<10);

cout << b << endl;

Обратим внимание, что во всех циклах пишется не условие окончания, а условие продолжения цикла.

В теле циклов можно использовать операторы break и continue. Оператор break выходит из тела цикла (прерывает цикл), continue передаёт управление на очередную итерацию.

Пример 1.4 c использованием "бесконечного" цикла for и оператора break:

// фрагмент примера 1.4 с использованием breaK

int i=1,b=0;

for(;;) {b+=i*i; i++; if (i==10) break;}

cout << b << endl;

Массивы, строки

Хороший пример использования в программах ветвлений и циклов – обработка массивов и строк текста.

Основные понятия

Массив – совокупность элементов одинакового типа, объединённых общим именем; для доступа к элементам необходимо указать имя массива и один или несколько индексов, однозначно определяющих порядковый номер элемента в массиве. Количество индексов у элементов массива зависит от размерности массива – элементы одномерного массива (вектора) имеют по одному индексу, элементы двумерного массива (матрицы) – два индекса, можно использовать и массивы большей размерности.

Строка – одномерный массив, элементами которого являются символы.

В языке С++ с массивами и строками можно работать двумя способами:

1. использование стандартных языковых возможностей и встроенных средств компилятора для работы с массивами (встроенные массивы) – этот способ достался языку С++ в наследство от языка С и практически не изменился;

2. использование типов (классов, шаблонов), определённых в стандартной библиотеке С++ специально для обработки массивов и строк. Для работы с массивами различных типов рекомендуется использовать шаблонный класс vector (например, типы vector<int>, vector<double> и т.д.), для работы со строками (символьными массивами) имеется отдельный тип string (или wstring при использовании кодировки Unicode).

Оба способа имеют свои плюсы и минусы.

При использовании стандартной библиотеки программист получает в своё распоряжение множество реализованных в ней типовых алгоритмов обработки массивов и строк. Важно, что в этом случае не требуется решать сложную проблему выделения и освобождения памяти, что особо актуально при работе с массивами, реальные размеры которых на этапе разработки программы предсказать сложно (или даже невозможно – такое бывает не так уж и редко). Понятно, что работа программиста в этом случае существенно упрощается. Обратим внимание, что при этом не только сокращаются сроки разработки программы, но и уменьшается количество ошибок в ней, так как все функции стандартной библиотеки С++ хорошо протестированы и апробированы. Это безусловный плюс.

Но и без минусов не бывает – в силу своей универсальности типы из стандартной библиотеки имеют достаточно сложное внутреннее представление; работа с ними менее эффективна и по расходам памяти, и по быстродействию, чем со встроенными массивами. В ситуациях, когда фактор эффективности имеет первостепенное значение, следует отдать предпочтение встроенным массивам и собственному коду, написанному специально для решения конкретной задачи и учитывающим её особенности. Стоит отметить, что при компиляции проекта в режиме “Release” скорость работы с векторами незначительно уступает скорости работы с встроенными массивами, но в отладочном режиме “Debug”, который установлен по умолчанию, разница может быть существенной.

В данном разделе мы рассмотрим базовые средства языка для работы с массивами и строками (встроенные массивы). В следующем разделе поясним, как можно повысить эффективность обработки массивов и строк, используя указатели, и кратко перечислим возможности библиотеки cstring. Далее коснёмся вопросов использования двух востребованных типов стандартной библиотеки – vector и string.

Встроенные массивы

Описание одномерного массива. Одномерный массив объявляется так:

тип имя_массива [количество элементов];

Например: int mas[10] - массив из 10 целых чисел.

char s[20] - строка на 20 символов

По стандарту количество элементов массива должно быть задано в виде константного выражения. Некоторые компиляторы, например, gnu c++, поддерживают и такой вариант (для массивов, объявленных локально):

int n; cin>>n; int mas[n];

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

Обратим внимание – нумерация элементов массива начинается с нуля! В C++ традиционно под массив выделяется непрерывная область памяти (отсюда и термин массив), в процессе работы программы не выполняется проверка выхода индекса за границы массива – при программировании нужна аккуратность.

При объявлении массива можно его сразу инициализировать:

int a[5]={3,5,7,11,13};

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

int a[]={3,5,7,11,13};

Если список значений короче длины массива, то остальные элементы инициализируются нулями:

int a[10]={3,5,7,11,13}; - последние пять элементов будут нулевыми.

Добавим, что глобальные массивы при отсутствии явной инициализации заполняются нулями, локальные (в том числе объявленные в функции main) нулями не заполняются (содержат случайные значения).

В следующем примере одномерный массив из n элементов (n<=10) заполняется случайными числами в интервале [-100, 100], попутно вычисляется максимальный элемент массива и его позиция в массиве.

// Пример 1.5 - заполняем массив случайными числами,

// находим наибольшее и его позицию (если несколько – позицию первого)

#include <iostream>

#include <ctime> // для инициализации датчика случайных чисел

using namespace std;

int main()

{ int n, i, c[10], c_max=-101, i_max=0;

srand(time(0));// начальная установка датчика случайных чисел

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

do {cout<<"n=?"; cin>>n;} while (n>10||n<1);

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

c[i]=rand()%201-100;// числа приводятся к интервалу [-100,100]

cout<<c[i]<<" ";

if (c[i]>c_max) {c_max=c[i]; i_max=i;}

}

cout<<endl<<"maximum "<<c_max<<" in position "<<i_max+1<<endl;

system("pause");

}

Далее уместно рассмотреть новый вид цикла for, введённый в С++ 11, который получил название for по диапазону. Его использование поясним на простом примере – программа выводит элементы заданного массива, используя непривычный синтаксис.

Пример цикла for, основанного на диапазоне:

// Пример 1.6 – демонстрация цикла for по диапазону

#include <iostream>

using namespace std;

int main() {

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

for (int x : a) {

cout << x << " ";

}

return 0;

}

Многомерные массивы.Объявляются так:

тип имя [размер1][размер2]…[размерN]

Например: int t[4][10]; // двумерный массив из 40 элементов //(матрица, содержащая 4 строки, 10 столбцов)

обратиться к произвольному элементу массива можно так: t[i][j]

Обратим внимание: t[i,j] – неправильная запись, но компилятор при этом ошибку, возможно, не выдаст (вспомним про операцию "запятая").

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

int a[2][3]={{1,2,3}, {4,5,6}};//внутренние фигурные скобки можно опустить

Многомерный массив можно рассматривать как массив, элементы которого, в свою очередь, являются массивами. Для последнего
примера a[0] и a[1] – одномерные массивы (две строки матрицы a).

Наши рекомендации