praegune kellaaeg 24.06.2025 23:58:22
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Skewp
HV kasutaja

liitunud: 04.08.2008
|
13.05.2010 21:19:59
Probleem jadadega [Visual Basic Application] |
|
|
Tervist, nimelt järgmine probleem. On soov ühendada kaks n elemendi pikkust jada üheks uueks jadaks nii, et uue jada moodustamisel võtab programm kahest eelnevast jadast järjest suuremaid arve. Sain valmis kahe n pikkuse jada genereerimise osa ning nende sorteerimise kasvavasse järjekorda, kuid kuidas ma saaks neid soovitud viisil ühendada?
Jadade genereerimine ning kasvavasse järjekorda panemine:
Sub jadad()
Dim i, j As Integer
Worksheets("Leht1").UsedRange.Clear 'kustutab
s1 = Val(InputBox("Sisesta jada elementide arv"))
3 For i = 1 To s1
Cells(i, 1) = Int(Rnd() * 99 + 1) 'annab arvu 1-100
Next i
Dim t, v, max
Set t = Range("a1").CurrentRegion 'otsib õige lahtri
v = t.Rows.Count
For i = 1 To v - 1
For j = i + 1 To v
If t.Cells(i, 1) > t.Cells(j, 1) Then
abi = t.Cells(i, 1)
t.Cells(i, 1) = t.Cells(j, 1)
t.Cells(j, 1) = abi
End If
Next j
Next i
s2 = Val(InputBox("Sisesta jada elementide arv"))
For j = 1 To s2
Cells(j, 2) = Int(Rnd() * 99 + 1)
Next j
Dim k, l, min
Set k = Range("b1").CurrentRegion 'otsib õige lahtri
l = k.Rows.Count
For i = 1 To l - 1
For j = i + 1 To l
If k.Cells(i, 2) > k.Cells(j, 2) Then
abi = k.Cells(i, 2)
k.Cells(i, 2) = k.Cells(j, 2)
k.Cells(j, 2) = abi
End If
Next j
Next i
|
Sain valmis sellise versiooni ühendamisest, kuid ilmselgelt see ei toimi, kuna j muutuja väärtus tõuseb ka siis, kui seda pole tarvis ning programm lõpetab töö kaugelt enne, kui on kõiki arve võrrelnud.
k = 1 'uue jada reamuutuja
Do
For i = 1 To s1
For j = 1 To s2
If Cells(i, 1) > Cells(j, 2) Then
Cells(k, 4) = Cells(j, 2)
k = k + 1
Else
Cells(k, 4) = Cells(i, 1)
i = i + 1
k = k + 1
End If
Next j
Next i
Loop Until k <= s1 + s2
End sub
|
Oskab keegi ühendamise osas mõne lahke soovitusega aidata?
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
13.05.2010 22:09:48
|
|
|
Defineerid veel kolmanda masiivi.
Tekitad loenduri jaoks muutuja loendur=0
tekitad veel ühe muyutuja mis näitab roimingut var seis=0
Siis hakkad eelnevatest masiividest ükshaaval arve võrdlema.
Kui esimeses on väiksem kui teises kirjutad selle kolmandasse ja suurend loendurit 1 võrra seis=1
Kui teises on väiksem kui esimeses kirjutad selle kolmandasse ja suurend loendurit 1 võrra seis=2
Kui on võrdsed kirjutad selle arvu kolmandasse ja suurendad loendurit 1 võrra seis=0
Nüüd võrdled:
kui seis==1 kirjutad teises oleva arvu kolmandasse suurendad loendurit 1 võrra
kui seis==2 kirjutad esimeses oleva arvu kolmandasse suurendad loendurit 1 võrra
Tegin JS selle koodi
<div id="kuva"></div>
<script>
var jada1 = new Array();
var jada2 = new Array();
var jada3 = new Array();
var ii=0; // loendur
var seis=0;
var kuva = document.getElementById('kuva');
for(i=0;i<20;i++){
jada1[i] = Math.floor(Math.random()*100);
jada2[i]= Math.floor(Math.random()*100);
}
jada1.sort(function(a,b){return a - b});
jada2.sort(function(a,b){return a - b});
for(i=0;i<20;i++){
if(jada1[i]<jada2[i]){jada3[ii]=jada1[i];ii++;seis=1;}
if(jada1[i]>jada2[i]){jada3[ii]=jada2[i];ii++;seis=2;}
if(jada1[i]==jada2[i]){jada3[ii]=jada1[i];ii++;seis=0;}
if(seis==1){jada3[ii]=jada2[i];ii++;}
if(seis==2){jada3[ii]=jada1[i];ii++;}
}
for(i=0;i<jada3.length;i++){
kuva.innerHTML = kuva.innerHTML+jada3[i] +"<br>";
}
function sortfunction(a, b){
return (a - b) //causes an array to be sorted numerically and ascending
}
</script>
|
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Skewp
HV kasutaja

