Файл: Операторы циклов, их виды, особенности и области применения (ИСТОРИЯ ПОЯВЛЕНИЯ И РАЗВИТИЯ).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 362

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ВВЕДЕНИЕ

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

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

Целью данной курсовой работы является глубокое изучение структурного элемента цикл, его видов и сфер применения и рассмотрение на практике использование каждого вида.

Для достижения цели необходимо решить ряд задач:

  1. Проследить историю развития циклов, как изменился подход по сравнению с современностью;
  2. Изучить и систематизировать информацию о том, каких видов бывают циклы, какие операторы для них используются и в каких задачах они применяются;
  3. Рассмотреть на практике как выбор вида цикла влияет на решение одной и той же задачи.

1 ИСТОРИЯ ПОЯВЛЕНИЯ И РАЗВИТИЯ

1. 1СТРУКТУРЫ ЦИКЛ

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

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


use16 ;Генерировать 16-битный код

org 100h ;Программа начинается с адреса 100h

mov ah,02h ;Для вызова функции DOS 02h - вывод символа

mov dl,'A' ;Первый выводимый символ

mov cx,26 ;Счётчик повторений цикла

myloop:

int 21h ;Обращение к функции DOS

inc dl ;Следующий символ

loop myloop ;Команда цикла

mov ah,09h ;Функция DOS 09h - вывод строки

mov dx,press ;В DX адрес строки

int 21h ;Обращение к функции DOS

mov ah,08h ;Функция DOS 08h - ввод символа без эха

int 21h ;Обращение к функции DOS

mov ax,4C00h ;\

int 21h ;/ Завершение программы

Данная программа выводит все буквы английского алфавита, ASCII коды этих символов идут друг за другом, поэтому можно делать это в цикле, просто прибавляя постоянное значение к регистру, в котором содержится код символа. Командой цикля является loop, она отправляет выполнение команды на метку в коде myloop, до тех пор, пока в регистре cx не обнулится счётчик цикла.

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

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

Оператор безусловного перехода долго вызвал много критики и споров, считается, что код с goto сложно форматировать, он мешает чёткой структуре программы и создаёт так называемый спагетти-код, а некоторые способы его применения создают проблемы с логикой программы. Доводы против были настолько серьёзными, что в структурном программировании теперь считается, что использование данного оператора крайне нежелательно. Это несомненно повлияло на некотрые современные языки программирования, например в Java и Ruby данный оператор запрещён.

Тем не менее, goto до сих пор, хоть и редко, используется в современных программах, например, встречается в ядре Linux и в некоторых Android-приложениях.

Приведём небольшой пример использования безусловного перехода в языке ассемблера при организации цикла

mov cx,N

CYCL:

jcxz Exit

<тело цикла>

dec cx

jmp CYCL

EXIT:   

. . .

С развитием языков программирования развивались и конструкции, используемые при написании программ. Программы становились объёмнее, кода становилось несравнимо больше, появилось сначала функциональное программирование, затем и объектно-ориентированное, но цикл продолжает оставаться одной из самых используемых структур при решении задач программирования. Конечно же, и синтаксически, и структурно выглядит он в современной трактовке уже иначе.


АЛГОРИТМИЧЕСКАЯ СТРУКТУРА ЦИКЛ

Цикл  ̶ разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом.

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

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

Исполнение любого цикла включает первоначальную инициализацию переменных цикла, проверку условия выхода, исполнение тела цикла и обновление переменной цикла на каждой итерации. Кроме того, большинство языков программирования предоставляет средства для досрочного управления циклом, например, операторы завершения цикла, то есть выхода из цикла независимо от истинности условия выхода (в языке Си — break) и операторы пропуска итерации (в языке Си —continue).

2.1 ВИДЫ ЦИКЛОВ

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

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


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

Кроме того циклы бывают вложенными несчётное количество раз, то есть в одном цикле может присутствовать сколько угодно внутренних циклов, а внутренние циклы в свою очередь могут содержать сколько угодно других внутренних циклов. Необязательно циклы будут все одного вида, скорее наоборот.

Рассмотрим каждый вид циклов поподробнее.

2.2 БЕЗУСЛОВНЫЕ ЦИКЛЫ

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

Блок-схему цикла можно изобразить следующим образом

Условие

True

Тело цикла

Выход из цикла

Дальнейший код программы

Рисунок 1. Блок-схема безусловного цикла.

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

Приведём пример описанного вида цикла на языке программирования C++

int i=0; // счётчик метров

int j=0; // счётчик дней

while (true){

i=i+2; j++; //улитка проползает в день вверх по столбу 2 метра

if(i>=10){break;} //если столб длиной 10 метров закончился, выходим

i--; //за ночь улитка сползает на метр вниз

}

После окончания цикла переменная j содержит ответ на задачу, за сколько дней улитка доберётся до вершины столба, если за день она проползает 2 метра, а за ночь сползает вниз на 1 метр.


2.3 ЦИКЛЫ С ПРЕДУСЛОВИЕМ

Основной особенностью цикла, исходя из названия, является то, что выражение для условия выхода из цикла вычисляется перед телом цикла. Если выражение принимает значение ИСТИНА, то итерация выполняется, если ЛОЖЬ, то цикл завершается, таким образом, возможны ситуации, когда цикл не пройдёт ни одной итерации, именно это является основным условием выбора данного вида цикла при построении алгоритма.

В большинстве языков программирования оператором для такого вида цикла служит while. На языке Pascal цикл с предусловием выглядит следующим образом:

while <условие> do

begin

<тело цикла>

end;

На языке C++ синтаксис использования оператора цикла с предусловием имеет похожий вид:

while (<условие>){

<тело цикла>

}

Блок схема цикла с предусловием приведена на Рисунке 2.

Условие

True

Тело цикла

Дальнейший код программы

False

Рисунок 2. Блок-схема цикла с предусловием.

Такой вид цикла очень удобно использовать для проверки каких-либо условий, которые могут быть уже выполнены к началу цикла. Приведём пример на языке C++. Решим задачу поиска наибольшего общего делителя для двух чисел по схеме Евклида.

int m,n; // вводимое пользователем числа

std::cout << ”Введите m”;

std::cin >> m; // пользователь вводит значение m

std::cout << ”Введите n”;

std::cin >> n; // пользователь вводит значение n

while(m!=n){ // пока n неравно m

if(m>n){m=m-n;}

else{n=n-m;}

}

std::cout << ”Наибольший общий делитель равен ”<<m;

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

2.4 ЦИКЛЫ С ПОСТУСЛОВИЕМ

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

Что примечательно, в трактовке условия цикла с постусловием в разных языках есть различия. В Паскале и языках, произошедших от него, условие такого цикла трактуется как условие выхода ( цикл завершается, когда условие истинно, в русской терминологии такие циклы называют ещё «цикл до» ), а в Си и его потомках — как условие продолжения ( цикл завершается, когда условие ложно, такие циклы иногда называют «цикл пока»).