ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ В ЯЗЫКАХ ВЫСОКОГО УРОВНЯ




 

Алгоритмическая структура цикла

 

Цикл - это такая форма организации действий, при которой одна последовательность действий повторяется несколько раз (или ни разу), до тех пор, пока выполняются некоторые условия. В алгоритмические структуры цикл входит серия команд, выполняемая многократно. Такая последовательность команд называется телом цикла. Циклические алгоритмические структуры бывают двух видов:

- циклы со счетчиком, в которых тело цикла выполняется определенное количество раз;

- циклы с условием, в которых тело цикла выполняется до тех пор, пока выполняется условие.

Они все состоят из нескольких этапов. Это:

- Подготовка цикла, в которую входят начальные присвоения;

- Тело цикла - команды повторения цикла;

- Условие - обязательная часть цикла “Пока”.

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

Теперь рассмотрим цикл “While или Пока”. Цикл “While” является циклической конструкцией с условием, т.е. это такой цикл, где тело цикла выполняется до тех пор, пока выполняются некоторые условия. Его простейшая блок схема изображена на рисунке 3.

 


Рисунок 2 - Схема цикла For

 

Рисунок 3 - Схема цикла While

 

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

Наиболее часто в алгоритмах и программах применяются два вида циклов. Это циклы “ While или Пока ” и “ For или Для ”.

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

 

Циклы в языке С

 

В языке C применяются циклические конструкции: while,for.

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

Его конструкция выглядит таким образом:

while(условие){ оператор;}

...продолжение...

или

while(условие){

операторы;... }

...продолжение...

Пример цикла:

int x;

x = 10;

While (x > 0) { Printf ("x=%d\n", x);

x = x - 1;} printf("Конец.\n");

printf("x стало равно %d.\n", x);/* печатает 0 */

Цикл for ("для каждого")Этот цикл является просто иной записью одного из вариантов цикла while. Он служит обычно для выполнения определенного действия несколько раз,не "пока истинно условие", а "выполнить N-раз".У такого цикла есть "переменная цикла" или "счетчик повторений".

int i;

i = a; /* начальная инициализация */

while(i < b){ тело_цикла;

i += c; /* увеличение счетчика */}

...продолжение...

переписывается в виде

int i;for(i=a; i < b; i += c) тело_цикла;

Тело_цикла будет выполнено для значений i

a

a+c

a+c+c

...

пока i < b

В простейшем случае:

for(i=1; i <= N; i++)

Printf ("i=%d\n", i)

i означает "номер повторения".

Такой цикл служит для повторения схожих действий несколько разс разным значением параметра.Оператор break ("вывалиться из цикла")Оператор break заставляет прервать выполнение тела циклаи сразу перейти к продолжению программ

While (условие1) {

операторы1; if (условие2)

break; операторы2;}

...продолжение...и

for(i=0; условие1; i++){ операторы1;

if(условие2) break;операторы2; }

...продолжение...

Этот оператор позволяет организовывать дополнительные точки выхода из цикла (при дополнительных условиях).

Пример:

for (i=0; i < 20; i++){

Printf ("i=%d\n", i);

if (i == 7){ Printf ("break loop! \n");

break; /* вывалиться из цикла */ }

printf("more\n");}

Printf ("finished, i=%d\n", i); /* печатает 7 */

В частности, с его помощью можно организовывать бесконечный цикл:for (;;){ /* заголовок бесконечного цикла */

операторы1;

if (условие2)

break;

операторы2; }...продолжение...

Здесь в самом заголовке цикла не проверяется никаких условий, такой цикл продолжается бесконечно. Условие продолжения считается всегда истинным. Единственный способ выйти из него - это сделать break (при каком-то условии) в теле цикла, что и написано [2,3].

Бесконечный цикл можно также организовать при помощи:

while(1){

...

}

 

Циклы в языке С++

 

Предположим, нам нужно вычислить сумму всех целых чисел от 0 до 100. Для этого воспользуемся оператором цикла for:

int sum = 0;int i;for (i = 1; i <= 100; i = i + 1)// заголовок циклаsum = sum + i; // тело цикла

