Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Операторы, изменяющие естественный ход программы

Язык Паскаль задумывался как структурный язык. То есть любой алгоритм в нем можно описать в виде набора операторов условия и цикла, каждый из которых можно рассматривать как отдельный блок. В блоки «вкладываются» более мелкие блоки, и т. д. Поэтому реализация программы легко осуществляется в рамках структурного программирования.
Ряд языков программирования (таких, например, как Фортран и Бейсик) не удовлетворяют свойству структурности: в них для описания алгоритма приходится использовать, например, оператор безусловного перехода (goto).

Для первых языков программирования использование безусловного перехода являлось совершенно естественным, так как сама инструкция безусловного перехода используется в каждой программе, написанной на машинном коде. Без нее нельзя реализовать такие, например, конструкции, как if...else.

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

Тезис структурного программирования призывает вовсе не использовать в программе оператор goto. Для людей, которые, вероятно, первый раз о таком слышат, это кажется вполне естественным. А вот для программистов, которые привыкли мыслить «в терминах goto», отказ от его использования был очень странен и вызывал много возражений.

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

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

 

Использование оператора безусловного перехода goto

Споры между противниками и сторонниками goto не утихают до сих пор. Мы прийедем один из основных примеров оправданного использования goto.
Рассмотрим задачу проверки элементов массива на уникальность (определить, все ли элементы массива различны).

Проанализируем задание и методы его решения.
Что означает — все элементы различны? Это значит, что в массиве нет ни одной одинаковой пары элементов.

А как это проверить? Задачу проще решать от противного: постараемся найти в массиве два одинаковых элемента. Если таких не найдется, значит, все элементы различны.

Так как одинаковые элементы могут быть как угодно разбросаны по массиву, необходимо сравнить каждый элемент с каждым. То есть нужно сравнить первый элемент со всеми остальными (это цикл), затем второй элемент со всеми остальными (и это цикл), и так перебрать все элементы. Это означает, что мы должны использовать вложенные циклы. Всего при этом у нас получится около N2 сравнений (точнее, (N2-N)/2).

Заметим, что если мы в какой-то момент найдем совпадающую пару элементов, перебирать все оставшиеся будет уже не обязательно. Значит, нужно выйти из обоих циклов. Вот для этого нам и понадобится оператор goto.

 

Пример 14.1.
Проверка элементов массива на уникальность

Итак, использование goto считается оправданным, если таким способом происходит выход из нескольких вложенных циклов вперед.
Справедливости ради приведем пример той же программы без использования goto.

Пример 14.2.
Проверка элементов массива на уникальность без использования goto

Программа стала чуть сложнее из-за применения while вместо for, зато мы обошлись без goto.

Операторы, изменяющие ход выполнения цикла

В Паскале имеются еще два оператора, действие которых напоминает действие оператора безусловного перехода. Оба они применяются для изменения хода выполнения цикла (напоминаем, что в Паскале есть три вида циклов — for, while и repeat).

Оператор break

Оператор break прерывает действие текущего цикла и передает управление тому оператору программы, который должен выполниться после окончания цикла.
Разумеется, оператор break должен находиться внутри тела цикла.
Рассмотрим применение оператора break.

Пример 14.3.
Вывод на экран первого по счету двузначного числа, сумма квадратов цифр которого делится на 17

Вместо применения оператора break можно использовать переменную-флажок, по значению которой определять, нужно ли выполнять цикл далее.
В данном случае (пример 14.3), так как факт наличия нужного числа считался заранее известным, проще было бы использовать цикл while, проверяющий только искомое условие.

Пример 14.4.
Вывод на экран первого по счету двузначного числа, сумма квадратов цифр которого делится на 17 (без оператора break)

 

Оператор continue

Оператор continue заканчивает выполнение текущего шага цикла. То есть после оператора continue сразу выполнится проверка условия окончания цикла. Если цикл еще должен продолжаться, начнет снова выполняться тело цикла.
Оператор continue, так же как и break, должен находиться внутри тела цикла.
Рассмотрим применение оператора continue.

Пример 14.5.
Вывод на экран всех двузначных чисел, сумма квадратов цифр которых не делится на 17

Как и в случае с break, использование оператора continue не является обязательным.

Выводы

1.         Паскаль — структурный язык программирования. Любая программа на нем может быть составлена из блоков.
2.         Для удобства работы программистов старой школы в языке сохранен оператор безусловного перехода goto. Он позволяет выйти из блока операторов в другую точку программы.
3.         Для указания той точки, куда может выйти оператор goto, используется метка — произвольный идентификатор, после которого стоит двоеточие.
4.         Идентификатор метки должен быть описан в разделе label.                
5.         На одну метку могут ссылаться несколько операторов goto.
6.         Для досрочного завершения выполнения тела цикла можно использовать операторы break и continue.
7.         Оператор break прекращает выполнение цикла. После его выполнения программа выполняет оператор, следующий после Цикла.
8.         Оператор continue прекращает выполнение текущего тела цикла. После его выполнения программа проверяет условие окончания цикла.

Контрольные вопросы

1.         Какую функцию выполняет оператор безусловного перехода goto?
2.         Почему нежелательно использовать в программе оператор goto?
3.         Чем отличается действие оператора break от действия оператора continue?
4.         В каком случае в программе удобно использовать оператор break? Можно ли без него обойтись?




 

Комментарии:

2014-11-20 ответил Дмитрий

Приведённых примеров я не вижу. Но с оправданностью использования goto как в данном примере, так и в целом не согласен. int []mas=new int[10]; {//Заполняем массив} for (int i=0;i<10;i++) for (int j=i;j<10;j++){ if ((mas[i]==mas[j])&&(i!=j)){/*элементы не уникальны */ i=10;j=10} }




Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru