10-bo‘lim

Sub va Function

Sub va Function farqi, Return, ByVal va ByRef, Optional parametrlar, ParamArray, bir nomdagi bir necha versiya va rekursiya.

🕑 13 daqiqa o‘qish 📄 530 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Sub - qiymat qaytarmaydi
  2. Function - qiymat qaytaradi
  3. Eski uslub: nomga qiymat berish
  4. ByVal va ByRef
  5. Optional parametrlar
  6. Nom bilan uzatish
  7. ParamArray - noma'lum sondagi argument
  8. Bir nomda bir necha versiya
  9. Rekursiya
  10. Erta chiqish
  11. Xulosa

Protsedura - nomlangan kod bo'lagi. Uni bir marta yozib, xohlagancha chaqirasiz. Visual Basic da ikki turi bor.

Sub - qiymat qaytarmaydi #

VB
Module Dastur
    Sub Salomlash(ism As String)
        Console.WriteLine($"Assalomu alaykum, {ism}!")
    End Sub

    Sub Main()
        Salomlash("Malika")
        Salomlash("Husanboy")
    End Sub
End Module
Natija
Assalomu alaykum, Malika!
Assalomu alaykum, Husanboy!

Function - qiymat qaytaradi #

VB
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
Natija
42
7

Shakli: Function Nom(parametrlar) As QaytariladiganTur.

SubFunction
Qiymat qaytaradiYo'qHa
Turi ko'rsatiladiYo'qAs Tur
ChaqirishSalomlash("x")Dim n = Yigindi(1, 2)

Eski uslub: nomga qiymat berish #

VB
Module Dastur
    Function Kvadrat(son As Integer) As Integer
        Kvadrat = son * son
    End Function

    Sub Main()
        Console.WriteLine(Kvadrat(7))
    End Sub
End Module
Natija
49

Bu ishlaydi - VB da funksiya nomiga qiymat berish uni qaytaradi.

Return ishlating, nomga qiymat bermang

Yuqoridagi shakl VB6 davridan qolgan va bugun ham qo'llab-quvvatlanadi. Lekin undan voz keching:

  • Return darhol funksiyadan chiqadi, nomga qiymat berish esa chiqmaydi - kod davom etadi.
  • Nomga qiymat berishni unutsangiz, funksiya standart qiymat (0 yoki Nothing) qaytaradi va kompilyator ogohlantirish beradi, xato emas.

Return aniqroq va boshqa tillar bilan bir xil.

ByVal va ByRef #

VB
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
Natija
5
105

ByVal - qiymatning nusxasi uzatiladi, asl o'zgaruvchi o'zgarmaydi. ByRef - o'zgaruvchining o'zi uzatiladi.

ByVal standart holat

Parametrga hech narsa yozmasangiz, u ByVal bo'ladi. Ya'ni bu ikkalasi bir xil:

VB
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:

VB
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
Natija
7 ta to'la, 5 ta ortdi

Optional parametrlar #

VB
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
Natija
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 #

VB
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
Natija
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 #

VB
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
Natija
6
150
0

ParamArray faqat oxirgi parametr bo'la oladi va har bir funksiyada bittadan ortiq bo'lmaydi.

Bir nomda bir necha versiya #

VB
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
Natija
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.

Faqat qaytariladigan tur bilan farqlanmaydi

Ikkita funksiya faqat As Integer va As String bilan farq qilsa, kompilyator xato beradi.

Farq parametrlarda bo'lishi shart: ularning soni yoki turlari.

Rekursiya #

VB
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
Natija
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
Rekursiyada to'xtash sharti birinchi yoziladi

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 #

VB
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
Natija
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.

Amaliy topshiriq
  1. Ikkita sonning o'rtachasini qaytaradigan Function yozing.
  2. Uchburchak yuzasini hisoblaydigan funksiya yarating.
  3. ByVal va ByRef farqini o'z misolingizda ko'rsating.
  4. Ikkita o'zgaruvchining qiymatini ByRef bilan almashtiring.
  5. Optional parametrli salomlashish funksiyasini yozing.
  6. Nom bilan uzatish (nom:=qiymat) ni sinab ko'ring.
  7. ParamArray bilan o'rtacha hisoblaydigan funksiya yozing.
  8. Yuza funksiyasining uchta versiyasini yarating.
  9. Fibonachchi sonini rekursiya bilan hisoblang.
  10. Rekursiyada to'xtash shartini olib tashlab, nima bo'lishini kuzating (Ctrl+C bilan to'xtating).

Xulosa #

  • Sub qiymat qaytarmaydi, Function qaytaradi.
  • Return ishlating - funksiya nomiga qiymat berish eski uslub.
  • Parametr standart holatda ByVal; asl o'zgaruvchini o'zgartirish kerak bo'lsa ByRef.
  • Optional parametrlar 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.

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.