Оператор цикла состоит из заголовка цикла и тела цикла. Тело цикла – это оператор, который будет повторно выполняться (в данном случае – увеличение значения переменной sum на величину переменной i). Заголовок – это ключевое слово for, после которого в круглых скобках записаны три выражения, разделенные точкой с запятой. Первое выражение вычисляется один раз до начала выполнения цикла. Второе – это условие цикла. Тело цикла будет повторяться до тех пор, пока условие цикла истинно. Третье выражение вычисляется после каждого повторения тела цикла.

Оператор for реализует фундаментальный принцип вычислений в программировании – итерацию. Тело цикла повторяется для разных, в данном случае последовательных, значений переменной i. Повторение иногда называется итерацией. Мы как бы проходим по последовательности значений переменной i, выполняя с текущим значением одно и то же действие, тем самым постепенно вычисляя нужное значение. С каждой итерацией мы подходим к нему все ближе и ближе. С другим принципом вычислений в программировании – рекурсией – мы познакомимся в разделе, описывающем функции. Любое из трех выражений в заголовке цикла может быть опущено (в том числе и все три). То же самое можно записать следующим образом:

int sum = 0;int i = 1;for (; i <= 100;) {sum = sum + i;i = i + 1; }Заметим, что вместо одного оператора цикла мы записали несколько операторов, заключенных в фигурные скобки – блок. Другой вариант:int sum = 0;int i = 1;for (;;) {if (i > 100)break; sum = sum + i;i = i + 1; }

В последнем примере мы опять встречаем операторbreak. Оператор break завершает выполнение цикла. Еще одним вспомогательным оператором при выполнении циклов служит оператор продолжения continue. Операторcontinue заставляет пропустить остаток тела цикла и перейти к следующей итерации (повторению). Например, если мы хотим найти сумму всех целых чисел от 0 до 100, которые не делятся на 7, можно записать это так:

int sum = 0;for (int i = 1; i <= 100; i = i+1) {if (i % 7 == 0)continue; sum = sum + i; }

Еще одно полезное свойство цикла for: в первом выражении заголовка цикла можно объявить переменную. Эта переменная будет действительна только в пределах цикла.

Другой формой оператора цикла является оператор while. Его форма следующая:

while (условие) операторУсловие – как и в условном операторе if – это выражение, которое принимает логическое значение "истина" или "ложь". Выполнение оператора повторяется до тех пор, пока значением условия является true (истина). Условие вычисляется заново перед каждой итерацией. Подсчитать, сколько десятичных цифр нужно для записи целого положительного числа N, можно с помощью следующего фрагмента:int digits =0;while (N > 0) {digits = digits + 1;N = N / 10;}

Третьей формой оператора цикла является цикл do while. Он имеет форму:

do { операторы } while (условие);

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

