Файл: Операторы циклов, их виды, особенности и области применения (ИСТОРИЯ ПОЯВЛЕНИЯ И РАЗВИТИЯ).pdf
Добавлен: 30.03.2023
Просмотров: 365
Скачиваний: 6
На языке Pascal цикл с постусловием выглядит следующим образом:
repeat
<тело цикла>
until <условие выхода>
На языке C++ используется уже знакомый нам оператор while:
do{
<тело цикла>
} while (<условие подолжения цикла>)
На рисунке приведена блок схема цикла с постусловием в трактовке языка С++
True
Тело цикла
Дальнейший код программы
False
Условие
Рисунок 3. Блок-схема цикла с постусловием.
Как хорошо видно из блок-схемы, такой цикл выполнится всегда хотя бы раз, даже если условие выхода сразу истинное.
Приведём пример использования цикла с постусловием на языке C++
int i=0; // вводимое пользователем значение
do{
std::cout << ” Введите целое число от 1 до 10”;
std::cin >> i;
}while ((i<1) || (i>10)) // пока i меньше 1 или больше 10, алгоритм
// будет просить ввести значение ещё раз
От пользователя требуется ввести целое число в диапазоне от 1 до 10 включительно. Для первоначального ведения данных должна пройти хотя бы одна итерация, если пользователь ввёл значение правильно сразу, то тело цикла выполнится один раз, в обратном случае цикл будет продолжаться, пока в переменной не окажется требуемого значения. Окончание цикла говорит о том, что в переменной i содержится значение, которое больше 0 или меньше 11.
2.5 ЦИКЛЫ СО СЧЁТЧИКОМ
Такой вид счётчика используется для цикла с конечным числом итераций. Где специальная переменная, которая называется счётчиком, принимает заданное значение, изменяется с определённым шагом каждую итерацию и при достижении заданного граничного значения является условием выхода из цикла. Во всех языках программирования для цикла со счётчиком используется оператор for. Поэтому данный вид цикла по другому называют «цикл для», имея в виду что он выполняется дл переменной счётчика.
В разных языках различен подход к тому, можно ли определить шаг цикла, в какой момент происходит изменение счётчика, можно ли изменять переменную счётчика внутри цикла и как это повлияет на поведение цикла.
В языке Pascal задаётся только начальное значение счётчика и граничное, шаг равен 1, изменить это можно, только если менять сам счётчик внутри цикла, но это очень непредсказуемо, потому то разные трансляторы могут по разному собрать программу и результат будет не тот который ожидался. Вот как выглядит код цикла со счётчиком на языке Pascal
for i:=1 to 10 do
begin
<тело цикла>
end;
В языке С++ другой подход, можно задать в описании цикла не только шаг счётчика, но и когда он будет меняться до выполнения цикла или после. Приведём пример цикла со счётчиком, когда переменная цикла меняется с шагом -1 и происходит это до итерации:
for (int i=10; --i; 0) {
<тело цикла>
}
Построим блок схему цикла со счётчиком
True
Тело цикла
Дальнейший код программы
False
i <= <конечное значение>
i = <начальное значение>
i = i+1
Начало цикла
Рисунок 4. Блок-схема для цикла со счётчиком
Приведём пример решения задачи на вычисление последовательности из 10 чисел Фибоначчи на языке C++ ( поледовательность Фибоначчи – широко известная последовательность, каждый член которой, начиная с третьего, образуется путём сложения предыдущих двух членов последовательности, первый элемент равен 1, второй элемент равен 2)
int a[10]; // задаём массив, где будет храниться последовательность
a[0]=1; // инициируем первое число Фибоначчи
std::cout<<”a[1]=”<< a[0];
a[1]=2; // инициируем второе число Фибоначчи
std::cout<<”a[1]=”<< a[1];
for (int i=2; i++; i<10) // пока счётчик не дойдёт до 9 будут
{ // вычисляться наши числа
a[i]= a[i-1] + a[i-2]; // каждое число равно сумме двух предыдущих
std::cout<<”a[“<<i+1<<”]=”<< a[i];
}
Посчитанные числа сразу выводятся на экран. В силу того что индексация массивов в языке C++ начинается с 0, при выводе на экран индекс элемента массива нужно увеличить, чтобы он соответствовал индексу последовательности, именно поэтому счётчик цикла изменяется с 0 до 9, а не с 1 до 10 как это должно казаться на первый взгляд.
ВЫБОР И ПРИМЕНЕНИЯ ЦИКЛОВ
Несмотря на то, что все вышеописанные циклы имеют свои особенности и области применения, решать какой цикл использовать в каждом конкретном случае решает сам программист, исходя из своего опыта, предпочтений и ситуации. Бывает, что код подвергается модернизации и проще изменить пару строк в имеющемся коде чем переписывать весь кусок заново.
Наиболее часто для работы с многомерными массивами используются вложенные циклы со счётчиками, они удобны при различных способах обхода матриц, но иногда использование других циклов даст более красивое решение задачи.
Рассмотрим задачу, обход матрицы размерностью n на n по спирали, таким образом, как показано на рисунке
Рисунок 5. Схема обхода матрицы
Обход начинается всегда с левого верхнего угла и идёт по часовой стрелке, постепенно сужаясь к центру.
Для краткости положим, что у нас уже есть массив a, размерностью n на n, и он уже заполнен некими числами, нам остаётся только вывести их в заданном порядке. Так как решать задачу мы будем на языке C++ , необходимо помнить что нумерация массивов в этом языке начинается с 0, поэтому элемент матрицы A11 будет содержаться в переменной a[0][0].
Решим эту задачу двумя способами, через использование циклов со счётчиками и с использованием циклов с предусловиями.
int k, m, e;
k=0;
m=0;
for ( e=1; e++; e<2n)
{
if ((e%4)==1){
for ( i=k; i++; i<(n-k) )
{
std::cout<<a[k][i];
}
k++;
}
if ((e%4)==2)
{
for ( i=m+1; i++; i<(n-m) )
{
std::cout<<a[i][n-m-1];
}
m++;
}
if ((e%4)==3)
{
for ( i=n-k-1; i--; i>=k )
{
std::cout<<a[n-k][i];
}
k++;
}
if ((e%4)==0)
{
for ( i=n-m-1; i--; i>=m )
{
std::cout<<a[i][m-1];
}
m++;
}
}
При обходе матрицы по заданным правилам, есть 4 вида цикла: увеличивается второй индекс при неизменном первом, затем увеличивается первый индекс при неизменном втором, затем уменьшается второй индекс и после этого уменьшается первый. Так получается один виток спирали, в 4 шага. Всего шагов для обхода матрицы требуется 2*n-1. Таким образом, мы создали цикл со счётчиком от 1 до 2*n-1, чтобы обойти всю матрицу. Но теперь нам надо определить в каждом шаге, каким именно из 4-ёх вариантов двигаться, для этого нам поможет остаток от деления переменной цикла e. Заведём дополнительно счётчики отступа k и m. Первый отвечает за отступ по горизонтали, второй за отступ по вертикали. Будем их увеличивать по мере углубления витков. Решение этой задачи с помощью циклов со счётчиками на первый взгляд удачнее всего, но давайте попробуем решить эту задачу с помощью цикла while.
int i, j, k, l, x, y, z, e;
k = n;
x = 0;
y = 1;
e = 1;
i = 0;
j = 0;
while (e<2*n)
{
k = k- abs(x);
l = 0;
while (l<k)
{
i = i + x;
j = j + y;
std::cout<<a[i][j];
}
z=x;
x=y;
y=z*(-1);
}
В данном случае мы заметили определённые закономерности в изменении индексов при обходе матрицы по спирали, и выразили их математически: индекс элемента матрицы меняется поочерёдно с одинаковым шагом 1) 0 и 1; 2) 1 и 0; 3) 0 и -1; 4) -1 и 0. И если первому элементу присвоить второй, а второму первый умноженный на -1 (в случае 0 останется также 0), то можно эти шаги циклично менять. Далее нашли зависимость от того, сколько раз нужно сделать итераций в каждом шаге и теперь можно составить цикл, в котором будет, как и в прошлом, 2*n-1 шагов.
Как видно из этих двух примеров, можно использовать любой цикл в любой задаче, целесообразность этого зависит скорее от субъективных причин. В первом примере код более читаемый и понятный, во втором случае содержит меньше строк, но не факт что будет выполняться быстрее из-за наличия промежуточных операций. Оба примера решают поставленную задачу, а значит, имеют право на существование.
ЗАКЛЮЧЕНИЕ
Целью данной курсовой работы было исследование структурного элемента цикл, его видов и сфер применения и рассмотрение на практике использование каждого вида. Полученные в ходе исследования знания служат фундаментом для понимания принципов структурного программирования и способов решения тех или иных задач.
Для достижения цели нами был поставлен ряд задач, а именно:
- Разобраться, откуда взялся такой структурный элемент в программировании как цикл, как он развивался и как выглядит сейчас.
Мы рассмотрели историю развития языков программирования от машинных кодов до современных процедурных и объекно-ориентированных языков программирования. Выяснили, как изменился подход к использованию цикла, и что в старом подходе уже утратило свою актуальность.
- Систематизировать информацию о видах циклов и сферах их применений
В ходе работы мы выделили 4 вида циклов. Рассмотрели, какие особенности есть у каждого, и в каких задачах их лучше применять. Ознакомились с синтаксисом в различных языках и попробовали применить на практике исходя из их сферы применения.
- Посмотреть на практике как тот или иной вид цикла будет влиять на решение одной и той же задачи в программировании.
Для решения поставленной проблемы, мы выбрали практическую задачу из сборника задач по программированию и попробовали решить её разными способами, с помощью различных видов циклов. В ходе рассмотрения решений, мы выяснили, что выбор цикла может влиять на сам алгоритм, но при этом остаётся сугубо личным выбором программиста, так как любую задачу можно решить по разному, и результат будет зависеть не только от вида цикла но и от подхода к решению в целом, а значит, мастер должен сам решать каким инструментом ему лучше пользоваться для достижения лучшего результата.
Подведя итог курсовой работы, хочется отметить, что цикл, безусловно, является важнейшим инструментом в решении задач программирования и без него не обойтись никак. Поэтому любой человек, осваивающий профессию программиста, должен обязательно включить изучение цикла в свою образовательную программу. Иначе он упустит фундаментальные знания, без которых невозможно работать в этой профессии.
СПИСОК ЛИТЕРАТУРЫ
- Культин Н.Б.: С/С++ в задачах и примерах. - СПб: БХВ-Петербург, 2011
- Вирт Н. Алгоритмы и структуры данных. - М.: Мир, 1989.
- Гуда А.Н.: Информатика и программирование. - М.: Дашков и К, 2010
- Зубов В.С. Программирование на языке Turbo Pascal (версии 6.0 и 7.0). - М.: Информационно-издательский дом "Филинъ", 1997.
- Боровский, А.Н. Практическое программирование на C++. / А.Н. Боровский. - СПб.: BHV, 2012.
- Материалы сайта https://ru.wikipedia.org.