Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная_работа_2-1(2_семестр)0

.pdf
Скачиваний:
8
Добавлен:
25.03.2016
Размер:
615.04 Кб
Скачать

Лабораторная работа № 2-1

Процедуры и функции.

Цель работы: научиться использовать процедуры и функции для решения задач

Теоретические сведения

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

В этой лабораторной работе рассмотрим два типа процедур, которые можно создать в VВ.NET: процедуры Sub и функции Function.

Visual Basic всегда поставлялся с набором встроенных функций. которые выполняют простые и сложные задачи. Так как они не обязательно являются "процедурами", эти встроенные функции будем использовать в создаваемых процедурах для облегчения программирования, которое в противном случае пришлось бы выполнять самостоятельно. Очень важно отметить, что эти функции приспосабливались к разработчикам, которые ранее использовали Visual Basic. Среда .NET предоставляет те же возможности, что и встроенные функции в Visual Basic, посредством базовых библиотек классов, и новые разработчики должны использовать только пространства имен System при разработке приложений и не полаrаться на уровень совместимости, предоставляемый для существующих функций Visual Basic.

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

Модификаторы доступа к процедурам

Процедура создается в классе или модуле. Всегда можно вызвать процедуру из класса или модуля, в котором она создана. Однако возможность вызова процедуры из другого класса или модуля зависит от модификаторов доступа, которые использованы при создании процедуры. Модификаторы доступа определяют область, из которой может быть вызвана конкретная процедура. Ниже приведен список допустимых модификаторов доступа для процедур Sub и Function:

zPublic - процедура может вызываться из любого :класса и модуля в приложении;

zPrivate - процедура может быть вызвана только из того класса или модуля, в котором она объявлена;

zShared - процедура, которая не ассоциируется с конкретным объектом :класса;

zProtected - процедура, которая может вызываться из класса или модуля, в которой она описана, или из управляемых :классов;

zFriend - процедура, которая может вызываться из любого модуля или класса в приложении, которое содержит ее определение;

zProtected Friend - процедура, которая имеет доступы Protected и Friend.

Процедура Sub

Процедуру Sub можно создавать в модулях и :классах. Уровнем доступа по умолчанию для процедуры Sub является Public, что означает, что вызвать эту процедуру можно из любого места приложения. Это прямо противоположно предыдущим версиям Visual Basic, где по умолчанию уровень доступа определился как Private. Синтаксис создания процедуры Sub следующий:

[ <attrlist> ] [{Overloads | Overrides | Overridable | NotOverridable | MustOverride | Shadows | Shared }] [{Public | Protected | Private | Friend | Protected Friend }]

Sub <ProcedureName> ([ArgumentList]) [statements]

[Exit Sub] [statements] End Sub

где

zOverloads означает, что существуют другие процедуры в этом классе с тем же именем, но другими аргументами;

zOverrides означает, что данная процедура "замещает" процедуру с таким же именем из базового класса;

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

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

zMustOverride означает, что данная процедура не реализована в классе и должна быть реализована в управляемом классе из :класса, в котором создана.

z[Public | Protected | Friend | Protected Friend | Private] Private] представляют собой модификатор доступа для процедуры Sub. Если не определен явно ни один из модификаторов, по умолчанию устанавливается тип доступа Public;

zSub означает, что данная процедура — процедура типа Sub;

z<ProcedureName> - имя процедуры;

z([ArgumentList]) - список аргументов, который передается в процедуру. Если процедура Sub не имеет аргументов, оператор Sub должен содержать пустую пару скобок.

zExit Sub непосредственно завершает выполнение функции. В процедуре может существовать несколько операторов Exit Sub;

zEnd Sub обозначает конец процедуры Sub.

Для усвоения использования приведенного синтаксиса рассмотрим следующую

процедуру, Sub CalculateDiscount, которая принимает количество и цену за единицу и вычисляет скидку при покупке.

Public Sub CalculateDiscount (dblQuantity as Double, dblPrice as Double) Dim dblAmount as Double

Dim dblDiscount as Double DblAmount= dblQuantity * dblPrice

If dblAmount>=150 AND dblAmount<250 Then DblDiscount=0.l

Elself dblAmount>=250 Then DblDiscount=0.15

End if Console.WriteLine(dblDiscount) End Sub

После создания процедуры Sub ее можно вызвать при помощи оператора вызова. Синтаксис вызова процедуры Sub следующий:

[Саll] <ProcedureName> ([ArgementsList])

Ключевое слово call может использоваться для вызова программы в теле процедуры Sub. Однако использование этого ключевого слова не является обязательным. Например, чтобы вызвать процедуру CalculateDiscount, которая только что была создана, можно использовать любой из двух следующих операторов:

