Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обзорки Информатика.doc
Скачиваний:
17
Добавлен:
27.10.2018
Размер:
2.87 Mб
Скачать

9.Операторы организации циклов в языках программирования.

Turbo Pascal

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

repeat

<Инструкция1>;

<Инструкция2>;

. . .

<ИнструкцияN>;

until <Условие>

Оператор цикла while организует выполнение одного (в том числе и составного) оператора неизвестное заранее число раз. Выход из цикла осуществляется, если некоторое логическое выражение окажется ложным. Так как истинность этого выражения проверяется в начале каждой итерации, тело цикла может не выполнятся ни разу. Структура этого цикла имеет вид:

while <Условие> do

<Инструкция>;

Оператор цикла for организует выполнение одного оператора (в т.ч. и составного) заранее известное число раз. Существует два варианта этого оператора:

for <Параметр>:=<Нач_значение> to <Кон_значение> do

<Инструкция>;

и

for <Параметр>:=<Нач_значение> downto <Кон_значение> do

<Инструкция>;

Параметр – число целое.

Цикл действует следующим образом. Первоначально вычисляются и запоминаются начальное и конечное значение параметра цикла. Затем значение параметра сравнивается с конечным значением. Далее, пока значение параметра меньше или равно конечному значению (в первом варианте оператора) или больше или равен конечному значению (во втором варианте), выполняется очередная итерация цикла, после чего значение параметра увеличивается (в первом варианте) или уменьшается (во втором) на единицу. Следующий пример иллюстрирует использование циклов:

for i:=1 to 10 do

WriteLn ('Эта строка будет напечатана 10 раз');

for i:=1 to 10 do begin

for j:=1 to 10 do begin

WriteLn ('А эта - 100 раз');

end

end

Visual Basic

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

Оператор ForNext

Конструкция ForNext использует счетчик цикла, её синтаксис выглядит следующим образом:

For Счётчик = Начальное значение To Конечное значение [Step шаг]

Операторы

Next [Счётчик]

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

Пример 1:

For Count = 1 To Number_of_members

Print Letter ()

Next Count

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

For Count = 0 To 10 Step 2

Print Count

Next Count

В примере в окне сообщений будут появляться значения 0,2,4,6,8,10. Процесс заканчивается, когда значение Count превысит конечное значение (в данном случае 10). Значение шага может быть также отрицательным, в этом случае текущее значение счётчика в конце каждого цикла будет уменьшаться.

Пример 2:

(General) (Declaration)

Dim aArray (1997 To 2050)

Private Sub Command_Click()

For I = Lbound(aArray) To Ubound(aArray)

Print aArray (I)

Next I

End Sub

В этом примере выводится всё содержимое массива. Для безусловного вывода из цикла используется оператор Exit For

Пример 3:

For Count = 1 To Number_of_members

Error = Print Letter ()

If Error = true Then

Exit For

End If

Next Count

Оператор Do While

Конструкция DoLoop позволяет выполнять блок кода, пока удовлетворяется некоторое условие. В зависимости от позиции условия различают два варианта цикла DoLoop.

Цикл, управляемый в начале

Do [{While / Until} Условие]

[Операторы]

[Exit Do]

[Операторы]

Loop

Цикл, управляемый в конце

Do

[Операторы]

[Exit Do]

[Операторы]

Loop [{While / Until} Условие]

Если условие проверяется в начале цикла, то он никогда не выполняется в случае невыполнения условия. Если же проверка происходит в конце, цикл выполняется как минимум один раз, независимо от того. выполнено условие или нет. Тело цикла выполняется неопределённое число раз, пока условие не вызовет выход из цикла:

Пример 1

Do Until EOF ()

Input # 1, SomeDate

Loop

Пример 2

Do

X = X + 1

Print "Hello"

Loop While X < 9

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

Оператор WhileWend

Цикл WhileWend функционально аналогичен форме Do WhileLoop оператора цикла DoLoop и похожа по синтаксису на конструкцию циклов While в других языках программирования. Для цикла WhileWend не может применяться оператор досрочного выхода Exit Do. Данный оператор цикла используется только для совместимости с другими диалектами Basic, а также для совместимости с более ранними версиями Visual Basic, в которых не было оператора DoLoop.

Пример: Count = 0

While Count < Number_of_members

Print Letter ()

Count = Count + 1

Wend

Оператор безусловного перехода GOTO Metka применять не рекомендуется.

10.Процедуры в языках программирования. Способы передачи параметров в процедуры.

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

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

Процедура

Подпрограмма-процедура предназначена для выполнения какой-то законченной последовательности действий. Структура любой процедуры такова:

Procedure Имя (Список формальных параметров);

label

const Описание локальных меток,

type констант, типов и переменных

var

procedure Описание внутренних процедур

function и функций

begin

Операторы

end;

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

procedure MyProc (i : Integer; s : String);

<Тело_процедуры>;

то вызывать её следует так:

MyProc (5, 'SomeString');

Visual Basic

Процедуры

Синтаксически процедура определяется

[Private | Public] [Static] Sub имя процедуры (список аргументов)

[Exit Sub] [операторы]

End Sub

где Private, Public, Static, Sub, Exit Sub, End Sub - ключевые слова. Sub определяет обязательный первый оператор процедуры. End Sub - обязательный последний оператор процедуры;

имя процедуры образуется в соответствии с общими правилами образования имен, но не может иметь описателей типа (имя процедуры не принимает значения);

список аргументов имеет следующий синтаксис:

[Optional] [ByVal | ByRef] [ParamArray] имя [As тип] где Optional, ByVal, ByRef, ParamArray и As ключевые слова;

имя — имя переменной, массива (в случае массива используется имя ( ) без указания границ значения индексов, что позволяет использовать одну процедуру для разного числа элементов массива в каждом конкретном случае), элемента управления или формы (в последних двух случаях тип принимает значения Control и Form).

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины). Variant, пользовательский тип или Control и Form. As тип необходимо применять для каждого аргумента.

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

Процедура не может быть определена внутри какой-либо процедуры или функции.

Пример процедуры вычисления площади прямоугольника по заданным значениям сторон:

Sub SubDemo (RLen, Rwid) ' 'заголовок процедуры

‘SubDemo с двумя аргументами-

‘R1en-длина и Rwid-ширина

Dim Area 'объявление локальной переменной Area = RLen * Rwid ' расчет площади MsgBox “Площадь равна” & Area “печать результата End-Sub

Exit Sub вызывает прекращение выполнения процедуры и выход из нее в вызывающую программу.

Static определяет, что локальные данные (переменные, массивы), определенные внутри процедуры (переменная Area в примере), сохраняются в промежутках между вызовами данной процедуры. Определение Static не распространяется на данные, которые объявлены вне данной процедуры, но используются в ней (т.е. эти данные будут изменяться независимо от определения Static). Нельзя использовать при рекурсивном вызове процедуры.

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

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

