18) Представление основных структур программирования: итерация, ветвление и процедуры в различ языках программирования.

Итерация-это организация обработки данных, при кот. действия повторяются многократно, не приводя при этом к вызовам самих себя.

Когда действие необходимо повторить большое кол-во раз, в программировании useся циклы. Напр-р, нужно вывести 100 раз на экран текст «Hello, World!». Вместо 100-кратного повторения 1и той же команды вывода текста часто создается цикл, кот прокручивается 100 раз, и 100 раз выполняет то, что написано в теле цикла. 1 шаг цикла наз-ся итерацией. Еще 1 пример: Факториал(!) — N! = 1 х 2 х 3 x … x (N-1) x N.

Инструкция (цикл) while useся в том случае, если некотор послед-ть действий надо выполнить неск-ко раз, причем необходимое число повторений во время разработки проги неизвестно и м.б. определено только во время работы проги.

Типичными примерами использования цикла while явл-ся вычисления с заданной точностью, поиск в массиве или в файле.

Инструкция repeat, как и инструкция while, useся в проге в том случае, если необходимо выполнить повторные вычисления, но число повторений во время разработки проги неизвестно и м.б. определено только во время работы проги, т. е. определяется ходом вычислений.

Ветвление

На практике редко встречаются задачи, алгоритм реш-я кот явл-ся линейным. Часто оказывается, что алгоритм реш-я даже элементарной задачи не явл-ся линейным.

Выбор в точке разветвления алгоритма очередного шага проги м.б. реализован при помощи инструкций if и case. Инструкция if позволяет выбрать 1 из 2 возможных вариантов, инструкция case — 1 из неск-ких.


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

Условный оператор с одной ветвью. При выполнении такого оператора вычисляется условие, и если оно истинно, то выполняются команды, заключенные в фигурные скобки, в противном случае выполнение программы продолжается со следующей за условным оператором команды. В языках низкого уровня (ассемблерах) это — единственная доступная форма условного оператора. В некоторых языках для условного оператора с одной ветвью используется специальное ключевое слово (обычно это when). if (<условие>){<операторы>}.

Условный оператор с двумя ветвями. Здесь при истинности условия выполняются команды1 при ложности — команды2. При необходимости проверить последовательно несколько условий возможно каскадирование условных операторов. if (<условие>){<операторы>}else{<операторы>}.

Условный оператор с несколькими условиями.

if (условие1){команды1;}

else if (условие2){команды2;}

...

else {командыN};


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

switch (i)

{

case 0:

case 1: // последовательность операторов

break;

case 2: // последовательность операторов

break;

default:

}

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



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

Процедуры разделяются на стандартные и пользовательские, внеш и внутр отн-но проги.

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

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

Процедуры и функции - методы класса

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

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

Процедура C# имеет свои особенности:

Хорошо известно, что одновременное существование в языке процедур и функций в каком-то смысле избыточно. Добавив еще один выходной аргумент, любую функцию можно записать в виде процедуры. Справедливо и обратное. Если допускать функции с побочным эффектом, то любую процедуру можно записать в виде функции. В языке С - дедушке C# - так и сделали, оставив только функции. Однако значительно удобнее иметь обе формы реализации метода: и процедуры, и функции. Обычно метод предпочитают реализовать в виде функции тогда, когда он имеет один выходной аргумент, рассматриваемый как результат вычисления значения функции. Возможность вызова функций в выражениях также влияет на выбор в пользу реализации метода в виде функции. В других случаях метод реализуют в виде процедуры.

Синтаксически в описании метода различают две части - описание заголовка и описание тела метода:

заголовок_метода

тело_метода

Рассмотрим синтаксис заголовка метода:

[атрибуты][модификаторы]{void| тип_результата_функции}

имя_метода([список_формальных_аргументов])

Имя метода и список формальных аргументов составляют сигнатуру метода. Заметьте, в сигнатуру не входят имена формальных аргументов - здесь важны типы аргументов. В сигнатуру не входит и тип возвращаемого результата.

Квадратные скобки (метасимволы синтаксической формулы) показывают, что атрибуты и модификаторы могут быть опущены при описании метода. Подробное их рассмотрение будет дано в лекциях, посвященных описанию классов. Сейчас же упомяну только об одном из модификаторов - модификаторе доступа. У него четыре возможных значения, из которых пока рассмотрим только два - public и private. Модификатор public показывает, что метод открыт и доступен для вызова клиентами и потомками класса. Модификатор private говорит, что метод предназначен для внутреннего использования в классе и доступен для вызова только в теле методов самого класса. Заметьте, если модификатор доступа опущен, то по умолчанию предполагается, что он имеет значение private и метод является закрытым для клиентов и потомков класса.

Обязательным при описании заголовка является указание типа результата, имени метода и круглых скобок, наличие которых необходимо и в том случае, если сам список формальных аргументов отсутствует. Формально тип результата метода указывается всегда, но значение void однозначно определяет, что метод реализуется процедурой. Тип результата, отличный от void, указывает на функцию. Вот несколько простейших примеров описания методов:

void A() {...};

int B(){...};

public void C(){...};

Методы A и B являются закрытыми, а метод С - открыт. Методы A и С реализованы процедурами, а метод B - функцией, возвращающей целое значение.