login  Naam:   Wachtwoord: 
Registreer je!
 Forum

lijst opstellen van letters

Offline simpleasy - 26/02/2009 17:36
Avatar van simpleasyLid ik werk nu al effe met VB.net 2008,
en ik wou mezelf eens een uitdaging geven en een lijst opstellen van letters ipv cijfers
een lijst opstellen van cijfers gaat gewoon zo
  1. For counter=1 to 100 step 1
  2. ListBox1.Items.Add (counter)
  3. Next

maar ik wou ditzelfde dus doen met letters
dan krijg je dus een lijst als
a
b
c
...
y
z
aa
ab
..
az
ba
bb
....
..

ik heb hier nu al 2 dagen op gezocht, en ik zou het kunnen alleen krijg ik altijd een superlange code waarbij het uren duurt eer hij afgetypt is, en het programma zou ook nog eens daardoor enorm sloom werken

heeft iemand misschien een idee hoe ik dit wel zou kunnen doen?
(misschien dat iemand zal zeggen van: waarom zou je nu zo'n lijst willen maken?
en dat weet ik ook niet, maar het leek mij een goede oefening, maar ik weet dus niet hoe het moet na veel zoeken.. en als ik nu het antwoord krijg leer ik er ook weer van  )

alvast bedankt

20 antwoorden

Gesponsorde links
Offline Abbas - 26/02/2009 18:08 (laatste wijziging 26/02/2009 18:23)
Avatar van Abbas Gouden medaille

Crew .NET
Gewoon op helemaal dezelfde manier, maar je zet het getal om naar de CharacterCode. Dit geeft dan de ASCII-waarde van het getal terug. In je Loop begin je dan bij 97 (a) en eindig je bij 122 (z).

  1. For i As Integer = 97 To 122 Step 1
  2. ListBox1.Items.Add(Microsoft.VisualBasic.ChrW(i))
  3. Next
Offline simpleasy - 26/02/2009 18:43
Avatar van simpleasy Lid dan heb je maar een lijst van a tot z, dit had ik al gemaakt op een andere (langere) manier, maar hoe maak je dan een lijst die verder gaat na z
achter z komt dan aa
achter zz komt dan aaa
achter zzz komt dan aaaa etc...
Offline Abbas - 26/02/2009 18:58 (laatste wijziging 26/02/2009 19:03)
Avatar van Abbas Gouden medaille

Crew .NET
Als je het echt zo wilt ga je sowieso al een langere code hebben met waarschijnlijk een langere uitvoer. Maar ik heb een mogelijke oplossing, als je korter en sneller kan dan deze code proficiat! :p

  1. 'Variabelen die je nodig hebt declareren
  2. Dim x As Integer = 1
  3. Dim strOutput As String = String.Empty
  4. 'Tellertje voor hoeveel keer je wilt herhalen
  5. For j As Integer = 1 To 5 Step 1
  6. 'Tellertje voor het alfabet
  7. For i As Integer = 97 To 122 Step 1
  8. x = 1
  9. strOutput = String.Empty
  10. 'Met deze While-loop ga je zien aan de hand van het
  11. 'eerste tellertje hoeveel keer de letter in een item moet
  12. 'voorkomen
  13. While x <= j
  14. strOutput &= Microsoft.VisualBasic.ChrW(i)
  15. x = x + 1
  16. End While
  17. 'Item toevoegen aan de lijst
  18. ListBox1.Items.Add(strOutput)
  19. Next
  20. Next
Offline simpleasy - 26/02/2009 19:03
Avatar van simpleasy Lid ik krijg nu een lijst die alleen maar bestaat uit a's
iet zoals
a
a
a
a
a
a
a
a
aa
aa
aa
aa
aa
aa
aa
aaa
aaa
aaa
aaa
aaa
..
Offline Abbas - 26/02/2009 19:04
Avatar van Abbas Gouden medaille

Crew .NET
Check de update van de code, ik was twee regels vergeten. Probeer even opnieuw! 
Offline simpleasy - 26/02/2009 19:11
Avatar van simpleasy Lid het werkt.. najah.. gedeeltelijk toch 
ik bedoelde dus dat je een lijst kreeg zoals
a
b
c
d
e
....
z
aa
ab
ac
ad
..
az
ba
bb
bc
..
zx
zy
zz
aaa
aab
aac
....

snapje?
Offline Abbas - 26/02/2009 19:13
Avatar van Abbas Gouden medaille

Crew .NET
Aha, dan zal ik weer even verder puzzelen! 
Offline simpleasy - 26/02/2009 19:17 (laatste wijziging 26/02/2009 19:30)
Avatar van simpleasy Lid volgens mij kan ik het van hieruit ook als ik effe heel lang zoek, dus ik ga pas hier kijken als ik het echt niet vind 
dus als er niet meteen antwoord is is omdat ik zelf nog aan het zoeken ben, leer ik meer van ;)
edit:
ik heb nu dit:
  1. 'Variabelen die je nodig hebt declareren
  2. Dim x As Integer = 1
  3. Dim strOutput As String = String.Empty
  4. 'Tellertje voor hoeveel keer je wilt herhalen
  5. For j As Integer = 1 To 2 Step 1
  6. 'Tellertje voor het alfabet
  7. For i As Integer = 97 To 122 Step 1
  8. x = 1
  9. strOutput = String.Empty
  10. 'Met deze While-loop ga je zien aan de hand van het
  11. 'eerste tellertje hoeveel keer de letter in een item moet
  12. 'voorkomen
  13. While x <= j
  14. Dim i2 As Integer = 97
  15. While i2 <= 122
  16. strOutput &= Microsoft.VisualBasic.ChrW(i2)
  17. End While
  18. x = x + 1
  19. End While
  20. 'Item toevoegen aan de lijst
  21. ListBox1.Items.Add(strOutput)
  22. Next
  23. Next

het is ontzettend sloom dus heb ik die eerste for loop al veranderd (zoals je wel kan zien waarschijnlijk)
maar nu is hij al 2 minuten aan het berekenen, dus ofterwel is mijn script zeer sloom ofterwel is er iets verkeerd, maar ik kan dus niet kijken wat er verkeerd is want ik krijg geen uitkomst 
Offline Abbas - 26/02/2009 22:24 (laatste wijziging 27/02/2009 13:39)
Avatar van Abbas Gouden medaille

Crew .NET
Dit is een code die ik nu heb, en die is helemaal niet sloom. Eerst wordt het alfabet aan de lijst toegevoegd. Daarna ga je de "Letter-Loop" door en die letter zet je voor de letters van het alfabet, die letters worden opgehaald en in een lijst gestoken van. Als je nu van 'aaa' tot 'zzz' wilt gaan, dat raad ik u niet aan want dan ga je geheugen vreten! 

  1. 'Alfabet aan de lijst toevoegen
  2. For i As Integer = 97 To 122 Step 1
  3. ListBox1.Items.Add(Microsoft.VisualBasic.ChrW(i))
  4. Next
  5. 'Variabele Lijst declareren van het type String
  6. Dim itemLijst As New List(Of String)
  7. 'Letter-loop doorgaan
  8. For j As Integer = 97 To 122 Step 1
  9. 'Loopen van 0 tot 25
  10. For itemNr As Integer = 0 To 25 Step 1
  11. 'aan de variabele lijst de huidige letter toevoegen plus
  12. 'dan elke keer de volgende letter van het alfabet
  13. itemLijst.Add(Microsoft.VisualBasic.ChrW(j) & ListBox1.Items(itemNr).ToString())
  14. Next
  15. 'Items toevoegen aan de lijst
  16. For Each listItem As String In itemLijst
  17. ListBox1.Items.Add(listItem)
  18. Next
  19. 'Variabele lijst leegmaken (voor de volgende)
  20. itemLijst.Clear()
  21. Next

Dit werkt perfect, voor drie letters moet je gewoon nog een Loop nesten, maar dan zit je al met héél véél berekeningen!

Edit:
Je kan heel de code ook in een recursieve functie gaan steken en via een parameter dan gaan zien hoe ver je wilt gaan, maar zoals ik al zei: vanaf je verder gaat dan 2 (3 of meer dus...) zit je al met heel wat bewerkingen en dat kost een pak geheugen! 
Offline mothh - 27/02/2009 14:55
Avatar van mothh Onbekend als wij het zeggen is het toch niet echt meer een uitdaging?
Offline Ontani - 27/02/2009 15:03 (laatste wijziging 27/02/2009 15:12)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Ik denk dat ik een kortere maar sneller manier heb titjes.

effe te goei testen.

Edit: Niet korter, die code tag gaf een vals beeld met z'n extra enters.

Edit2: Deze werkt wel perfect:

  1. Dim lst As New List(Of String)
  2. Dim lstTemp As New List(Of String)
  3. Dim lst2 As New List(Of String)
  4.  
  5. For i As Integer = 97 To 122
  6. lst.Add(ChrW(i))
  7. Next
  8.  
  9. lst2.AddRange(lst.ToArray())
  10. For i As Integer = 0 To 2
  11. For Each itm As String In lst
  12. For j As Integer = 97 To 122
  13. lstTemp.Add(itm & ChrW(j))
  14. Next
  15. Next
  16. lst.Clear()
  17. lst.AddRange(lstTemp.ToArray())
  18. lst2.AddRange(lstTemp.ToArray())
  19. lstTemp.Clear()
  20. Next
  21.  
  22. Dim str As New StreamWriter("list.txt")
  23.  
  24. For Each itm As String In lst2
  25. str.WriteLine(itm)
  26. Next
  27.  
  28. str.Flush()
  29. str.Dispose()


