|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Процедури
На відміну від
функцій, процедури не повертають
конкретних значень. Виклик
процедур здійснюється по імені.
Непорожні списки аргументів завжди
полягають в круглі дужки. У
приведеному нижче прикладі рядок з
викликом процедури виділена жирним
шрифтом: Option
Strict On Module
Modulel Sub
Showbottlesofbeer(Byval nbot As Integer) Console.WriteLine(nbot
& " bottles of beer on the wall") Console.Writeline(nbot
& " bottles of beer.") Console.WriteLine("if
one of those bottles hsould happen to fall") Console.WriteLine(nbot -1&" bottles of beer on the wall") End Sub Sub Main() Dim I As
Integer For I = 10 To 1 Step -1 Showbottlesofbeer(I) Next Console.WriteLine("All
beer gone...") Console. Readline() End Sub End Module При виклику
процедур указувати ключове слово
Sub не обов'язково. Рядок з викликом
процедури з приведеного вище
прикладу можна було записати і у
такому вигляді: Call
Showbottlesofbeer(I)
Заголовок процедури повинен
містити оголошення всіх параметрів
з ключовими словами Byval або Byref
(за умовчанням використовується Byval, тобто
передача за значенням): Sub імя_процедури(У(Byvа1
аргумент1 As тип. Byval аргумент2 As тип
....) команди End Sub При виклику процедури
у формі імя_процедури(аргумент1, аргумент2
...) або Call імя_процедури(аргумент1. аргумент2
...) VB .NET створює копії даних-аргументів і
виконує код, що міститься в
тілі процедури (оскільки на відміну
від попередніх версій за умовчанням
параметри передаються за значенням).
Передчасний вихід з функцій або процедур
У деяких
ситуаціях потрібно покинути
функцію до того, як буде
досягнута стандартна точка
виходу (наприклад, якщо перевірка
покаже, що початкові дані
невірні і подальші обчислення
безглузді). Команда Return
негайно передає управління
зухвалій стороні (якщо не
визначена секція Finally — див. розділ 7): Function Ballout (X
As Double) As Double If X < 0 Then Return
0' Повернути фіктивне значення Else ' Основні дії End If End
Function 'Вихід з процедур здійснюється командою Exit Sub.
Передача масивів функціям і процедурам
У VB .NET, як і
в колишніх версіях VB,
існують зручні засоби для роботи
з одновимірними і
багатовимірними масивами в процедурах і
функціях. Втім, існують
деякі нюанси, обумовлені передачею
по посиланню і за значенням; ми
розглянемо їх в розділі 4. Перебір
вмісту масиву
здійснюється конструкцією For Each або
(поширеніший варіант)
стандартним циклом For з обчисленням
верхньої межі за допомогою функції
Ubound (). Нижче приведений приклад функції
пошуку максимального елементу в
масиві: Function Findmax(Byva1
a() As Integer Dim finish As
Integer = Ubound(a) Dim max
As Integer =
а(0) Dim i As
Integer For i =
0 To finish If а(i)> max
Then max = а(i) Next
i Return max End
Function Узагальнена
форма виклику Ubound(імя_массива, I)
повертає верхню межу по 1-у
вимірюванню масиву. Для одновимірних
масивів (списків) параметр 1
є необов'язковим.
Процедури і функції з необов'язковими аргументами
У VB. NET збережена
можливість визначення процедур і
функцій з необов'язковими
аргументами, але на відміну від Vb6 для
кожного необов'язкового параметра
має бути вказане значення за
умовчанням. Наступний приклад
демонструє синтаксис
оголошення необов'язкових
параметрів: Sub Processaddress(Thename
As String Address As String. City As String. State As String. Zipcode As String.
Optional Zipplus4 As String = "0000") У даному
прикладі останній параметр
є необов'язковим (Optional) і за
умовчанням рівний "0000".
VB .NET
також дозволяє визначати процедури
і функції з довільною
кількістю аргументів. Для цього як
параметр передається масив з
ключовим словом Раramаrrау, як в
наступному прикладі: Function Addthemup(Byval
Paramarray stuff() As Double) As Double Dim
total As Double = 0 Dim
Number As Double = 0 Dim I As
Integer For I = 0 To Ubound(stuff) total = total +
stuff(I) Next Return
total End Function Приклад
використання функції: x = Addthemup(3, 4.
5. 6) В результаті
змінною х привласнюється
значення 18.
При виклику
функцій і процедур з великою
кількістю параметрів (особливо
необов'язкових) існує така
елегантна можливість, як
передача іменованих аргументів. Якщо
значення параметрів при виклику
передаються у вигляді «ім'я -:=значение»,
вам не доведеться турбуватися про
дотримання порядку аргументів (регістр
символів в іменах ігнорується). На
відміну від колишніх версій VB, де
іменовані аргументи то працювали,
то немає, в VB .NET вони працюють завжди. Іменовані
аргументи розділяються комами.
При розумному виборі імен
параметрів іменовані аргументи
помітно спрощують читання програми,
особливо при великій кількості
необов'язкових аргументів. Для
прикладу візьмемо приведений вище
заголовок функції Processaddress: Sub Processaddress(Thename
As String. Address As String. City As String. State As String Zipcode As String,
Optional Zipplus4 As String = "0000") Виклик цієї
процедури може виглядати так: Processaddress(Address
:= "The Whitehouse" Name := "GEORGEW" City := "DC".
_ State:= String.Empty.
_ Zipcode:= "12345") Звернете
увагу: порядок перерахування
аргументів відрізняється від заданого
в заголовку процедури.
У VB .NET, як і в
будь-якій скільки-небудь серйозній
мові програмування,
підтримується рекурсія — вирішення
завдань за допомогою зведення їх
до простіших завдань того ж типу.
Одним із стандартних прикладів
рекурсивного рішення є
перебір дерева каталогів на диску (див.
розділ 9). На
концептуальному рівні рекурсивне
рішення виглядає таким чином: Рішення
задачі із застосуванням рекурсії If
завдання тривіальне Вирішити
Else Спростити завдання, зводячи її до однотипної, але простішої
завданню Вирішити простішу задачу із застосуванням рекурсії End
If (Можливо)
Об'єднати вирішення простої завдання (або
завдань) з рішенням
початкової задачі. Рекурсивна функція або
процедура постійно викликає сама
себе, безперервно спрощуючи завдання
до тих пір, поки її рішення не
стане тривіальним; у цей момент
завдання вирішується, і відбувається повернення
до попереднього рівня. Застосування
рекурсії нерідко пов'язане
з принциповою зміною підходу
до деяких завдань, що
породжують особливо елегантні
рішення і такі ж елегантні
програми (до речі,
багато алгоритмів сортування —
такі, як вбудований метод Sort
класу .NET Array, — засновані на
принципі рекурсії).
Як приклад ми розглянемо
програму пошуку найбільшого загального
дільника двох цілих чисел (тобто
найбільшого цілого числа, на
яке вони обидва діляться без залишку).
Приклад:
Пригадаємо, що
функція Mod повертає залишок від
цілочисельного ділення, а
вираз а Mod b,равно 0 лише в тому
випадку, якщо а кратно b. Приклад: НОД(126.12)=НОД
(12. 126 Mod 12)=НОД (12,6) - 6 Нижче
приведений приклад рекурсивної функції
для обчислення НОД. У
рядку, виділеному жирним шрифтом,
функція GCD викликає сама себе для
простішого випадку: Option
Strict On Module Modulel Function GCD(Byval p As Long, Byval q As Long) As Long If Q Mod
P = 0 Then Return P
Else Return GCD(Q, P Mod Q) End
If End Function Public
Sub Main() Console.WriteLine("The GCD of 36 and 99 is " & GCD(36. 99)) Console. Readline() End Sub End Module Спочатку
обробляється тривіальний випадок Q Mod P = 0 . Якщо
ця умова не виконується, функція
GCD знову викликає себе для
простішого випадку, оскільки в
результаті застосування Mod ми
переходимо до менших чисел. У
приведеному прикладі об'єднувати
результати не потрібно (як, наприклад,
у функції сортування).
Модная одежда лето свадебное платье сонник anabel.org.ua. |
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||