char ch;do {ch = getch(); // функция getch возвращает// символ, введёный с// клавиатуры} while (ch!= '*');

В операторах while и do также можно использовать операторы break и continue. Как легко заметить, операторы цикла взаимозаменяемы. Оператор while соответствует оператору for:

for (; условие;) оператор

Пример чтения символов с терминала можно переписать в виде:

char ch;ch = getch();while (ch!= '*') {ch = getch();}Разные формы нужны для удобства и наглядности записи [4, 5, 6].

 

Циклы в языке Java

 

В языке программирования java, как и в других языках программирования, используются такие циклические конструкции как while, for, do while.

Основной оператор цикла в языке Java— оператор while — выглядит так:

while (лог.Выр) оператор

Вначале вычисляется логическое выражение; если его значение true, то выполняется оператор, образующий цикл. Затеем, снова вычисляется лог.выр. и действует оператор, и так до тех пор, пока не получится значение false. Если логическое выражение изначально равняется false, то оператор не будет выполнен ни разу. Предварительная проверка обеспечивает безопасность выполнения цикла, позволяет избежать переполнения, деления на нуль и других неприятностей. Поэтому оператор while является основным, а в некоторых языках и единственным оператором цикла.

Оператор в цикле может быть и пустым, например, следующий фрагмент кода:

int i = 0;

double s = 0.0;

while ((s += 1.0 / ++i) < 10);

вычисляет количество i сложений, которые необходимо сделать, чтобы гармоническая сумма s достигла значения 10. Такой стиль характерен для языка С. Можно организовать и бесконечный цикл:

while (true) оператор

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

Если в цикл надо включить несколько операторов, то следует образовать блок операторов {}.

Другой оператор цикла — оператор do-while — имеет вид do оператор while (лог.Выр)

Здесь сначала выполняется оператор, а потом происходит вычисление логического выражения логического выражения. Цикл выполняется, пока логического выражения остается равным true.

В цикле do-while проверяется условие продолжения, а не окончания цикла. Существенное различие между этими двумя операторами цикла только в том, что в цикле do-while оператор обязательно выполнится хотя бы один раз. Например, пусть задана какая-то функция f(x), имеющая на отрезке, [о; b] ровно один корень. Ниже представлена эта программа:

class Bisection{

static double f(double x){

return x*x*x — 3*x*x +3; }

// Или что-то другое public static void main(String!] args){double a = 0.0, b = 1,5, с, y, eps = le-8;

do{с = 0.5 *(a + b); у = f(с);

if (Math.abs(y) < eps) break;// Корень найден. Выходим из цикла// Если на концах отрезка [а; с] // функция имеет разные знаки: if (f (а) * у < 0.0) b = с;

//Значит, корень здесь. Переносим точку b в точку с

//В противном случае: else а * с;

// Переносим точку а в точку с// Продолжаем, пока отрезок [а; Ь] не станет мал } while (Math, abs (b-a) >= eps); System.out.println("x = " +c+ ", f(" +c+ ") = " +y) }}

И еще один оператор цикла — оператор for — выглядит так:

for (список.Выр; лог.Выр; список.Выр2) оператор

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

Затем вычисляется логическое выражение лог.выр. Если оно истинно, true, то действует оператор, потом вычисляются слева направо выражения из списка выражений списокВыр2. Далее снова проверяется лог.выр. Если оно истинно, то выполняется оператор и списокВыр2 и т. д. Как только лог.выр станет равным false, выполнение цикла заканчивается. Короче говоря, выполняется последовательность операторов.

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

for (;;) оператор

В этом случае в теле цикла следует предусмотреть какой-нибудь выход.

Хотя в операторе for заложены большие возможности, используется он, главным образом, для перечислений, когда их число известно, например, фрагмент кода:

int s=0;

for (int k = 1; k <= N; k++) s += k * k;

В операторах цикла используется оператор continue. Он имеет две формы. Первая форма состоит только из слова continue и осуществляет немедленный переход к следующей итерации цикла. В очередном фрагменте кода оператор continue позволяет обойти деление на нуль:

for (int i = 0; i < N; i++){

if (i '== j) continue;

s += 1.0 / (i - j); }

Вторая форма содержит метку:

continue метка

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

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

оператор break метка применяется внутри помеченных операторов цикла, оператора варианта или помеченного блока для немедленного выхода за эти операторы. Следующая схема поясняет эту конструкцию:

Ml: { // Внешний блок

М2: { // Вложенный блок — второй уровень

М3: { // Третий уровень вложенности... if (что-то случилось) break M2; } \// Если true, то здесь ничего не выполняется // Здесь тоже ничего не выполняется}

// Сюда передается управление}

Поначалу сбивает с толку то обстоятельство, что метка ставится перед блоком или оператором, а управление передается за этот блок или оператор. Поэтому мне кажется что не стоит увлекаться оператором break с меткой [8].


Циклы в языке С#

 

Управляемые итерации, или циклы, в С# выполняют операторы for,while, do/while и foreach. В каждом случае исполняется простой или составной оператор, пока значение булевского выражения остается равным true.Исключение составляет foreach, производящий итерацию списка объектов. Цикл, for предоставляет механизм для прохода по циклу, при котором инициализируется некоторая локальная переменная и выполняется оператор в цикле до тех пор, пока заданное условие истинно, причем перед переходом к следующей итерации производится какой-нибудь простой шаг. Синтаксис цикла:

for(инициализатор; условие; итератор;) оператор {ы}

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

for (int I = 0; I < 100; i ++)

{ //Цикл будет выполнен 100 раз}

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

// Этот цикл проходит по строкам

for (int i = 0; i < 100; i ++)

{// Это цикл проходит по столбцам

for (int j = 0; j < 100; j ++){

a[ i, j] = 0;}}

Рассмотрим цикл while, его общая форма имеет такой вид:

whi1е (условие) инструкция;

Здесь под элементом инструкцияпонимается либо одиночная инструкция, либо блок инструкций. Работой цикла управляет элемент условие, который представляет собой любое допустимое выражение типа bool. Элемент инструкция выполняется до тех пор, пока условное выражение возвращает значение истина. Как только это условиестановится ложным, управление передается инструкции, которая следует за этим циклом.

Цикл while работает следующим образом. Проверяется значение переменной num. Если оно больше нуля, счетчик mag инкрементируется, а значение num делится на 10. Цикл повторяется до тех пор, пока num больше нуля. Когда num станет равным нулю, цикл завершится, а переменная mag будет содержать порядок исходного числа. Подобно циклу for, условное выражение проверяется при входе в цикл while, a это значит, что тело цикла может не выполниться ни разу. Это свойство цикла (иллюстрируемое следующей программой) устраняет необходимость отдельного тестирования до начала цикла:

// Вычисление целых степеней числа 2.

using System;

class Power {

public static void Main() {

int e;

int result;

for(int i=0; i < 10;

result = 1;

e = i;

while(e > 0) {

result *= 2;

e—;

Console.WriteLine("2 в степени " + i +

" равно " + result);

Третьим циклом в С# является цикл do-while. В отличие от циклов for и while,в которых условие проверяется при входе, цикл do-while проверяет условие при выходе из цикла. Это значит, что цикл do-while всегда выполняется хотя бы один раз. Его общий формат имеет такой вид:

do { инструкции; } while {условие);

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

using System;

class DoWhileDemo {

public static void Main() {

int num;

int nextdigit;

num = 198;

Console.WriteLine("Число: " + num);

Console.Write("Число с обратным порядком цифр: ");

do {nextdigit = num % 10;

Console.Write(nextdigit);

num = num / 10;

} while(num > 0);Console.WriteLine();}}}

И еще одна циклическая конструкция foreach. Цикл foreach предназначен для опроса элементов коллекции. Коллекция — это группа объектов. В С# определено несколько типов коллекций, среди которых можно выделить массив. Формат записи цикла foreach имеет такой вид:

foreach (тип имя__переменной in коллекция) инструкция;

Здесь элементы типи имя_переменнойзадают тип и имя итерационнойпеременной, которая при функционировании циклаfоreachбудет получать значения элементов из коллекции.Элемент коллекция служит для указания опрашиваемой коллекции (в данном случае в качестве коллекции мы рассматриваем массив). Таким образом, элемент тип должен совпадать (или быть совместимым) с базовым типом массива. Здесь важно запомнить, что итерационную переменную применительно к массиву можно использовать только для чтения. Следовательно, невозможно изменить содержимое массива, присвоив итерационной переменной новое значение.

Рассмотрим простойпример использования цикла foreach. Приведенная ниже программа создает массив для хранения целых чисел и присваивает его элементам начальные значения. Затем она отображает элементы массива, попутно вычисляя их сумму [10, 12, 13, 14].

// Использование цикла foreach.

using System;

class ForeachDemo {

public static void Main() {

int sum = 0;int[] nums = new int[10];

// Присваиваем элементам массива nums значения,

for(int i = 0; i < 10; i++){ nums[i] - i;

// Используем цикл foreach для отображения значений

// элементов массива и их суммирования,

foreach(int x in nums) {

Console.WriteLine("Значение элемента равно: " + х);

sum += х;}

Console.WriteLine("Сумма равна: " + sum);}}}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: