В общее меню Введение Основные инструкции Структурированные типы данных Подпрограммы Рекурсия Классы Динамические структуры данных Сортировка |
На практике решение большинства задач не удается описать с помощью программ линейной структуры. При этом после проверки некоторого условия выполняется та или иная последовательность операторов, однако происходит нарушение естественного порядка выполнения операторов. Для этих целей используют управляющие операторы. Условный оператор используется для реализации разветвлений в программе, которые происходят при выполнении некоторого условия и имеет следующую структуру if ( выражение ) серия1; else серия2; Если выражение, выступающее в качестве условия, принимает значение 0, то выполняются операторы, расположенные после else (серия2), если отлично от нуля, — операторы, после if. При записи логического выражения следует избегать знака = = (равно) для действительных переменных (double), так как они представляются неточно, а поэтому может не произойти совпадений значений выражений, стоящих слева и справа от знака равно. Для устранения указанного недостатка следует требовать выполнения условия с заданной точностью, т.е. вместо отношения X = = Y рекомендуется, например, fabs(X - Y) < 1E-8. Поскольку развилка может быть неполной, то возможна и неполная форма записи условного оператора: if ( логическое выражение ) серия; Условный оператор реализует разветвление вычислительного процесса по двум направлениям, одно из которых осуществляется при выполнении условия, другое — в противном случае. Для реализации разветвлений более чем по двум направлениям необходимо использовать несколько условных операторов. Рассмотрим примеры. Задача 1. Даны действительные числа x, y. Если x и y отрицательны, то каждое значение заменить модулем; если отрицательно только одно из них, то оба значения увеличить на 0,5; если оба значения неотрицательны и ни одно из них не принадлежит отрезку [0,5; 2,0], то оба значения уменьшить в 10 раз; в остальных случаях x и y оставить без изменения. Разработаем алгоритм решения задачи, после чего напишем программу. Алгоритм запишем словесно:
Кроме условного оператора в качестве управляющей структуры довольно часто используется переключатель switch. Эта структура позволяет переходить на одну из ветвей в зависимости от значения заданного выражения (селектора выбора). Ее особенность состоит в том, что выбор решения здесь осуществляется не в зависимости от истинности или ложности условия, а является вычислимым. Переключатель позволяет заменить несколько операторов развилки (в силу этого его ещё называют оператором множественного ветвления). В конструкции switch вычисляется выражение K и выбирается ветвь, значение метки которой совпадает со значением K. После выполнения выбранной ветви происходит выход из конструкции switch по метке break. Если в последовательности нет метки со значением, равным K, то управление передается по метке default, если он присутствует, если же его нет, то следующему за переключателем оператору. Запись переключателя: switch (K) { case константа1: опрераторы1; break; case константа2: опрераторы2; break; ... default: опрераторы_default } Любая из указанных серий операторов может состоять как из единственного оператора, так и нескольких (в этом случае, как обычно, операторы, относящиеся к одной метке, должны быть заключены в операторные скобки {...}). Задача 1. В старояпонском календаре был принят двенадцатилетний цикл. Годы внутри цикла носили названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и свиньи. Написать программу, которая позволяет ввести номер года и печатает его название по старояпонскому календарю. Справка: 1996 г. — год крысы — начало очередного цикла. Поскольку цикл является двенадцатилетним, поставим название года в соответствие остатку от деления номера этого года на 12.Задача 2. Найти наибольшее из двух действительных чисел, используя переключатель.
Командой повторения или циклом называется такая форма организации действий, при которой одна и та же последовательность действий повторяется до тех пор, пока сохраняется значение некоторого логического выражения. При изменении значения логического выражения на противоположное повторения прекращаются (цикл завершается). Для организации цикла необходимо выполнить следующие действия:
Различают циклы с известным числом повторений (цикл с параметром) и итерационные (с пред- и постусловием). В цикле с известным числом повторений параметр изменяется в заданном диапазоне. Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла. Для организации цикла с известным числом повторений в C++ используется оператор for. Структура цикла, организованного с помощью этого оператора, имеет вид: for (выражение_1; выражение_2; выражение_3) тело_цикла Здесь выражение_1 — инициализирующее; выражение_2 - аналог логического завершения (пока не равно нулю); выражение_3 - изменяет параметры цикла. Каждое выражение может состоять из нескольких операторов разделенных оператором запятой. Все операторы "выражения" могут быть пропущены, но при этом внутри цикла должен иметься их аналог. Например конструкция for(;;) означает бесконечный цикл. Задача 1. Дано натуральное n, действительное x. Вычислить Разработаем алгоритм решения задачи:
Для организации цикла с неизвестным количеством повторений используются цикл с предусловием и цикл с постусловием while (выражение) <тело цикла>; do <тело цикла> while (выражение); Для оператора цикла с предусловием проверяется значение логического выражения, если оно имеет значение отличное от нуля, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выполнение оператора, следующего за циклом. Цикл с постусловием выполняется хотя бы один раз. Затем проверяется значение логического выражения, если оно отлично от нуля, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выход из цикла. Входить в цикл можно только через его начало, т.е. нельзя входить внутрь цикла с помощью управляющего оператора, т.к. в этом случае параметр цикла не определен. Задача 2. Найти наименьший номер члена последовательности, для которого выполняется условие |an-an-1| < e, где an=arctg an-1+1, a1=0. Вывести на экран этот номер и все элементы ai (i = 1, 2, ..., n). Поскольку по ходу решения задачи необходимо знать an и an-1, будем запоминать их соответственно в переменных ANew и AOld. Внутрь одного цикла может входить один или несколько других. При этом охватывающий цикл называется внешним, а вложенные циклы — внутренними. Правила организации как внешнего, так и внутренних циклов такие же, как и простого цикла. Задача 3. На интервале [2; n] найти натуральное число с максимальной суммой делителей. Предлагаемая задача может быть отнесена к классу «задачи целочисленной арифметики», где аргументы, результаты и промежуточные величины относятся к целому типу. Следует заметить, что в такого рода задачах довольно часто используются операции деления нацело и деления с остатком; наиболее типичной подзадачей является определение количества цифр в записи числа. Алгоритм решения задачи:
Задача 4. Дано натуральное число n. Получить все простые делители этого числа. Предлагаем читателю самостоятельно разобраться с представленным решением.
for (i = 1; i <= -1; i++) k = k * i; for (i = -1; i <= 1 ; i++) k = k * i; for (i = 1; i <= -1; i--) k = k * i; M = 123; While (M != 0) M = M % 10; |
© Шестаков А.П., 2000-2007