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
nadaljše naraščajoče podzaporedje
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):
, 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
Matjaž Prtenjak
Administrator
najdaljše naraščajoče podzaporedje
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
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
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.
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
Matjaž Prtenjak
Administrator
,
Č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:
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!
Č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
lp,
Matjaž Prtenjak
Administrator
Matjaž Prtenjak
Administrator