liitunud: 04.08.2008
|
13.05.2010 23:38:12
|
|
|
Suur tänu viitsimise eest! Kahjuks on JS minu jaoks tume ala, olen vaid VBA'ga tegelenud. Niipalju sain aru, et see on on ilmselt liitmiseks:
for(i=0;i<20;i++){
if(jada1[i]<jada2[i]){jada3[ii]=jada1[i];ii++;seis=1;}
if(jada1[i]>jada2[i]){jada3[ii]=jada2[i];ii++;seis=2;}
if(jada1[i]==jada2[i]){jada3[ii]=jada1[i];ii++;seis=0;}
if(seis==1){jada3[ii]=jada2[i];ii++;}
if(seis==2){jada3[ii]=jada1[i];ii++;}
}
for(i=0;i<jada3.length;i++){
kuva.innerHTML = kuva.innerHTML+jada3[i] +"<br>";
|
Tegin VBA's vastavalt tekstile, aga ilmselt tekkis kusagil viga sisse.
k = 1 'reamuutuja
var = 0 'loendur
varseis = 0 'mis seis on
If Cells(i, 1) < Cells(j, 2) Then
Cells(k, 4) = Cells(i, 1)
var = var + 1
varseis = 1
Else
If Cells(i, 1) > Cells(j, 2) Then
Cells(k, 4) = Cells(j, 2)
var = var + 1
varseis = 2
Else
If Cells(i, 1) = Cells(j, 2) Then
Cells(k, 4) = Cells(i, 1)
var = var + 1
varseis = 0
End If
End If
End If
If varseis = 1 Then
Cells(k, 4) = Cells(j, 2)
Else
If varseis = 2 Then
Cells(k, 4) = Cells(j, 1)
End If
End If
End Sub
|
Üritan selle uue lähenemisega edasi tegeleda. Paras pusimine on minu jaoks tundmatu JS koodi tõlkimine VBA keelde, aga tundub olevat parim valik kuni mõne VBA keelt kõneleva geeniuse otsa satun Suur tänu veelkord, andrusny.
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
14.05.2010 12:07:33
|
|
|
Et siis algandmeteks on kaks massiivi milles juhuslikud arvud juhuslikus järjekorras ning tulemuseks peab olema üks massiiv mis sisaldab kõiki arve mõlemast algmassiivist ning arvud peavad olema sorteeritud?
Kui nii, siis kõige lihtsam oleks lihtsalt kopeerida kaks massiivi kokku ja tulemus sorteerida. See peaks olema enam-vähem sama efektiivne või paremgi, kui senini välja pakutud algoritmid.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Skewp
HV kasutaja

liitunud: 04.08.2008
|
14.05.2010 12:13:08
|
|
|
Ho Ho kirjutas: |
Et siis algandmeteks on kaks massiivi milles juhuslikud arvud juhuslikus järjekorras ning tulemuseks peab olema üks massiiv mis sisaldab kõiki arve mõlemast algmassiivist ning arvud peavad olema sorteeritud?
Kui nii, siis kõige lihtsam oleks lihtsalt kopeerida kaks massiivi kokku ja tulemus sorteerida. See peaks olema enam-vähem sama efektiivne või paremgi, kui senini välja pakutud algoritmid. |
Jah, nii oleks lihtsam tõesti, sain sellega isegi hakkama.
For i = 1 To v
Cells(i, 1).Select
Selection.Copy
Cells(i, 3).Select
ActiveSheet.Paste
Next i
For j = 1 To l
Cells(j, 2).Select
Selection.Copy
Cells(i + j - 1, 3).Select
ActiveSheet.Paste
Next j
Dim m, n, maax
Set m = Range("C1").CurrentRegion 'otsib õige lahtri
n = m.Rows.Count
For i = 1 To n - 1
For j = i + 1 To n
If m.Cells(i, 3) > m.Cells(j, 3) Then
abi = m.Cells(i, 3)
m.Cells(i, 3) = m.Cells(j, 3)
m.Cells(j, 3) = abi
End If
Next j
Next i
|
Kahjuks pean nad siiski liitma sellisel teel, et võetakse emba-kumba jadast järjest suuremaid arve ning see-läbi moodustub uus jada. Kahjuks pole mõttelend nii kõrge, et haarata seda süsteemi, mille abil neid nii ühendada, kuna variante on tohutult palju.
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
14.05.2010 12:23:19
|
|
|
Skewp kirjutas: |
Kahjuks pean nad siiski liitma sellisel teel, et võetakse emba-kumba jadast järjest suuremaid arve ning see-läbi moodustub uus jada |
Räägi veidi täpsemalt, mis mõttes emba-kumba jadast? Kas siis samad väärtused ei tohi olla topelt või tuleb võtta arve ainult osaliselt ja mitte kõiki?
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.05.2010 12:25:46
|
|
|
Kui ma nüüd õieti aru saan sul vist polegi masiivid. See on sul Exeli VB ? Need on sul lihtsalt lahtritest võetud arvud, mitte eraldi deklareeritud masiivid?
VB masiiv peaks välja nägema midagi sellist.
DIM hulk(30)
see on nüüd 30 pesane masiiv hulk ja sellesse pannakse ja loetakse arve hulk(0) hulk(1) jne.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Skewp
HV kasutaja

liitunud: 04.08.2008
|
14.05.2010 12:44:11
|
|
|
Ho Ho kirjutas: |
Skewp kirjutas: |
Kahjuks pean nad siiski liitma sellisel teel, et võetakse emba-kumba jadast järjest suuremaid arve ning see-läbi moodustub uus jada |
Räägi veidi täpsemalt, mis mõttes emba-kumba jadast? Kas siis samad väärtused ei tohi olla topelt või tuleb võtta arve ainult osaliselt ja mitte kõiki? |
Emba-kumba sellest mõttes, et kummas see väikseim arv just sel hetkel on. Oletame, et esimeses jadas on 29 30 53 58 70 ja teises 2 71 76 77 81. Kõigepealt tuleks võtta teisest jadast 2, siis esimesest 29 30 53 58 70 ja siis veel 71 76 77 81 teisest. Minu süsteemide viga on olnud see, et kui esimese jada muutuja i jõuab lubatud piirini (s1, jada pikkus), siis kogu töö seiskub (sama teise jada muutuja j'ga). Kui on topelt, siis oleks tarvis, et ka uues jadas topelt oleks.
andrusny kirjutas: |
Kui ma nüüd õieti aru saan sul vist polegi masiivid. See on sul Exeli VB ? Need on sul lihtsalt lahtritest võetud arvud, mitte eraldi deklareeritud masiivid?
VB masiiv peaks välja nägema midagi sellist.
DIM hulk(30)
see on nüüd 30 pesane masiiv hulk ja sellesse pannakse ja loetakse arve hulk(0) hulk(1) jne. |
Jah, tegemist on Exceli VBA'ga ja vastavad arvud genereeritakse hetkel vastavalt A ja B tulpa ning oleks vaja need ühendada mõnda teise, nt C või D tulpa.
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.05.2010 12:56:13
|
|
|
Sa vist tegelikult lahendasid ise ju selle probleemi. Rea sorteerimisega tulid sa ju toime nagu ma aru saan. Esimese sorteerimise võid üldse nüüd vahele jätta. Esmalt tõsta täiesti suvaliselt kõik uude tulpa, seejärel sorteeri uus tulp. Nüüd oled olukorras, kus kõik on õiges järjekorras, kuid võib esineda topelt arve kõrvuti. Otsid nüüd topelt arve võtad arvu paned kas tulpa või masiivi, järgmist võttes kontrollid, et seda poleks kontroll masiivis ja käid rea läbi. Lõptulemusena peaksidki saama ühekordsete arvudega järjestatud rea.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
14.05.2010 13:00:48
|
|
|
Skewp kirjutas: |
Emba-kumba sellest mõttes, et kummas see väikseim arv just sel hetkel on. Oletame, et esimeses jadas on 29 30 53 58 70 ja teises 2 71 76 77 81. Kõigepealt tuleks võtta teisest jadast 2, siis esimesest 29 30 53 58 70 ja siis veel 71 76 77 81 teisest. |
Sellise kirjelduse järgi ei näe põhjust, miks ei peaks lihtne jadade liitmine ja sorterimine töötama, iseasi kuidas see exelis lahendada.
Skewp kirjutas: |
Minu süsteemide viga on olnud see, et kui esimese jada muutuja i jõuab lubatud piirini (s1, jada pikkus), siis kogu töö seiskub (sama teise jada muutuja j'ga). |
Pseudokoodis lahendaks ma selle umbes niiviisi:
array a1, a2; // sisendmassiivid, eeldan et juba sorteeritud järjekorras
int a1index = 0, a2index=0; // massiivide indeksid
array result; // tulemus
// tsükkel kuni mõlemad indeksid on suuremad, kui nende massiivide suurus
while (a1index<a1.size() || a2index<a2.size() {
// kui mõlemas massiivis on veel elemente
if (a1index<a1.size() && a2index<a2.size()) {
// kui esimese massiivi element on suurem siis kasuta toda, vastasel juhul kasuta teist
if (a1[a1index]>a2[a2index])){
result.push(a1[a1index]); // lisab muutuja tulemuse massiivi lõppu
a1index++;
} else {
result.push(a2[a2index]);
a2index++;
}
} else {
// siia tullakse juhul, kui üks või teine massiiv on juba läbi käidud ja vastavalt kopeeritakse ühe kaupa kõik teise massiivi elemendid
if (a1index<a1.size()) {
result.push(a1[a1index]);
a1index++;
} else {
result.push(a2[a2index]);
a2index++;
}
}
} |
Testinud ei ole kuid teoorias peaks töötama. Annaks kindlasti efektiivsemaks teha kuid hetkel ei viitsi liigselt mõelda kuidas
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
Skewp
HV kasutaja

liitunud: 04.08.2008
|
14.05.2010 13:05:27
|
|
|
andrusny kirjutas: |
Sa vist tegelikult lahendasid ise ju selle probleemi. Rea sorteerimisega tulid sa ju toime nagu ma aru saan. Esimese sorteerimise võid üldse nüüd vahele jätta. Esmalt tõsta täiesti suvaliselt kõik uude tulpa, seejärel sorteeri uus tulp. Nüüd oled olukorras, kus kõik on õiges järjekorras, kuid võib esineda topelt arve kõrvuti. Otsid nüüd topelt arve võtad arvu paned kas tulpa või masiivi, järgmist võttes kontrollid, et seda poleks kontroll masiivis ja käid rea läbi. Lõptulemusena peaksidki saama ühekordsete arvudega järjestatud rea. |
Seletasin ilmselt liiga segaselt. Topelt arve on mul siiski vaja. Kui mõlemas tulbas on 37, siis peab ka uues olema kaks korda 37, ükski arv ei tohi kaduma minna. Asja võlu ongi selles, et mul on tarvis nad sorteerida nii, et ei copy-paste kahte jada üksteise otsa vaid arve võetakse ükshaaval (võrdlemise teel) ja sisestatakse uude asukohta. Näiteks need samad arvud, mille abil näite tõin. Esmalt võrreldakse 2 ja 29 ning uude asukohta (1,4) läheb 2. Seejärel võrreldakse jadast, kus arv võeti, järgmist arvu sellega, mis on jadas, kust ei võetud arvu (29 vs 71). Väiksem on 29, seega (2,4) läheb 29. Kuna kõik ülejäänud esimese jada arvud (30 53 58 70) on väiksemad kui teises jadas teisel kohal olev 71, siis peaksid need järgnema kohtadele vastavalt (3,4), (4,4), (5,4) ja (6,4). Minu esmane variant (esimeses postis) lõpetas töö (5,4) juures, kuna esimese jada muutuja i sai oma maksimumväärtuse. Probleem on aga selles, et uude jatta jääb niimoodi sisestamata nt esimesest jadast arv 70 (6,4) ja teisest jadast 76 77 81. Minu (ilmselt olematu) peanupuke ei suuda välja mõelda süsteemi, mille alusel kõik arvud jõuaks uude jatta kasvavas järjekorraas ilma, et jada töö varem katkeks / muu probleem tekiks.
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
14.05.2010 13:12:32
|
|
|
Soovitaks sul massiivide kasutus selgeks teha, nendega oleks kogu see jama oluliselt lihtsam ja inimlikum
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
telefoon
HV vaatleja
liitunud: 05.05.2003
|
14.05.2010 20:50:07
|
|
|
Põhimõtteliselt tegu põimesorteerimisega (merge sort). Aga teemaalgataja on lihtsalt valesti alustanud. Googelda "merge sort" ja peaksid kena pseudokoodi leidma.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Skewp
HV kasutaja

liitunud: 04.08.2008
|
15.05.2010 00:33:44
|
|
|
telefoon kirjutas: |
Põhimõtteliselt tegu põimesorteerimisega (merge sort). Aga teemaalgataja on lihtsalt valesti alustanud. Googelda "merge sort" ja peaksid kena pseudokoodi leidma. |
Suur tänu! Sain asja PEAAEGU VALMIS, endiselt natuke tõrgub, aga ilmselt saab asja, kui suudan vea leida. Hetkel seis selline:
i = 1
j = 1
k = 1
Do
If Cells(i, 1) <= Cells(j, 2) Then
Cells(k, 4) = Cells(i, 1)
i = i + 1
Else
Cells(k, 4) = Cells(j, 2)
j = j + 1
End If
k = k + 1
Loop While (i <= s1 & j <= s2)
Do
Cells(k, 4) = Cells(i, 1)
i = i + 1
k = k + 1
Loop While (i <= s1)
Do
Cells(k, 4) = Cells(j, 2)
j = j + 1
k = k + 1
Loop While (j <= s2)
|
Malli võtsin siit:
I = 1; J = 1; K = 1;
do while(I <= NA .and. J <= NB)
if (A(I) <= B(J)) then
C(K) = A(I)
I = I+1
else
C(K) = B(J)
J = J+1
endif
K = K + 1
enddo
do while (I <= NA)
C(K) = A(I)
I = I + 1
K = K + 1
enddo
return
|
Kusagil on veel mingi pisiviga sees, kuna jätab alati mõned viimased arvud sorteerimata ja viskab "Overflow" errori
_________________ Täpne 3D skanneerimine | Aerofotod | Aerovideod | |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|