Лекция 6.ppt
- Количество слайдов: 24
Цикл. Виды, особенности организации, операторы. Лекция 6
Термины и определения n n n Тело цикла – последовательность инструкций, предназначенная для многократного исполнения. Итерация – единичное выполнение тела цикла. Условие выхода или условие окончания цикла (либо условие продолжения - в зависимости от того, как интерпретируется его истинность: как признак необходимости завершения или продолжения цикла) – выражение, определяющее, будет в очередной раз выполняться итерация или цикл завершится. Счётчик итераций (счётчик цикла) – переменная, хранящая текущий номер итерации. Цикл не обязательно содержит счётчик, счётчик не обязан быть один — условие выхода из цикла может зависеть от нескольких изменяемых в цикле переменных, а может определяться внешними условиями (например, наступлением определённого времени), в последнем случае счётчик может вообще не понадобиться. МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Виды циклов n n n Безусловные циклы Цикл с предусловием Цикл с постусловием Цикл с выходом из середины Цикл со счётчиком Совместный цикл МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Безусловный цикл n n n условие выхода из него никогда не выполняется Любой цикл можно представить как бесконечный цикл, в теле которого есть проверка условия выхода и команда выхода из цикла. Возможность реализовать цикл является подтверждением Тьюринг-полноты* языка программирования МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
*Тьюринг-полнота языков программирования n Любая программа может быть написана при помощи: q q n n бесконечных циклов; команд выхода из цикла; операторов ветвления (if-then); последовательностью команд, исполняемых одна после другой. Программу можно рассматривать как исполнитель некоей вычислимой функции (функции, для которой м. б. написан алгоритм вычисления) Вычислимая функция – это множество функций определенного вида, которые могут быть реализованы на машине Тьюринга** В теории вычислимости исполнитель (множество вычисляющих элементов) называется тьюринг-полным, если на нём можно реализовать любую вычислимую функцию. Большинство широко используемых языков программирования — тьюринг-полные. Это касается как императивных языков, таких как Паскаль, так и функциональных (Haskell) и языков логического программирования (Prolog). МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
**Машина Тьюринга (полнота по Тьюрингу) n n n Машина Тьюринга представляет собой простейшую вычислительную машину с линейной памятью, которая согласно формальным правилам преобразует входные данные с помощью последовательности элементарных действий. На ней можно вычислить всё, что можно вычислить на любой другой машине, осуществляющей вычисления с помощью последовательности элементарных действий. Это свойство называется полнотой. На машине Тьюринга можно имитировать любую программу для обычных компьютеров, преобразующую входные данные в выходные по какому -либо алгоритму. В свою очередь, на различных абстрактных исполнителях можно имитировать Машину Тьюринга. Исполнители, для которых это возможно, называются полными по Тьюрингу (Turing complete). МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Практика использования бесконечных циклов n Для Си-подобных языков n Python while True: #код Оператор цикла for n Пакетный файл MSfor (; ; ) { /* какое-либо DOS действие */ } : loop rem какое-либо q Оператор цикла while действие goto loop while(true) { /* какое-либо действие */ } q Оператор цикла dowhile do { /* какое-либо действие */ } while(true) q МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Выход из бесконечного цикла n Операторы ограничения и прерывания q q Continue; ограничение цикла, Break; прерывание цикла. For i: = 1 to 3 do begin Write( 'Введите ПАРОЛЬ: ' ); Readln(S); {S и Parol - переменные одного типа} If S = Parol Then Break {прерывание цикла} else If i <> 3 Then Continue; {ограничение цикла} Writeln( 'Доступ к программе ЗАПРЕЩЕН' ); Writeln( 'Нажмите Enter' ); Readln; Halt {прерывание программы} end; {продолжение программы} МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с предусловием n n n Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно). В большинстве процедурных языков программирования реализуется оператором while, отсюда его второе название — while-цикл. МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с предусловием На языке Pascal цикл с предусловием имеет следующий вид: while <условие> do begin <тело цикла> end; n На языке Си: while (<условие>) { <тело цикла> } n МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с постусловием n n n Цикл, в котором условие проверяется после выполнения тела цикла. Тело цикла всегда выполняется хотя бы один раз. На языке Pascal этот цикл реализует оператор repeat. . until; в Си — do…while. МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с постусловием На языке Pascal цикл с постусловием имеет следующий вид: repeat <тело цикла> until <условие выхода> n На языке Си: do { <тело цикла> } while(<условие продолжения цикла>) n МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с выходом из середины n n Этот тип цикла — наиболее общая форма условного цикла. Синтаксически такой цикл оформляется с помощью трёх конструкций: q q q n n n начало цикла; конец цикла; команда выхода из цикла. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся на оператор, следующий за конструкцией конца цикла. Принципиальное отличие от рассмотренных выше: часть тела цикла, расположенная после начала цикла и до команды выхода, выполняется всегда (даже если условие выхода из цикла истинно при первой итерации), а часть тела цикла, находящаяся после команды выхода, не выполняется при последней итерации. С помощью цикла с выходом из середины можно легко смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце тела цикла). МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл с выходом из середины Для выхода из середины цикла используются оператор безусловного перехода goto (он позволяет изменить порядок выполнения команд и перейти по метке, находящейся сразу после окончания операторов цикла), а также процедуры exit (выход из подпрограммы или программы) и break (немедленно выводит из ближайшего цикла). var I : integer, s : real; begin s: =0; for i: =1 to 1000 do begin s: =s+i*i; if s > 100 then break; { выход из цикла } end; writeln(‘сумма 100 набирается из ’, i, ‘ членов ряда’) end. n МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл со счётчиком n n Цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается q q q счётчик (так называемая «переменная цикла» ); требуемое количество проходов (или граничное значение счётчика); возможно, шаг, с которым изменяется счётчик. МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Цикл со счётчиком n В Си можно реализовать цикл со счетчиком и в виде условного цикла: q Цикл со счетчиком for (i = 0; i < 10; ++i) { тело цикла } q Цикл с предусловием i = 0; while (i < 10) { тело цикла ++i; } МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Совместный цикл n n n Цикл, задающий выполнение некоторой операции для объектов из заданного множества, без явного указания порядка перечисления этих объектов. «Выполнить операцию X для всех элементов, входящих во множество M» . Теоретически порядок применения операции к элементам множества не определен, но конкретные языки программирования могут задавать порядок перебора элементов. МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Совместный цикл n n Совместные циклы имеются в следующих языках программирования: C#, Java. Script, Perl, Python, PHP, LISP, и др. — они позволяют выполнять цикл по всем элементам заданной коллекции объектов. В определении такого цикла требуется указать только коллекцию объектов и переменную, которой в теле цикла будет присвоено значение обрабатываемого в данный момент объекта (или ссылка на него). В различных языках программирования синтаксис оператора различен МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
Образцы задания совместных циклов в различных языках C# foreach (type item in set) { //использование item } n Delphi for item in [1. . 100] do begin //Использование item end; n n Java for (type item : set) { //использование item } n Python for item in iterator_instance: # использование item n МГТУ “СТАНКИН”/Кафедра ИС/Васильева А. К.
*Досрочный выход и пропуск итерации n Многие языки программирования, имеющие в своём синтаксисе циклические конструкции, имеют команды, позволяющие нарушить порядок работы этих конструкций: команду досрочного выхода из цикла и команду пропуска итерации.
*Досрочный выход из цикла n n Команда досрочного выхода применяется, когда необходимо прервать выполнение цикла, в котором условие выхода ещё не достигнуто. Такое бывает, например, когда при выполнении тела цикла обнаруживается ошибка, после которой дальнейшая работа цикла не имеет смысла. Команда досрочного выхода обычно называется EXIT или break, а её действие аналогично действию команды безусловного перехода (goto) на команду, непосредственно следующую за циклом, внутри которого эта команда находится.
*пример организации досрочного выхода из цикла n в языке Си два нижеприведённых цикла работают совершенно одинаково: // Применение оператора break while(<условие>) {. . . операторы if (<ошибка>) break; . . . Операторы } . . . продолжение программы q // Аналогичный фрагмент без break while(<условие>) {. . . Операторы if (<ошибка>) goto break_label; . . . Операторы } break_label: . . . продолжение программы q
*Пропуск итерации n n Данный оператор применяется, когда в текущей итерации цикла необходимо пропустить все команды до конца тела цикла. При этом сам цикл прерываться не должен, условия продолжения или выхода должны вычисляться обычным образом. В языке Си и его языках-потомках в качестве команды пропуска итерации используется оператор continue в конструкции цикла. Действие этого оператора аналогично безусловному переходу на строку внутри тела цикла, следующую за последней его командой.
*Пропуск итерации пример код на Си, находящий сумму элементов массива и сумму всех положительных элементов массива, может иметь следующий вид: int arr[ARRSIZE]; . . . // Суммирование отдельно всех и только положительных // элементов массива arr с применением continue. int sum_all = 0; int sum_pos = 0; for (int i = 0 ; i < ARRSIZE; ++i) { sum_all += arr[i]; if (arr[i] <= 0) continue; sum_pos += arr[i]; } // Аналогичный код c goto int sum_all = 0 int sum_pos = 0; for (int i = 0 ; i < ARRSIZE; ++i) { sum_all += arr[i]; if (arr[i] <= 0) goto cont_label; sum_pos += arr[i]; cont_label: } n
Лекция 6.ppt