Let wel op dat deze lijst 2,2 Mb groot voor a tot zzzz
voor een lijst tot zzzzz zou dit ongeveer 450 Mb.
Offline simpleasy - 27/02/2009 15:06 (laatste wijziging 27/02/2009 15:37)
Avatar van simpleasy Lid ik heb die van titjes nu geprobeert, en die werkt perfect 
maar als je nu een langere lijst wilt van ook nog 3 letters achter elkaar, of 4, of zelfs nog meer, hoe doe je dat dan?
ik schaam me nu wel eigenlijk dat ik zelf niets vind, hoewel ik wel altijd probeer...
maarjah, ik ben dan ook nog niet zo lang bezig 

edit: ik heb de code van titjes kunnen aanpassen zodat het werkt met 3 letters
maar als je nog verder wilt gaan word het elke keer bijna dubbel zo lang..

nog een edit: die code van Ontani heb ik nu geprobeert en dan krijg ik een error:
type 'streamwriter' is not defined
(dit staat in deze regel:
  1. Dim str As New StreamWriter("list.txt")

)
en die code van titjes, ik heb hem nu uitgebreid tot 5 letters, maar nu is hij zodanig sloom dat hij na 5 minuten zelfs vastloopt...  
Offline Ontani - 27/02/2009 15:39
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
je moet

Imports System.IO

effe toevoegen bovenaan
Offline simpleasy - 27/02/2009 15:43
Avatar van simpleasy Lid waar ergens maakt hij die lijst nu? voor zover ik die code snap maakt hij ergens een tekstducumentje ofzo, maar waar staat die dan?
Offline Ontani - 27/02/2009 15:47
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
in je directory waar je exe gecompiled wordt.

maak daar effe van StreamWriter("C:/list.txt")

dan vind je em iets gemakkelijker
Offline simpleasy - 27/02/2009 16:07
Avatar van simpleasy Lid wow, hij is echt wel snel blijkbaar en hoe maak ik dat hij ook combinaties doet van 5 of meer letters?
Offline Ontani - 27/02/2009 16:15 (laatste wijziging 27/02/2009 16:59)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Bij die 0 To 2 het laatste cijfer verhogen.

2 = 4 letters
3 = 5 letters
4 = 6 letters
enz...

Edit: ben wel eens benieuwd naar de bestandsgrootte van 5 of 6 letters.

Edit: heb net eens ruw weg uitgeteld:
((26^1) * 1) + ((26^2) * 2) + ((26^3) * 3) + ((26^4) * 4) + ((26^5) * 5) + ((26^6) * 6) + (2 * ((26^1) + (26^2) + (26^3) + (26^4) + (26^5) + (26^6))) = 2 557 328 358 letters
Offline simpleasy - 27/02/2009 17:03
Avatar van simpleasy Lid is het mogenlijk om een progress bar te maken bij zo'n code? ik heb al tutorials gevonden over hoe een progress bar maken met een timer, maar echt met iets waarbij je het nodig hebt niet
Offline Ontani - 27/02/2009 18:31
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Dat gaat maar dan moet je die actie in een thread uitvoeren.
Offline Mario - 10/03/2009 11:08
Avatar van Mario Crew algemeen Ik vond het eigenlijk wel een uitdaging dus heb ik er ook effe op gezocht en ben op het volgende uitgekomen :

  1. While ContinueLoop
  2. Dim SplittedStartpoint() As String = Collector.Split
  3.  
  4. For i As Integer = AscW(SplittedStartpoint(SplittedStartpoint.Length - 1).ToString) + 1 To 122
  5. SplittedStartpoint(SplittedStartpoint.Length - 1) = ChrW(i)
  6. Collector = Join(SplittedStartpoint)
  7. Next
  8.  
  9. Dim AddDigit As Boolean = True
  10.  
  11. For MyPosition As Integer = SplittedStartpoint.Length To 1 Step -1
  12. If SplittedStartpoint(MyPosition - 1) = "z" Then
  13. SplittedStartpoint(MyPosition - 1) = "a"
  14. Else
  15. SplittedStartpoint(MyPosition - 1) = ChrW(AscW(SplittedStartpoint(MyPosition - 1)) + 1)
  16. AddDigit = False
  17. Exit For
  18. End If
  19. Next
  20.  
  21. If AddDigit Then
  22. Collector = Join(SplittedStartpoint) & " a"
  23. Else
  24. Collector = Join(SplittedStartpoint)
  25. End If
  26. End While


Hij zal zolang code genereren als je wil (van a tot zzzzzzzz...).
Ik heb hem even laten lopen voor 5 digits en dat duurde +/- 8 minuten en gaf een txt file van 83 Mbyte  

hier LINK vind je de zowel de executable als het volledig project ingeval je zelf wilt testen/uitproberen. (vb.net 2008)

Het programma zelf is met een progressbar en threaded , al komt van dat laatste niet veel in huis aangezien hij zoveel schrijfbewerkingen moet doen...

Topic mag nu wel gesloten worden denk ik  

greetzzzz
RedThread
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.203s