10-bo‘lim
Sub va Function
Sub va Function farqi, Return, ByVal va ByRef, Optional parametrlar, ParamArray, bir nomdagi bir necha versiya va rekursiya.
Ushbu bo‘lim mundarijasi
Protsedura - nomlangan kod bo'lagi. Uni bir marta yozib, xohlagancha chaqirasiz. Visual Basic da ikki turi bor.
Sub - qiymat qaytarmaydi #
Module Dastur
Sub Salomlash(ism As String)
Console.WriteLine($"Assalomu alaykum, {ism}!")
End Sub
Sub Main()
Salomlash("Malika")
Salomlash("Husanboy")
End Sub
End Module
Assalomu alaykum, Malika!
Assalomu alaykum, Husanboy!
Function - qiymat qaytaradi #
Module Dastur
Function Yigindi(a As Integer, b As Integer) As Integer
Return a + b
End Function
Function Yuza(uzunlik As Double, kenglik As Double) As Double
Return uzunlik * kenglik
End Function
Sub Main()
Console.WriteLine(Yigindi(15, 27))
Console.WriteLine(Yuza(3.5, 2))
End Sub
End Module
42
7
Shakli: Function Nom(parametrlar) As QaytariladiganTur.
Sub | Function | |
|---|---|---|
| Qiymat qaytaradi | Yo'q | Ha |
| Turi ko'rsatiladi | Yo'q | As Tur |
| Chaqirish | Salomlash("x") | Dim n = Yigindi(1, 2) |
Eski uslub: nomga qiymat berish #
Module Dastur
Function Kvadrat(son As Integer) As Integer
Kvadrat = son * son
End Function
Sub Main()
Console.WriteLine(Kvadrat(7))
End Sub
End Module
49
Bu ishlaydi - VB da funksiya nomiga qiymat berish uni qaytaradi.
Yuqoridagi shakl VB6 davridan qolgan va bugun ham qo'llab-quvvatlanadi. Lekin undan voz keching:
Returndarhol funksiyadan chiqadi, nomga qiymat berish esa chiqmaydi - kod davom etadi.- Nomga qiymat berishni unutsangiz, funksiya standart qiymat
(
0yokiNothing) qaytaradi va kompilyator ogohlantirish beradi, xato emas.
Return aniqroq va boshqa tillar bilan bir xil.
ByVal va ByRef #
Module Dastur
Sub Oshir(ByVal son As Integer)
son += 100
End Sub
Sub OshirHaqiqiy(ByRef son As Integer)
son += 100
End Sub
Sub Main()
Dim a As Integer = 5
Oshir(a)
Console.WriteLine(a)
Dim b As Integer = 5
OshirHaqiqiy(b)
Console.WriteLine(b)
End Sub
End Module
5
105
ByVal - qiymatning nusxasi uzatiladi, asl o'zgaruvchi
o'zgarmaydi. ByRef - o'zgaruvchining o'zi uzatiladi.
Parametrga hech narsa yozmasangiz, u ByVal bo'ladi. Ya'ni bu
ikkalasi bir xil:
Sub Oshir(son As Integer)
Sub Oshir(ByVal son As Integer)
VB6 da esa aksincha edi - standart ByRef bo'lgan. Eski kodni
ko'chirayotgan bo'lsangiz, bu jiddiy farq.
ByRef bir nechta natija qaytarish kerak bo'lganda qulay:
Module Dastur
Sub BolibChiq(jami As Integer, bolovchi As Integer,
ByRef butun As Integer, ByRef qoldiq As Integer)
butun = jami \ bolovchi
qoldiq = jami Mod bolovchi
End Sub
Sub Main()
Dim b As Integer, q As Integer
BolibChiq(47, 6, b, q)
Console.WriteLine($"{b} ta to'la, {q} ta ortdi")
End Sub
End Module
7 ta to'la, 5 ta ortdi
Optional parametrlar #
Module Dastur
Function Salomlash(ism As String,
Optional unvon As String = "hurmatli") As String
Return $"Assalomu alaykum, {unvon} {ism}!"
End Function
Sub Main()
Console.WriteLine(Salomlash("Nodira"))
Console.WriteLine(Salomlash("Karimov", "ustoz"))
End Sub
End Module
Assalomu alaykum, hurmatli Nodira!
Assalomu alaykum, ustoz Karimov!
Optional parametrning standart qiymati bo'lishi shart va ular
ro'yxatning oxirida turishi kerak.
Nom bilan uzatish #
Module Dastur
Function Hisobot(nom As String,
Optional yil As Integer = 2026,
Optional oy As Integer = 1) As String
Return $"{nom}: {yil}-yil {oy}-oy"
End Function
Sub Main()
Console.WriteLine(Hisobot("Savdo"))
Console.WriteLine(Hisobot("Savdo", oy:=9))
Console.WriteLine(Hisobot("Savdo", yil:=2025, oy:=12))
End Sub
End Module
Savdo: 2026-yil 1-oy
Savdo: 2026-yil 9-oy
Savdo: 2025-yil 12-oy
oy:=9 - "faqat shu parametrni ber". O'rtadagilarni o'tkazib
yuborishning yagona yo'li shu.
ParamArray - noma'lum sondagi argument #
Module Dastur
Function Jami(ParamArray sonlar() As Integer) As Integer
Dim natija As Integer = 0
For Each son As Integer In sonlar
natija += son
Next
Return natija
End Function
Sub Main()
Console.WriteLine(Jami(1, 2, 3))
Console.WriteLine(Jami(10, 20, 30, 40, 50))
Console.WriteLine(Jami())
End Sub
End Module
6
150
0
ParamArray faqat oxirgi parametr bo'la oladi va har bir
funksiyada bittadan ortiq bo'lmaydi.
Bir nomda bir necha versiya #
Module Dastur
Function Yuza(tomon As Double) As Double
Return tomon * tomon
End Function
Function Yuza(uzunlik As Double, kenglik As Double) As Double
Return uzunlik * kenglik
End Function
Function Yuza(nom As String, radius As Double) As String
Return $"{nom}: {Math.Round(3.14159 * radius * radius, 2)}"
End Function
Sub Main()
Console.WriteLine(Yuza(5))
Console.WriteLine(Yuza(4, 3))
Console.WriteLine(Yuza("Doira", 2))
End Sub
End Module
25
12
Doira: 12.57
Bir xil nomli, lekin turli parametrli funksiyalar - bu ortiqcha yuklash (overloading). Kompilyator argumentlarga qarab qaysi birini chaqirishni o'zi tanlaydi.
Ikkita funksiya faqat As Integer va As String bilan farq qilsa,
kompilyator xato beradi.
Farq parametrlarda bo'lishi shart: ularning soni yoki turlari.
Rekursiya #
Module Dastur
Function Faktorial(n As Integer) As Long
If n <= 1 Then
Return 1
End If
Return n * Faktorial(n - 1)
End Function
Sub Main()
For i As Integer = 1 To 8
Console.WriteLine($"{i}! = {Faktorial(i)}")
Next
End Sub
End Module
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
Har bir rekursiv funksiyada chiqish yo'li bo'lishi shart -
yuqoridagi If n <= 1 Then Return 1 qismi.
Usiz funksiya o'zini cheksiz chaqiradi va dastur
StackOverflowException bilan to'xtaydi. Bu xatoni Try/Catch
bilan ham ushlab bo'lmaydi.
Yozishni to'xtash shartidan boshlang, keyin rekursiv qismini qo'shing.
Erta chiqish #
Module Dastur
Function Bol(a As Integer, b As Integer) As Double
If b = 0 Then
Console.WriteLine("Nolga bo'lib bo'lmaydi")
Return 0
End If
Return a / b
End Function
Sub Ogohlantir(xabar As String)
If String.IsNullOrWhiteSpace(xabar) Then
Exit Sub
End If
Console.WriteLine($"DIQQAT: {xabar}")
End Sub
Sub Main()
Console.WriteLine(Bol(10, 4))
Console.WriteLine(Bol(10, 0))
Ogohlantir(" ")
Ogohlantir("fayl topilmadi")
End Sub
End Module
2.5
Nolga bo'lib bo'lmaydi
0
DIQQAT: fayl topilmadi
Exit Sub va Exit Function - protseduradan darhol chiqadi.
Return esa Function da qiymat bilan chiqadi.
- Ikkita sonning o'rtachasini qaytaradigan
Functionyozing. - Uchburchak yuzasini hisoblaydigan funksiya yarating.
ByValvaByReffarqini o'z misolingizda ko'rsating.- Ikkita o'zgaruvchining qiymatini
ByRefbilan almashtiring. Optionalparametrli salomlashish funksiyasini yozing.- Nom bilan uzatish (
nom:=qiymat) ni sinab ko'ring. ParamArraybilan o'rtacha hisoblaydigan funksiya yozing.Yuzafunksiyasining uchta versiyasini yarating.- Fibonachchi sonini rekursiya bilan hisoblang.
- Rekursiyada to'xtash shartini olib tashlab, nima bo'lishini kuzating (Ctrl+C bilan to'xtating).
Xulosa #
Subqiymat qaytarmaydi,Functionqaytaradi.Returnishlating - funksiya nomiga qiymat berish eski uslub.- Parametr standart holatda
ByVal; asl o'zgaruvchini o'zgartirish kerak bo'lsaByRef. Optionalparametrlar oxirida turadi va standart qiymatga ega.nom:=qiymat- o'rtadagi parametrlarni o'tkazib yuborish usuli.ParamArray- noma'lum sondagi argument; faqat oxirgi parametr.- Bir nomli funksiyalar parametrlari bilan farqlanishi shart.
- Rekursiyada to'xtash sharti birinchi yoziladi.
Keyingi bo'limda sinflar va obyektlarga o'tamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.