Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_Разветвляющиеся программы.Циклы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
592.38 Кб
Скачать

1.1.4 Оператор switch

Оператор switch (переключатель) предназначен для разветвления процесса вы­числений на несколько направлений. Структурная схема оператора приведена на рис. 1.7. Формат оператора:

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

{

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

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

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

[default: операторы ]

}

Рис. 1.7- Структурная схема оператора switch

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

Выход из переключателя обычно выполняется с помощью операторов break или return. Оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do. Оператор return выполняет выход из функ­ции, в теле которой он записан.

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

Пример (программа реализует простейший калькулятор на 4 действия):

#include <iostream.h>

int main()

{

int a, b, res;

char op;

cout << "\nВведите 1й операнд : "; cin >> а;

cout << "\nВведите знак операции : ": cin >> op;

cout << "\nВведите 2й операнд : "; cin >> b;

bool f = true;

switch (op)

{

case '+': res = a + b; break;

case '-': res = a - b; break;

case '*': res = a * b; break;

case '/': res = a / b; break;

default : cout <<"\nНеизвестная операция": f = false;

}

if (f) cout << "\nРезультат : " << res;

return 0;

}

ПРИМЕЧАНИЕ: В случае синтаксической ошибки в слове default сообщение об ошибке не выдается, по­скольку компилятор воспримет это слово как допустимую метку оператора.

Другие примеры программ, содержащих проверки условий, приведены в практи­куме [11] на с. 30.

2. Программа выполнения работы

2.1 Разветвляющиеся программы

В линейной программе все операторы выполняются последовательно, один за дру­гим. Для того чтобы в зависимости от исходных данных обеспечить выполнение разных последовательностей операторов, применяются операторы ветвления if и switch. Оператор if обеспечивает передачу управления на одну из двух ветвей вы­числений, а оператор switch - на одну из произвольного числа ветвей. Рассмотрим сначала задачи с применением оператора if.

2.1.1 Задача 1. Вычисление значения функции, заданной графически

Написать программу, которая по введенному значению аргумента вычисляет зна­чение функции, заданной в виде графика (рис. 1).

Рис. 1-Функция для задачи 1

Начинать решение даже простейшей задачи необходимо с четкого описания того, что является ее исходными данными и результатами. В данном случае это очевидно: исходными данными является вещественное значение аргумента х, который опре­делен на всей числовой оси, а результатом — вещественное значение функции у.

Перед написанием программы следует составить алгоритм ее решения — сначала в общем виде, а затем постепенно детализируя каждый шаг. Такой способ, называ­емый «нисходящая разработка», позволяет создавать простые по структуре про­граммы. По мере приобретения опыта вы убедитесь, насколько это важно. Как известно, алгоритм решения задачи можно описать в различном виде, например, в словесном или в виде блок-схемы. А нам удобнее будет для начала записать функ­цию в виде формул:

Ниже приведено описание алгоритма в неформальной словесной форме. Этот спо­соб мы всячески рекомендуем, потому что только после того, как задача четко опи­сана на естественном языке, ее можно успешно записать на языке программирова­ния. Для такой простой задачи, как рассматриваемая, это, быть может, и не имеет смысла, но вы ведь не собираетесь всю жизнь писать только элементарные про­граммы!

  1. Ввести значение аргумента х.

  2. Определить, какому интервалу из области определения функции оно принад­лежит.

  3. Вычислить значение функции у по соответствующей формуле.

  4. Вывести значение у.

Детализировать этот алгоритм уже практически некуда, поэтому сразу же смело напишем первый вариант программы:

#include <iostream.h>

int main()

{

float x, y;

cout <<" Введите значение аргумента" << endl;

cin >> x;

if ( x < -2 ) у = 0;

if ( x >= -2 && x < -1 ) у = -x - 2;

if ( x >= -1 && x < 1 ) у = x;

if ( x >= 1 && x < 2 ) у = -x + 2;

if ( x >= 2 ) у = 0;

cout << " Для x = " << x << " значение функции у = " << у << endl;

return 0;

}

