Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

Мы рассмотрели структуру с единственным выбором if (). Но порой алгоритм может содержать ряд альтернативных решений, причем некоторую переменную (или выражение) надо проверять отдельно для каждого постоянного целого значения, которое она может принимать, и в зависимости от результатов этой проверки должны выполняться различные действия. Для принятия подобных решений в C++ имеется структура множественного выбора switch ().

Структура switch () состоит из ряда меток case и необязательной метки default (умолчание). Программа, приведенная ниже, использует switch () для перевода различных буквенных оценок, полученных студентами на экзамене, в цифровые.

/* программа, выполняющая перевод буквенных оценок в цифровые */

#include <iostream.h>

void main() {

char cRate;

cout<<"Input your char-rate\n";

cin>>cRate;

switch (cRate) {

case 'A':

cout<<"Your rate is 5\n";

break;

case 'B':

cout<<"Your rate is 4\n";

break;

case 'C':

cout<<"Your rate is 3\n";

break;

case 'D':

cout<<"Your rate is 2\n";

break;

default:

cout<<"This rate isn't correct\n";

}

}

Пользователь вводит оценку с клавиатуры. Когда он нажимает «Ввод» символ читается функцией cin>>. Далее начинает работать структура switch (). За ключевым словом switch следует в скобках имя переменной cRate. Это так называемое управляющее выражение. Предположим, пользователь ввел в качестве оценки букву «С». «С» автоматически сравнивается с каждым условием case в структуре switch. Если встречается совпадение (case 'С':), то выполняется оператор, следующий за этой меткой case. В случае буквы «С» на экран выводится сообщение «Your rate is 3» и работа структуры switch немедленно завершается по оператору break. Оператор break вызывает передачу программного управления на первый оператор после структуры switch. Оператор break используется потому, что в противном случае условия case в операторе switch работают совместно. Если везде в структуре switch не использовать break, тогда каждый раз, когда одно из условий case удовлетворяется, будут выполняться операторы всех последующих меток case. Если ни одно условие не выполнено, то выполняются операторы после метки default (умолчание), печатающие в нашей программе сообщение об ошибке.

После каждой метки case может быть предусмотрено одно или более действий. В общем случае структура множественного выбора switch() при использовании break в каждом разделе case соответствует блок-схеме, приведенной ниже

Из этой блок-схемы видно, что каждый оператор break в конце case вызывает немедленный выход из структуры switch.

Типичная ошибка программирования

Забывают вставить оператор break, когда он нужен в структуре switch().

case и целым значением, которое проверяется в структуре switch(), может вызвать логическую ошибку. Например, запись case3: вместо case 3: просто создаст неиспользуемую метку (мы поговорим об этом подробнее в одном из следующих уроков). Дело в том, что в этой структуре switch() не будут совершены соответствующие действия, когда управляющее выражение switch() будет иметь значение 3.

Хороший стиль программирования

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

case и default могут размещаться в структуре switch() в произвольном порядке, стоит учесть практику качественного программирования - помещать default в конце.

Если в структуре switch() предложение default помещено последним в списке, то оператор break в нем не требуется. Но некоторые программисты включают break и тут для четкости и для симметрии с другими случаями.

Отметим, что последовательное перечисление несколько меток (например, case 'D' : case 'd' :) позволяет выполнять один и тот же набор действий для разных значений проверяемого выражения

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

Пример

Рассмотрим комплексный пример на использование инструкций switch и enum. Тщательно проанализируйте программу

//Программа переводит указанную пользователем сумму в USD, DM,

// российские рубли

#include <iostream.h >

void main()

{

// объявление перечислимого типа

enum Valuta { USD = 1, DM, RUS};

// переменная Val_Count для хранения суммы в гривнах

float Val_Count = 0;

// объявление переменной перечислимого типа Valuta

Valuta Val_Case;

// переменная для определения выбора пункта меню

int Menu_Case;

// приглашение ввести данные

cout << "Введите сумму, которую Вы хотите поменять: ";

cin >> Val_Count;

// вывод меню

cout << "\n Обмен возмжен на "

<< "\n 1. USD"

<< "\n 2. DM"

<< "\n 3. Российские рубли"

<< "\n \n Выберите тип валюты, который Вас интересует"

<< "\n Укажите 1, 2 или 3\n";

cin >> Menu_Case;

// преобразование Menu_Case к типу Valuta и

//инициализация переменной Val_Case

Val_Case = Valuta(Menu_Case);

// в зависимости от выбора пользователя выполняются

//соответсвующие действия

switch (Val_Case)

{

case USD: // если был выбран 1-й пункт меню

cout << Val_Count << "грн. = "

<< 5.40 * Val_Count << "USD \n";

break;

case DM: // если был выбран 2-й пункт меню

cout << Val_Count << "грн. = " << 2.37 * Val_Count << "DM \n";

break;

case RUS: // если был выбран 3-й пункт меню

cout << Val_Count << "грн. = " << 0.23 * Val_Count

<< "рос. руб. \n";

break;

default: cout << "Выбор валюты от 1 до 3"; // др. случаи

}

}

Домашнее задание

Задача 1

Измените программу примера c if () таким образом, чтобы в случае ввода ошибочных данных (R1<0, R2<0 либо R1>R2) она выводила на экран соответствующее предупреждение и не проводила никаких вычислений.

Задача 2

Измените программу примера с оператором switch () таким образом, чтобы она обрабатывала не только прописные, но и строчные буквы. То есть цифровая оценка 5 соответствует буквенным оценкам «А» и «а».

