#Region "_04_Rekurzió" Function R_Faktoriális(ByVal n As Integer) As Long 'Rekurzív megoldás If n = 0 Then R_Faktoriális = 1 Else R_Faktoriális = n * R_Faktoriális(n - 1) End If End Function Function Faktoriális(ByVal n As Integer) As Long 'Iteratív, ciklusos megoldás Dim f As Long f = 1 Do While n > 1 f = n * f n = n - 1 Loop Faktoriális = f End Function #End Region #Region "_05_03_Összegzés" 'Egy adatsor elemeit adjuk össze Sub Összegzés_intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim s As Single a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 m = 1 n = 5 Összegzés(m, n, a, s) MsgBox("Összeg: " & s) End Sub Sub Összegzés(ByVal m, ByVal n, ByVal a, ByRef s) 'Adatsor elemeinek összeadása 'm:kezdő index, n:utolsó index, a:adattömb, s:az összeg Dim i As Integer s = 0 For i = m To n s = s + a(i) Next End Sub #End Region #Region "05_04_Feltételes Összegzés" 'Feltételes Összegzés --- Start 'Összegezzük a páros számokat Sub Feltételes_Összegzés_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim s As Single a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 m = 1 n = 5 Feltételes_Összegzés(m, n, a, s) MsgBox("Összeg: " & s) End Sub Sub Feltételes_Összegzés(ByVal m, ByVal n, ByVal a, ByRef s) 'Adatsor elemeinek összeadása 'm:kezdő index, n:utolsó index, a:adattömb, s:az összeg Dim i As Integer s = 0 For i = m To n If Páros(a(i)) Then s = s + a(i) End If Next End Sub Function Páros(ByVal Szám) 'Vissza: True, ha a szám páros, egyébként False If Szám Mod 2 = 0 Then Páros = True Else Páros = False End If End Function 'Feltételes Összegzés --- End #End Region #Region "_05_05_Eldöntés" 'Eldöntjük, hogy a tömbben van-e negatív szám Sub Eldöntés_intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim v As Integer a(1) = 1 a(2) = 2 a(3) = 3 a(4) = -4 a(5) = 5 m = 1 n = 5 Eldöntés(m, n, a, v) If v Then MsgBox("Van benne negatív") Else MsgBox("Nincs benne negatív") End If End Sub Sub Eldöntés(ByVal m, ByVal n, ByVal a, ByRef v) 'Eldönti, hogy a-ban van-e az adott tulajdonságú elem. 'Azt mondja meg, hogy az a-ban van-e negatív szám 'm:kezdő index, n:utolsó index, a:adattömb, v:Ha True, akkor van benne, egyébként nincs Dim i As Integer i = m v = False Do While Not Negatív(a(i)) i = i + 1 If i > n Then Exit Do End If Loop v = i <= n End Sub Function Negatív(ByVal Szám) Negatív = Szám < 0 End Function #End Region #Region "_05_06_Kiválasztás" 'Kiválasztjuk a tömbben lévő első negatív számot Sub Kiválasztás_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim k As Integer Dim b As Single a(1) = 1 a(2) = 2 a(3) = -3 a(4) = -4 a(5) = 5 m = 1 n = 5 Kiválasztás(m, n, a, k, b) If k > 0 Then MsgBox("Az első negatív: " & "a(" & k & ")=" & b) Else MsgBox("Nincs benne negatív") End If End Sub Sub Kiválasztás(ByVal m, ByVal n, ByVal a, ByRef k, ByRef b) 'Kiválasztjuk a feltételnek megfelelő elemet: az első negatív számot 'm:kezdő index, n:utolsó index, a:adattömb, k:hanyadik elem, b:az első negatív szám Dim i As Integer i = m k = 0 b = 0 Do While Not Negatív(a(i)) i = i + 1 If i > n Then Exit Do End If Loop If i <= n Then k = i b = a(i) End If End Sub #End Region #Region "_05_07_Kiválogatás" 'Kiválogatjuk a tömb negatív elemeit Sub Kiválogatás_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim b(0 To 5) As Single Dim k As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = -3 a(4) = -4 a(5) = 5 m = 5 n = 5 Kiválogatás(m, n, a, k, b) If k > 0 Then MsgBox("A negatívok száma: " & k) For i = 1 To k Debug.Print(b(i)) Next Else MsgBox("Nincs benne negatív") End If End Sub Sub Kiválogatás(ByVal m, ByVal n, ByVal a, ByRef k, ByRef b) 'Kiválogatjuk a feltételnek megfelelő elemeket 'm:kezdő index, n:utolsó index, a:adattömb, k:hány negatív van, b:a negatív számok Dim i As Integer k = 0 For i = m To n If Negatív(a(i)) Then k = k + 1 b(k) = a(i) End If Next If i <= n Then k = i b = a(i) End If End Sub #End Region #Region "_05_09_Szétválogatás" 'Szétválogatjuk a negatív és pozitív számokat Sub Szétválogatás_intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim b(0 To 5) As Single Dim c(0 To 5) As Single Dim kb As Integer Dim kc As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = -3 a(4) = -4 a(5) = 5 m = 1 n = 5 Szétválogatás(m, n, a, kb, kc, b, c) MsgBox("A negatívok száma: " & kb & vbNewLine & "Pozitívok száma: " & kc) Debug.Print("Negatívak:") For i = 1 To kb Debug.Print(b(i)) Next Debug.Print("Pozitívak:") For i = 1 To kc Debug.Print(c(i)) Next End Sub Sub Szétválogatás(ByVal m, ByVal n, ByVal a, ByRef kb, ByRef kc, ByRef b, ByRef c) 'Szétválogatjuk a feltételnek megfelelő nem megfelelő elemeket 'm:kezdő index, n:utolsó index, a:adattömb _ 'kc:hány negatív van, kc:hány pozitív van, b:a negatív számok, c:a pozitív számok Dim i As Integer kb = 0 kc = 0 For i = m To n If Negatív(a(i)) Then kb = kb + 1 b(kb) = a(i) Else kc = kc + 1 c(kc) = a(i) End If Next End Sub #End Region #Region "_05_10_Metszet" 'Két adatsor közös elemeinek kiválogatása Sub Metszet_intéző() Dim na, nb As Integer Dim a(0 To 5) As Single Dim b(0 To 6) As Single Dim c(0 To 5) As Single Dim k As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 4 a(4) = 4 a(5) = 5 b(1) = 7 b(2) = 2 b(3) = -3 b(4) = -4 b(5) = 1 b(6) = 7 na = 5 nb = 6 Metszet(na, nb, k, a, b, c) If k > 0 Then MsgBox("A közös elemek száma: " & k) Debug.Print("Közös elemek:") For i = 1 To k Debug.Print(c(i)) Next Else MsgBox("Nincsenek közös elemek") End If End Sub Sub Metszet(ByVal na, ByVal nb, ByRef k, ByVal a, ByVal b, ByRef c) 'Két adatsor közös elemeinek kiválogatása egy harmadik adatsorba 'k:a közös elemek száma, a:egyik adatsor, b:másik adatsor, c:metszet Dim i, j As Integer k = 0 For i = 1 To na For j = 1 To nb If a(i) = b(j) Then k = k + 1 c(k) = a(i) End If Next Next End Sub #End Region #Region "_05_11_Egyesítés" Sub Egyesítés_intéző() Dim a(0 To 5) As Single Dim b(0 To 6) As Single Dim c() As Single 'dinamikus tömb Dim k As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 4 a(4) = 4 a(5) = 5 b(1) = 7 b(2) = 2 b(3) = -3 b(4) = -4 b(5) = 1 b(6) = 7 k = 0 Egyesítés(a, b, c, k) If k > 0 Then MsgBox("Az unió elemeinek száma: " & k) Debug.Print("Unió elemei:") For i = 1 To k Debug.Print(c(i)) Next Else MsgBox("Nincsen unió") End If End Sub Sub Egyesítés(ByVal a, ByVal b, ByRef c, ByRef k) 'Két adatsor közös elemeinek uniója egy harmadik adatsorba 'k:az unió elemeinek száma, a:egyik adatsor, b:másik adatsor, c:unió Dim i, j As Integer Dim na, nb As Integer Dim BenneVan As Integer na = UBound(a) nb = UBound(b) k = 0 For i = 1 To na k = k + 1 ReDim Preserve c(0 To k) c(k) = a(i) Next For i = 1 To nb BenneVan = False For j = 1 To na If b(i) = a(j) Then BenneVan = True Exit For End If Next If Not BenneVan Then k = k + 1 ReDim Preserve c(0 To k) c(k) = b(i) End If Next End Sub #End Region #Region "_05_12_Összefuttatás" Sub Összefuttatás_intéző() Dim a(0 To 5) As Single Dim b(0 To 6) As Single Dim c() As Single 'dinamikus tömb Dim k As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 4 a(4) = 4 a(5) = 5 b(1) = 1 b(2) = 3 b(3) = 5 b(4) = 6 b(5) = 7 b(6) = 9 k = 0 Összefuttatás(a, b, c, k) If k > 0 Then MsgBox("Az összefuttatás elemeinek száma: " & k) Debug.Print("Az összefuttatás elemei:") For i = 1 To k Debug.Print(c(i)) Next Else MsgBox("Nincsen összefuttatás") End If End Sub Sub Összefuttatás(ByVal a, ByVal b, ByRef c, ByRef k) 'Rendezett adatsor készítése két rendezett adatsorból Dim i, j As Integer Dim na, nb As Integer na = UBound(a) nb = UBound(b) k = 0 i = 1 j = 1 Do While i <= na And j <= nb k = k + 1 If a(i) < b(j) Then ReDim Preserve c(0 To k) c(k) = a(i) i = i + 1 ElseIf a(i) = b(j) Then ReDim Preserve c(0 To k) c(k) = a(i) k = k + 1 ReDim Preserve c(0 To k) c(k) = b(j) i = i + 1 j = j + 1 ElseIf a(i) > b(j) Then ReDim Preserve c(0 To k) c(k) = b(j) j = j + 1 End If Loop Do While i <= na k = k + 1 ReDim Preserve c(0 To k) c(k) = a(i) i = i + 1 Loop Do While j <= nb k = k + 1 ReDim Preserve c(0 To k) c(k) = b(j) j = j + 1 Loop End Sub #End Region #Region "_06_01_Lineáris_keresés" 'Adott értékű elem keresése és a keresés helyének megadása Sub Lineáris_Keresés_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim k As Single Dim b As Single a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 m = 1 n = 5 b = 3 Lineáris_Keresés(m, n, a, b, k) If k > 0 Then MsgBox("A keresett érték a " & k & "-ik helyen található.") Else MsgBox("A keresett érték nincs meg!") End If End Sub Sub Lineáris_Keresés(ByVal m, ByVal n, ByVal a, ByVal b, ByRef k) 'm: tól, n:ig , a: miben keresünk, b: mit keresünk, k: hanyadik helyen találtuk meg Dim i As Integer Dim na As Integer na = UBound(a) For i = 1 To na If b = a(i) Then k = i End If Next End Sub #End Region #Region "_06_02_Logaritmikus_keresés" 'Egy rendezett halmazban keresünk valamit Sub Logaritmikus_Keresés_Intéző() Dim m, n As Integer Dim a(0 To 10) As Single Dim k As Single Dim b As Single Dim Megvan As Integer a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 a(6) = 6 a(7) = 7 a(8) = 8 a(9) = 9 a(10) = 10 m = 1 n = 10 b = 3 Logaritmikus_Keresés(m, n, a, b, k, Megvan) If Megvan Then MsgBox("A keresett érték a " & k & "-ik helyen található.") Else MsgBox("A keresett érték nincs meg!") End If End Sub Sub Logaritmikus_Keresés(ByVal m, ByVal n, ByVal a, ByVal b, ByRef k, ByRef Megvan) Dim tól, ig As Integer Megvan = False tól = m ig = n Do While Not Megvan And tól <= ig k = tól + Int((ig - tól) / 2) If b = a(k) Then Megvan = True ElseIf b < a(k) Then ig = k - 1 ElseIf b > a(k) Then tól = k + 1 End If Loop End Sub #End Region #Region "_07_01_Maximum_kiválasztás" 'Kiválasztjuk a tömbben lévő legnagyobb számot Sub Maximum_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim k As Integer Dim b As Single a(1) = 1 a(2) = 2 a(3) = 12 a(4) = -4 a(5) = 5 m = 1 n = 5 Maximum(m, n, a, k, b) MsgBox("A maximum: " & "a(" & k & ")=" & b) End Sub Sub Maximum(ByVal m, ByVal n, ByVal a, ByRef k, ByRef b) 'Kiválasztjuk az a-ban lévő legnagyobb számot 'm:kezdő index, n:utolsó index, a:adattömb, k:hanyadik elem, b:a maximum Dim i As Integer k = m b = a(m) For i = m To n If b < a(i) Then b = a(i) k = i End If Next End Sub #End Region #Region "_07_02_Feltételes_maximum" 'Kiválasztjuk a tömbben lévő páratlanok közül a legnagyobbat Sub Feltételes_Maximum_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim k As Integer Dim b As Single a(1) = 1 a(2) = 2 a(3) = 12 a(4) = -4 a(5) = 6 m = 1 n = 5 Feltételes_Maximum(m, n, a, k, b) If k > 0 Then MsgBox("A maximum: " & "a(" & k & ")=" & b) Else MsgBox("Nincsen Páratlan szám a tömbben!") End If End Sub Sub Feltételes_Maximum(ByVal m, ByVal n, ByVal a, ByRef k, ByRef b) 'Kiválasztjuk a tömbben lévő páratlanok közül a legnagyobbat 'm:kezdő index, n:utolsó index, a:adattömb, k:hanyadik a legnagyobb, b:a maximum Dim i As Integer k = 0 For i = m To n If Páratlan(a(i)) Then k = i b = a(i) Exit For End If Next If k = 0 Then Exit Sub End If For i = k + 1 To n If Páratlan(a(i)) Then If b < a(i) Then b = a(i) k = i End If End If Next End Sub Function Páratlan(ByVal Szám) Páratlan = Szám Mod 2 <> 0 End Function #End Region #Region "_08_01_Beszúrásos_rendezés" 'Start --- Rendezés beszúrásos Sub Rendezés_Beszúrásos_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 12 a(4) = -4 a(5) = 6 m = 1 n = 5 Rendezés_Beszúrásos(m, n, a) Debug.Print("Rendezés:") For i = m To n Debug.Print(a(i)) Next End Sub Sub Rendezés_Beszúrásos(ByVal m, ByVal n, ByRef a) Dim i As Integer Dim j As Integer Dim b As Single Dim cs As Single For i = m To n - 1 b = a(i + 1) For j = i To m Step -1 If b < a(j) Then cs = a(j) a(j) = b a(j + 1) = cs End If Next Next End Sub #End Region #Region "_08_02_Buborékos_rendezés" 'Start --- Rendezés Buborékos Sub Rendezés_Buborékos_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 12 a(4) = -4 a(5) = 6 m = 1 n = 5 Rendezés_Buborékos(m, n, a) Debug.Print("Rendezés:") For i = m To n Debug.Print(a(i)) Next End Sub Sub Rendezés_Buborékos(ByVal m, ByVal n, ByRef a) Dim i, j, aj As Integer For i = n To m + 1 Step -1 'Az utolsótól a másodikig For j = m To i - 1 'Az elsőtől az i-edikig If a(j) > a(j + 1) Then 'csere aj = a(j) a(j) = a(j + 1) a(j + 1) = aj End If Next Next End Sub '1. Az elejétől végigmegyünk, és páronként összehasonlítjuk az aelemeket. Ha a baloldali nagyobb, akkor cserélünk. Így a végn alegnyagobb lesz. '2. Aztán újra, de már csak az utolsó előttiig, ahol mostmár a második legnagyobb lesz. '3. Ezt addig csináljuk, amíg az elejére nem érünk, amikorra is a legkisebb lesz legelől. #End Region #Region "_08_03_Cserélgetéses_rendezés" 'Start --- Rendezés Cserélgetéses Sub Rendezés_Cserélgetéses_Intéző() Dim m, n As Integer Dim a(0 To 5) As Single Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 12 a(4) = -4 a(5) = 6 m = 1 n = 5 Rendezés_Cserélgetéses(m, n, a) Debug.Print("Rendezés:") For i = m To n Debug.Print(a(i)) Next End Sub Sub Rendezés_Cserélgetéses(ByVal m, ByVal n, ByRef a) Dim i, j, aj As Integer For i = m To n - 1 For j = i + 1 To n If a(i) > a(j) Then 'csere aj = a(j) a(j) = a(i) a(i) = aj End If Next Next End Sub '1. Az elsőt összehasonlítjuk minden alatta lévővel és megcseréljük, ha van nála kisebb, _ '(a végére az első lesz a legkisebb) '2. A következőt összehasonlítjuk az alatta lévőkkel és megcseréljük, ha van nála kisebb, _ '(a végére következő lesz az alatta lévő közül a legkisebb) '... és így tovább az utolsó előtti-ig. #End Region #Region "_08_04_Minimumkiválasztásos_rendezés" 'Start --- Rendezés minimum kiválasztásos Sub Rendezés_MinKiv_Intéző() Dim m, n As Integer Dim a(0 To 5) As Object Dim i As Integer a(1) = 6 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = -4 m = 1 n = 5 Rendezés_MinKiv(m, n, a) Debug.Print("Rendezés:") For i = m To n Debug.Print(a(i)) Next End Sub Sub Rendezés_MinKiv(ByVal m, ByVal n, ByRef a) Dim i, j, t As Integer Dim at For i = m To n t = i For j = i + 1 To n 'A legkisebb megkeresése: A végére a t-ben lesz, hogy melyik indexű a legkisebb. If a(t) < a(j) Then t = j End If Next at = a(t) a(t) = a(i) a(i) = at Next End Sub '1. Az összes közül megkeresük a legkisebbet, és az legyen az első '2. A másodiktól kezdve megkeressük a legkisebbet és ő legyen a második. '3. A harmadiktól ... és ő legyen a harmadik '..... 'n. A két utolsó közül a kisebb legyen az utolsó előtti. #End Region