Call CalculateDiscount(20,10.5) CalculateDiscount(20, 10.5)

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

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

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

Типом по умолчанию для аргументов процедуры является Object. Однако можно определить и дргуие типы данных при помощи использования As:

VarNarne Аs datatype

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

Для того, чтобы понять разницу между механизмами ByVal и ByRef передачи параметров, рассмотрим следующий пример. В нем процедура SwapByVa1 принимает два целочисленных параметра, которые передаются по значению. Эта процедура меняет местами переданные значения. Другая процедура, названная SwapByRef, также принимает два целочисленных параметра, которые меняются местами. Однако эти параметры уже передаются по ссылке. Затем эти две процедуры вызываются по событию Click командной кнопки. В обработчик этого события передаются два значения, введенные пользователем. Эти два числа передаются в процедуру SwapByVal. Так как эти числа передаются по

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

Процедура Sub, которая выполняется первой после запуска программы Visual Basic, это процедура Main. Ее синтаксис следующий:

Процедура Sub Main является стартовой точкой каждого приложения. Каждое приложение Visual Basic .NET должно иметь процедуру Sub Main. В эту процедуру можно включить любой код инициализации, например, соединение с базой данных или аутентификация пользователя.

Процедуры – функции

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

[ <attrlist> ] [{Overloads | Overrides | Overridable | NotOverridable | MustOverride | Shadows | Shared }] [{Public | Protected | Private | Friend | Protected Friend }]

Function <FunctionName> ([ArgumentList])[As <type>] [statements]

[Exit Function] [statements] End Function

где

zOverloads означает, что существуют другие процедуры в этом классе с тем же именем, но другими аргументами;

zOverrides означает, что данная процедура "замещает" процедуру с таким же именем из базового класса;

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

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

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

z[Public | Protected | Friend | Protected Friend | Private] Private] представляют собой модификатор доступа для процедуры Sub. Если не определен явно ни один из модификаторов, по умолчанию устанавливается тип доступа Public;

zFunction означает, что данная процедура — процедура типа Function;

z<FunctionName> - имя процедуры;

z([ArgumentList]) - список аргументов, который передается в процедуру. Если процедура Sub не имеет аргументов, оператор Sub должен содержать пустую пару скобок.

z[As <type>] – указывает тип данных возвращаемого значения процедуры Fuction;

zExit Function непосредственно завершает выполнение функции. В процедуре может существовать несколько операторов Exit Function;

zEnd Function обозначает конец процедуры Function.

Для примера создадим функцию с именем CalculateDiscount, которая возвращает

вычисленное значение. Если тип вычисленной скидки имеет тип Double, то следует описать эту функцию следующим образом:

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

CalculateDiscount:

Оператор, который возвращает значение, может появляться в тексте процедуры любое количество раз. Если процедура Function не имеет операторов, которые возвращают значения, процедура возвращает значение по умолчанию. Например, если процедура возвращает числовое значение, будет возвращен ноль. Ecли процедура возвращает строковое значение, возвращаемое значение будет строкой нулевой длины ("").

Полный текст процедуры Function CalculateDiscount приведен ниже:

Для вызова функции мы создаем переменную, которой присваивается возвращаемое из функции значение, как показано в следующей конструкции:

ReturnValue= <FunctionNarne> ([ArgumentsList])

Для вызова функции CalculateDiscount можно использовать следующий фрагмент программы:

Функцию также можно вызвать в выражении. Например, представим себе, что возвращаемое функцией CalculateDiscount сравнивается с некоторым заданным значением:

Практическое задание:

1. Выполните приведенные ниже задания.

Задание1

Написать функцию, возводящую 2 в степень, значение которой передается из основной программы с вызовом функции.

Решение Нарисуем на форме объект Label1, в который будем выводить результат расчета. Запишем основную процедуру Form1_Load() и функцию Function G() с указанием имени и типа параметра функции и типа возвращаемого значения. В основной процедуре запишем вызов функции с фактическим значением параметра

G(3).

Вызов запишем в строчке вывода результата Label1.Text = G(3).

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Label1.Text = G(3)

End Sub

Function G(ByVal i As Integer) As Integer Dim t As Single

t = 2 ^ i Return t

End Function

Работа

с

процедурой Sub() аналогична

за исключением

необходимости

указывать

тип

возвращаемого значения, так как

процедура Sub() не возвращает

результата

своей работы. Однако можно сделать так, чтобы результат

все-таки можно

было получить в основной программе.

Переделаем предыдущий пример. Вместо функции создадим процедуру Sub().

Кроме того, объявим переменную

t в области описания для того, чтобы она имела