Тестовые примеры для этой программы должны включать по крайней мере по од­ному значению аргумента из каждого интервала, а для проверки граничных усло­вий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в последнем условии «забыть» знак =, а затем ввести значение х, равное 2).

Как видно из программы, с помощью последовательности условных операторов практически «один в один» записана математическая форма описания функции, приведенная выше. Обратите внимание на запись условий, содержащих два срав­нения.

Операции отношения (<, >, = =, ≤ ≥, !=) являются бинарными, то есть имеют два операнда, и формируют результат типа bool, равный true или false1. Поскольку необходимо, чтобы эти условия выполнялись одновременно, они объединены с помощью операции логического И (&&) — не путать с поразрядным И! Приоритет у операции И ниже, чем у операций отношения, поэтому заключать их в скобки не требуется.

Весьма распространенная ошибка начинающих — запись подобных условий в виде кальки с математической формулы, то есть как а<b<с. Синтаксической ошибки в этом выражении нет, поэтому компилятор не выдает каких-либо сообщений. Да­вайте посмотрим, что же происходит при вычислении. Операции отношения од­ного приоритета выполняются слева направо, поэтому сначала будет выпол­нена операция а<b и сформирован результат в виде true или false. Следующая операция будет выглядеть как true<c или false<c. Для ее выполнения значе­ния true и false преобразуются соответственно в единицу и ноль того же типа, что и с, и формируется результат, смысл которого вряд ли соответствует ожиданиям.

При работе приведенной выше программы всегда выполняются один за другим все пять условных операторов, при этом истинным оказывается только одно услов­ное выражение и, соответственно, присваивание значения переменной у выполня­ется один раз. Запишем условные операторы так, чтобы уменьшить количество проверок:

If ( х <= -2 ) y = 0;

else If ( х < -1 ) у = -х - 2;

else if ( х < 1 ) у = х;

else If ( х < 2 ) у = -х + 2;

else у = 0;

Проверка на принадлежность аргумента очередному интервалу выполняется только в том случае, если х не входит в предыдущий интервал. Программа получилась более компактной, более эффективной, но, возможно, менее наглядной. В отличие от предыдущей версии, порядок следования условных операторов имеет здесь важ­ное значение. Рассмотрим еще один вариант:

y = 0;

if ( х > -2 ) у = -х – 2;

If ( х > -1 ) у = х;

if ( х > 1 ) у = -х + 2;

if ( х > 2 ) у = 0;

Запись фрагмента стала еще короче, но появились два недостатка: значение функ­ции вычисляется многократно (от двух до пяти раз в зависимости от интервала, которому принадлежит х), значит, увеличилось время выполнения, а главное — программа потеряла универсальность, то есть таким способом можно вычислить не всякую функцию. Для того чтобы в этом убедиться, попробуйте заменить у=х на, к примеру, фрагмент окружности y=sqrt(l-x*x) и ввести значение х, большее 1 — это приведет к ошибке в программе, связанной с вычислением квадратного корня из отрицательной величины.

Какой же вариант лучше? Для решения данной задачи разница между ними несу­щественна, но наша цель состоит в том, чтобы на простых примерах продемонстри­ровать общие принципы, следование которым позволит вам впоследствии созда­вать надежные и красивые программы.

СОВЕТ: В современной иерархии критериев качества программы на первом месте стоят ее надеж­ность, простота поддержки и модификации, а эффективность и компактность отходят на второй план. Поэтому в общем случае, если нет специальных требований к быстродействию, наиболее наглядный вариант предпочтительнее.

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

В заключение приведем вариант с использованием функций ввода-вывода в стиле С:

#include <stdio.h>

int main(){

float х, у;

printf(“ Введите значение аргумента:\n");

scanf(“%f", &x);

if ( x < -2 ) у = 0;

if ( x >= -2 && x < -1 ) у = -x - 2;

if ( x >= -1 && x < 1 ) у = x;

if ( x >= 1 && x < 2 ) у = -x + 2;

if ( x >= 2 ) y = 0;

printf(“ Для x = %5.2f значение функции у = %5.2f\n", x, у);

return 0;

}

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