Поскольку имя процедуры определяется (глобально распознается) в рамках всех процедур всех модулей одной программы, имя процедуры не должно совпадать с другими глобально распознаваемыми именами программы. Такими глобально распознаваемыми именами являются имена других процедур Visual Basic или процедур динамически подключаемых библиотек (dynamic-link library [DLL|) и данных, объявленных как Global (см. выше).

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

Optional определяет, что аргумент не является обязательным. При его использовании все последующие аргументы в списке аргументов также являются необязательными и для них также необходимо использовать данное ключевое слово. Аргументы, объявленные Optional, должны иметь тип Variant. He может использоваться для аргумента, для которого задан параметр ParamArray.

ByVal определяет, что аргумент передается в процедуру по значению.

ByRef определяет, что аргумент передается в процедуру по ссылке.

ParamArray относится к последнему аргументу в списке аргументов и определяет, что конечный (заключительный) аргумент является необязательным массивом. Не может использоваться совместно с параметрами ByVal, ByRef, Optional.

Синтаксис оператора обращения к процедуре следующий:

имя процедуры [список значений] или

Call имя процедуры [список значений]

где Call — ключевое слово;

список значений список значений аргументов (соответствует списку аргументов в операторе Sub no количеству, порядку следования и типу, кроме случая когда используется параметр Optional).

Пример программы.

Поместим рассмотренную выше процедуру формирования вектора из сумм элементов столбцов матрицы в раздел general формы:

Option Explicit

Sub SubMatrVektor (A() As Single, B() As Single, MaxI As Integer, MaxJ As Integer)

Dim J, I As Integer

For J = 1 To MaxJ

A(J) = 0

For I = 1 To MaxI

A(J) = A(J) + B(I, J)

Next I

Next J

End Sub

Private Sub Form_Ciick()

Static X(1 To 2, 1 To 3) As Single, Y(1 To 3) As Single

X(1, 1) = 1

X(1, 2) = 2

Х(1, 3) = 3

X(2, i) = 4

Х(2, 2} = 5

Х(2, 3) = 6

SubMatrVektor Y(), X(), 2, 3

Print Y(li, Y(2), Y(3) End Sub

Результат выводится на форму.

Передача аргументов по ссылке и по значению

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

В Visual Basic передача по ссылке определена по умолчанию.

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

В Turbo Pascal и Visual Basic .NET передача по значению определена по умолчанию.

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

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

11.Процедуры и функции в языках программирования. Способы передачи параметров в процедуры и функции.

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

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

Описание функции имеет следующую структуру.

Function Имя (Список формальных параметров) : Тип результата;

label

const Описание локальных меток,

type констант, типов и переменных

var

procedure Описание внутренних процедур

function и функций

begin

Операторы, среди которых хотя бы один, который

присваивает имени функции значение результата

end.

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

function MyFun (i : Integer; s : String) : integer;

<Тело_функции>;

то вызывать её следует так:

S:=MyFun (5, 'SomeString');

Visual Basic

Синтаксически функция определяется

[Public | Private] [Static] Function имя функции (список аргументов) [As тип]

[операторы объявления]

[операторы]

[имя функции = выражение]

[Exit Function] End Function

где Public, Static, Private, Function , Exit Function , End Function — ключевые слова. Function определяет обязательный первый оператор функции. End Function — обязательный последний оператор функции:

имя функции образуется в соответствии с общими правилами образования имен и может иметь описатель типа (As тип в конце первой строки относится к имени функции). Имя функции принимает значение и хотя бы один оператор

имя функции = выражение

может присутствовать внутри функции и выполняться при выходе из нее. Если никакое значение не присвоено имени функции, то имя функции принимает значение по умолчанию: числовая функция принимает значение 0, функция, объявленная как String, принимает значение пустой строки нулевой длины (“”), функция, объявленная как Variant принимает значение Empty (значение, которое принимает имя функции, называют возвращаемым значением функции — возвращаемое значение).

Список аргументов имеет следующий синтаксис:

[Optional] [ByVal|ByRef][ParamArray] имя [( )][As тип]

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

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины). Variant, пользовательский тип или Control и Form. As тип необходимо применять для каждого аргумента.

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

Exit Function вызывает прекращение выполнения функции ц выход из нее в вызывающую программу.

Функция не может быть определена внутри какой-либо процедуры или функции.

Пример функции вычисления площади прямоугольника по заданным значениям сторон:

Function FunDemo (RLen, Rwid) As Single

'заголовок функции FunDemo с “двумя аргументами- Rlen-длина и Rwid-ширина

“тип имени функции определен как Single Dim Area ' объявление локальной

'переменной Area = RLen * Rwid ' расчет площади MsgBox “Площадь равна” & Area ' печать

'результата. FunDemo = Area 'имени функции

'присваивается вычисленное значение End Function

Используемые ключевые слова аналогичны рассмотренным выше для процедур.

Передача аргументов по ссылке и по значению

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

В Visual Basic передача по ссылке определена по умолчанию.

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

В Turbo Pascal и Visual Basic .NET передача по значению определена по умолчанию.

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

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