Задача 3

Напишите программу, проверяющую число на четность.

Задача 4

Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела.

Цикл while

В 60-х годах исследование Бома и Джакопини показало, что все программы могут быть написаны с использованием всего трех управляющих структур, названных структура следования, структура выбора и структура повторения.

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

структура с единственным выбором if (ЕСЛИ) выполняет некоторое действие, если проверяемое условие истинно, или пропускает его, если ложно; структура с двойным выбором if/else (ЕСЛИ-ИНАЧЕ), выполняет одно действие, если условие истинно и другое действие, если оно ложно; структура с множественным выбором switch (ВЫБОР), выполняет одно из множества действий в зависимости от значения проверяемого выражения.

Сегодня, мы познакомимся со структурами повторения. С++ обеспечивает три типа структур повторения (циклов), называемых while (ПОКА), do-while (ЦИКЛ-ПОКА) и for (ЦИКЛ).

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

Структура повторения позволяет программисту определить действие, которое должно повторяться, пока некоторое условие остается истинным. Например, предложение

ПОКА имеются незачеркнутые элементы в моем списке покупок

Сделать следующую покупку и вычеркнуть ее из списка

описывает повторные действия при посещении магазина. Условие "имеются незачеркнутые элементы в моем списке покупок" может быть истинным или ложным. Если оно истинно, то осуществляется действие "Сделать следующую покупку и вычеркнуть ее из списка". Это действие будет повторяться до тех пор, пока условие остается истинным. Оператор (или операторы), записанные в цикле while (ПОКА) составляют тело while, которое может быть отдельным или составным оператором. Очевидно, что когда-нибудь условие станет ложным (когда будет осуществлена и вычеркнута из списка последняя покупка). Начиная с этого момента повторение прерывается и выполняется первое действие, следующее за структурой повторения.

Обобщенная форма цикла while:

while ( выражение ) оператор;

Вначале вычисляется выражение. Если результат отличен от нуля (true), тогда выполняется оператор и управление переходит обратно к началу цикла while. Это приводит к выполнению тела цикла while, а именно оператора, который будет выполняться до тех пор, пока выражение не станет равным нулю (false). Затем управление передается следующему оператору. Таким образом, цикл может выполняться ноль или более раз. Например:

/* Пример выводит на экрон 5 строк типа "Строка" + "индекс" +

"выводится в цикле", где "индекс" меняется от 0 до 4 */

#include < iostream.h >

void main()

{

int i = 0; /*Объявление и инициализация переменной i*/

cout << "\n Начало цикла";

while (i != 5) /*Проверяется выражение (i != 5),

если результат - истина, выполняется операторы тела цикла,

в противном случае управление передается оператору, следующему за циклом. */

{

cout << "Строка " << i << "выводится в цикле \n";

i++;

}

cout << "\n Оператор, следующий за циклом";

}

Чтобы материал стал более понятным рассмотрим еще такой пример:

/*Программа выводит на экран данные таблицы умножения на 2*/

#include < iostream.h >

void main()

{

int i = 0;

cout << "Таблица умножения на 2 \n";

while ( i ++ < 10)

cout << i << " * 2 = " << i * 2 << '\n';

cout << "\n Все";

}

Давайте остановимся на операторе while в данном примере и по шагам посмотрим, как он работает.

while ( i ++ < 10)

cout << i << " * 2 = " << i * 2 << '\n';

Цикл состоит из двух частей: условие цикла и тело цикла. Обратите внимание на условие цикла - это выражение i++ < 10 . Условие гласит, что тело цикла будет выполняться пока выполняется условие i < 10 . ПОСЛЕ проверки этого условия значение переменной i увеличивается на 1 (об этом говорит оператор i++). Тело цикла состоит всего из одного оператора, а именно:

cout << i << " * 2 = " << i * 2 << '\n';

Итак, 1-й шаг цикла

1.1 Значение переменной i равно 0 (так она была проинициализирована).

1.2 Проверка условия i < 10 дает истина (т.к. 0 < 10)

1.3 Значение переменной i увеличивается на 1, теперь i = 1.

1.4 Так как проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 1 * 2 = 2

1.5 Далее управление передается циклу while

2-й шаг цикла

2.1 Значение переменной i равно 1.

2.2 Результат проверки условия цикла - истина (1 < 10)

2.3 Значение переменной i увеличивается на 1, теперь i = 2.

2.4 Так как проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 2 * 2 = 4

2.5 Далее управление передается циклу while

. . .

9-й шаг цикла

9.1 Значение переменной i равно 8.

9.2 Результат проверки условия цикла - истина (8 < 10)

9.3 Значение переменной i увеличивается на 1, теперь i = 9.

9.4 Так проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 9 * 2 = 18

9.5 Далее управление передается циклу while

10-й шаг цикла

10.1 Значение переменной i равно 9.

10.2 Результат проверки условия цикла - истина ( 9 < 10)

10.3 Значение переменной i увеличивается на 1, теперь i = 10.

10.4 Так проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 10 * 2 = 20

10.5 Далее управление передается циклу while

11-й шаг цикла

11.1 Значение переменной i равно 10.

11.2 Результат проверки условия цикла - ложь ( 10 равно 10, а не меньше!)

11.3 Значение переменной i увеличивается на 1, теперь i = 11.

11.4 Так проверка условия цикла дала значение ложь, управление

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

и управление переходит к оператору, следующему за while,

т.е. к cout << "\n Все";

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