nadaljše naraščajoče podzaporedje

Pomoč pri izdelavi makrov
Odgovori
soncek
Prispevkov: 3
Pridružen: Po Avg 14, 2006 12:42 pm

nadaljše naraščajoče podzaporedje

Odgovor Napisal/-a soncek »

Pozdravljeni,

Prosim, če bi mi lahko pomagali pri naslednji nalogi, saj ne vem kako naj se je lotim?

Napiši funkcijo, ki kot argument sprejme tabelo 10 števil in poišče najdaljše naraščajoče podzaporedje. Primer : 1,2,3,5,2,6,8,9,10 vrne 2,6,8,9,10.Funkcijo napiši tako, da kot rezultat vrne dolžino najdaljšega naraščajočega podzaporedja. Dodaj še izpis, preden vrne rezultat, naj pove katero je bilo najdaljše podzaporedje.

hvala
lp
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

:), Algoritem je skrajno preprost. Potrebno se je sprehoditi po celotnem vhodnem zaporedju ter pregledovati dokler so naslednja števila večja od prejšnjih. Vseskozi pa si morate zapomniti najdaljše zaporedje.

V VBA-ju stvar izgleda takole (koda bi lahko bila manjša, toda zapisana je tako "začetniško", da je lažje razumljiva):

Koda: Izberi vse

Sub NajdiNajdaljseZaporedje(stevila As Variant)
    Dim i As Integer
    
    Dim zacetek_naj_niz As Integer ' začetek najdaljšega niza
    Dim konec_naj_niz As Integer ' konec najdaljšega niza
    Dim zacetek_niz As Integer ' začetek trenutnega niza
    
    zacetek_naj_niz = LBound(stevila)
    konec_naj_niz = LBound(stevila)
    zacetek_niz = LBound(stevila)
    
    For i = LBound(stevila) + 1 To UBound(stevila)
        If (stevila(i) <= stevila(i - 1)) Then ' niz ni več naraščujoč!
            ' če je trenutni daljši od najdaljšega, potem je to najdaljši
            If (i - zacetek_niz) > (konec_naj_niz - zacetek_naj_niz - 1) Then
                zacetek_naj_niz = zacetek_niz
                konec_naj_niz = i - 1
                zacetek_niz = i
            End If
        End If
    Next
    
    ' prišel sem do konca in preverim ali ni najdaljši niz na koncu
    If (UBound(stevila) - zacetek_niz) > (konec_naj_niz - zacetek_naj_niz - 1) Then
        zacetek_naj_niz = zacetek_niz
        konec_naj_niz = UBound(stevila)
    End If
    
    ' izpišem rezultate
    Debug.Print "Začetek najdaljšega niza = " & zacetek_naj_niz
    Debug.Print "Konec najdaljšega niza = " & konec_naj_niz
    Debug.Print "Niz :";
    For i = zacetek_naj_niz To konec_naj_niz
        Debug.Print stevila(i);
    Next
End Sub

Sub test()
    Dim stevila As Variant
    
    stevila = Array(1, 2, 3, 5, 2, 6, 8, 9, 10)
    
    NajdiNajdaljseZaporedje stevila
End Sub
lp,
Matjaž Prtenjak
Administrator
soncek
Prispevkov: 3
Pridružen: Po Avg 14, 2006 12:42 pm

najdaljše naraščajoče podzaporedje

Odgovor Napisal/-a soncek »

Pozdravljeni

Najprej hvala za prejsni odgovor! Bi bilo mogoce napisati programsko kodo tudi brez LBound ter UBound? :?: Prav ta oblika dela nekaj tezav da razumem kodo, saj sem komaj zacetnik programer... :(

hvala
lp
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

LBound je prvi indeks zaporedja in to je lahko v VBA-ju 0 ali 1. Če ne rečete drugače je to 1, UBound pa je najvišji indeks zaporedja. To je vse. S tako zapisano kodo lahko vi podate poljubno zaporedje (lahko je 5 števil ali pa 100 ali pa 10.000) in algoritem bo vedno delal. V primeru pa da daste fiksne meje npr. 1 in 10, potem pa ste omejeni samo na zaporedja dolžine natanko 10 števil.
lp,
Matjaž Prtenjak
Administrator
soncek
Prispevkov: 3
Pridružen: Po Avg 14, 2006 12:42 pm

Odgovor Napisal/-a soncek »

pozdravljeni,

Razumem kaj ste hoteli s tema dvema funkcijama. Zanima pa me v primeru, da nocem uporabljati teh dveh funkcij (se omejim 0d 1 do 10), kako lahko rešim potem to nalogo?

hvala
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:),

Če teh funkcij nočete uporabiti pač namesto njiju pišite 0 (namesto LBound) in 9 (namesto Ubound). To je vse! Morate pa uporabiti 0, ker se zaporedja začnejo z 0 in ne z 1; torej od 0 do 9 in ne od 1 do 10.

Vendar pa vas še enkrat opozarjam, da funkcija ne bo delovala pravilno, če ji boste podali man (ali več) kot 10 elementov. Npr:

Koda: Izberi vse

  stevila = Array(1, 2, 3, 5, 2, 6, 8, 9)
  NajdiNajdaljseZaporedje stevila 
To že ne bo delovalo, ker je števil samo 8 in ko bi vi v funkciji želeli zaseči deveti indeks bi funkcija "crknila", ker tega indeksa ni!
lp,
Matjaž Prtenjak
Administrator
Odgovori