модульную область видимости (об области видимости см. выше).

Результат работы процедуры

Sub() выведен на форму с помощью объекта

Label1.

 

Dim t As Single

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

G(3) Label1.Text = t

End Sub

Sub G(ByVal i As Integer)

t = 2 ^ i

End Sub

Использование фактических параметров по ссылке: ByRef

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim t As Single G(3, t) Label1.Text = t

End Sub

Sub G(ByVal i As Integer, ByRef t As Integer)

t = 2 ^ i

End Sub

End Class

Задание2 Вычислить бином Ньютона

п

Сk

ап хпk

 

(а + х)п =

, где Спк =

k =0

п

 

 

а) с использованием функции

....

Dim N as Double, K as double Dim Cnk as Double

Ввод N, k Cnk=fact(n)/ fact(k)/ fact(n-k)

вывод n,k, Cnk

Function Fact (ByVal N As Double) AS Double

Dim k as Double

Dim FD as Double FD=1

IF N>1 THEN

FOR k=1 to N FD=FD*k

NEXT k

END IF

Return FD End Function

б) с использованием процедуры

п!

к!(пк)!

Imports System.Math

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

Dim N As Double, K As Double

Dim Cnk As Double

Dim fn As Double, fk As Double, fnk As Double

N = InputBox("n")

K = InputBox("k<=n")

ListBox1.Items.Add(N) : ListBox1.Items.Add(K)

Fact(fn, N)

ListBox1.Items.Add(fn)

Fact(fk, K)

ListBox1.Items.Add(fk)

Fact(fnk, N - K)

ListBox1.Items.Add(fnk)

Cnk = fn / fk / fnk

REM Вывод(N, K, Cnk)

ListBox1.Items.Add(N) : ListBox1.Items.Add(K)

ListBox1.Items.Add(Cnk)

End Sub

Sub Fact(ByRef fn As Double, ByVal N As Double) Dim k As Double

ListBox1.Items.Add(fn) fn = 1

If N > 1 Then For k = 1 To N

fn = fn * k Next k

End If ListBox1.Items.Add(fn)

End Sub

End Class

Задание 3

Создать функцию для пересчета градусов Цельсия в градусы Фаренгейта Решение Расположим на форме следующие объекты: текстовое поле TextBox1 и

командную кнопку Button1.

В процедуре Form1_Load() предусмотрим первоначальную очистку текстового поля (TextBox1.Text = "") и переименование кнопки на “Пересчет”.

Объявим функцию ЦельсийФаренгейт (напишите ее латинскими буквами!!!) с

аргументом Цельсий действительного типа. Переменной Цельсий

из процедуры

Button1_Click() будет передано некоторое числовое значение,

которое

используется

в формуле для расчета. Ниже приведены два возможных типа

организации возврата

результата пересчета градусов.

 

 

Public Function ЦельсийФаренгейт(ByVal Цельсий As Single) As Single Return (Цельсий * (9 / 5) + 32)

End Function

Public Function ЦельсийФаренгейт(ByVal Цельсий As Single) As Single

ЦельсийФаренгейт = (Цельсий * (9 / 5) + 32)

End Function

 

 

В процедуре Button1_Click() объявим

переменную Фаренгейт и присвоим ей

имя функции, где в качестве

аргумента

укажем преобразованное (функция CSng)

значение

текстового поля

TextBox1.

Так осуществляется вызов функции

ЦельсийФаренгейт() с передачей ей фактического значения аргумента Цельсий.

Фаренгейт = ЦельсийФаренгейт(CSng(TextBox1.Text))

В результате вызова в функцию будет передано фактическое значение переменной Цельсий (содержимое текстового поля, преобразованное в действительный тип данных CSng(TextBox1.Text ))., будет произведен пересчет, результат будет возвращен в процедуру Button1_Click(), присвоен переменной Фаренгейт, преобразованное (в строковый тип функцией CStr) значение которой будет выведено в текстовое поле TextBox1. Ниже приведен полный текст программы.

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

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

TextBox1.Text = "" Button1.Text = "Пересчет"

End Sub

Public Function ЦельсийФаренгейт(ByVal Цельсий As Single) As Single

ЦельсийФаренгейт = (Цельсий * (9 / 5) + 32) End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Фаренгейт As Single

Фаренгейт = ЦельсийФаренгейт(CSng(TextBox1.Text)) TextBox1.Text = CStr(Фаренгейт)

End Sub

Задание 4

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

Решение Расположив на форме объект TextBox1, объявим в окне редактора кода общую процедуру с именем Надпись (напишите ее латинскими буквами!!!).

Public Sub Надпись()

Код процедуры

End Sub