Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Kaikkiin mahdollisiin järjestyksiin tietyt merkit (vb6)

Sivun loppuun

Monkkats [19.01.2004 13:13:57]

#

Olisko mahdollista/miten sais laitettua tietyt merkit kaikkiin mahdollisiin järjestyksiin (esim. a, b ja c menis järjestyksiin: abc, cba, bac, cab, cba ja bca)?

hunajavohveli [19.01.2004 19:55:08]

#

Joo kyllä sen saa, kun vähän käyttelee LEFT$:ia RIGHT$:ia ja MID$:ia. Olen tehnyt tuollaisen tapaisen QB:llä mutta se on vähän vaikea soveltaa VB:lle.

Tai tuohonhan saattaa olla jokin funktiokin valmiina kuten Reverse, joka kääntää tekstin päinvastoin.

tnb [19.01.2004 21:40:51]

#

Tee yksiulotteinen taulukko(3)as string johon laitat arvoiksi "a", "b" ja "c".

Tee kolme sisäkkäistä For luuppia
Jos luupin laskuri on sama kuin ulomman (toisen tai molempien) niin ohita ko. kierros, jotta ei tule samaa kirjainta kahdesti.

Sitten vaan Text1=text1 + Taulukko(i) + taulukko(j) + taulukko(k)+","

setä [19.01.2004 21:49:13]

#

Jopas pulman lykkäsit! kyllä tuohon löytyy systemaattinen ratkaisu, mutta inhottava koodattava. Ehkä helpoin ratkaisu on poimia kirjaimet satunnaisessa järjestyksessä ja tallettaa aina uusi järjestys merkkijonoon. tarkistetaan, etei sama kombinatio toistu. jatketaan kunnes N! vaihtoehtoa on löytynyt. (N on merkien määrä)

setä [19.01.2004 22:23:36]

#

Tämä näyttäis toimivankin. Formilla textbox Text1 ja Listbox List1, jonka Sorted=True

Dim i As Integer, s() As Integer, j As Integer
Dim lista As String, k As Integer, L As Integer
Dim N As Integer 'vaihtoehtojen määrä
Dim m As String 'kombinaatio

Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = 13 Then
    List1.Clear
    L = Len(Text1): k = L: N = 1
    For i = 2 To L
      N = N * i       'lasketaan L-kertoma
    Next
    ReDim s(k)
    Do Until List1.ListCount = N
      For i = 1 To L
        s(i) = i
      Next
      m = ""
      For i = 1 To k - 1
        j = Int(1 + k * Rnd)
        m = m + Mid(Text1, s(j), 1)
        If j <> k Then s(j) = s(k)
        k = k - 1
      Next
      m = m + Mid(Text1, s(1), 1)
      If InStr(lista, m) = 0 Then
        lista = lista + "#" + m
        List1.AddItem m
      End If
      k = L
    Loop
  End If
End Sub

setä [19.01.2004 23:06:06]

#

Tohon ReDim s(k):n perään vielä : lista = ""

Milu [20.01.2004 01:01:50]

#

Tollein sai qbasic:ssa käymään kanssa kaikki läpi,
siinä tulee myös aaaa,aaab,aaac,aaad,aaba,aabb.....


CLS
n1 = 1: n2 = 1: n3 = 1: n4 = 1
alku:
texti$ = "abcd"
uus$ = (MID$(texti$, n4, 1))
uus$ = uus$ + (MID$(texti$, n3, 1))
uus$ = uus$ + (MID$(texti$, n2, 1))
uus$ = uus$ + (MID$(texti$, n1, 1))
n1 = n1 + 1
IF n1 > 4 THEN n1 = 1: n2 = n2 + 1
IF n2 > 4 THEN n2 = 1: n3 = n3 + 1
IF n3 > 4 THEN n3 = 1: n4 = n4 + 1
IF n4 > 4 THEN END
PRINT uus$; " ";
GOTO alku

Antti Laaksonen [20.01.2004 15:27:40]

#

Tässä on oma ohjelmani, joka hyödyntää itseään kutsuvaa aliohjelmaa. Merkkimuodostelmat näytetään listassa formista painettaessa, aliohjelman keskimmäisten parametrien täytyy olla muodostettavien merkkijonojen pituus.

Private Sub Form_Click()
    'tulostetaan listaan neljän merkin yhdistelmät
    List1.Clear
    SeuraavaTaso "", 4, 4, List1
End Sub

Sub SeuraavaTaso(alku As String, maara As Integer, taso As Integer, lista As ListBox)
    Dim i As Integer
    If taso = 0 Then
        List1.AddItem alku
    Else
        For i = 97 To 96 + maara
            If InStr(alku, Chr(i)) = 0 Then
                SeuraavaTaso alku & Chr(i), maara, taso - 1, lista
            End If
        Next
    End If
End Sub

Onnistuuko joku keksimään tehokkaamman toteutustavan?

edit: 97 on pienen a-kirjaimen ASCII-koodi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta