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
For counter=1 to 100 step 1
ListBox1.Items.Add (counter)
Next
For counter=1to100step1
ListBox1.Items.Add(counter)
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
Abbas - 26/02/2009 18:08 (laatste wijziging 26/02/2009 18:23)
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).
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...
Abbas - 26/02/2009 18:58 (laatste wijziging 26/02/2009 19:03)
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
'Variabelen die je nodig hebt declareren
Dim x As Integer = 1
Dim strOutput As String = String.Empty
'Tellertje voor hoeveel keer je wilt herhalen
For j As Integer = 1 To 5 Step 1
'Tellertje voor het alfabet
For i As Integer = 97 To 122 Step 1
x = 1
strOutput = String.Empty
'Met deze While-loop ga je zien aan de hand van het
'eerste tellertje hoeveel keer de letter in een item moet
'voorkomen
While x <= j
strOutput &= Microsoft.VisualBasic.ChrW(i)
x = x + 1
End While
'Item toevoegen aan de lijst
ListBox1.Items.Add(strOutput)
Next
Next
'Variabelen die je nodig hebt declareren
Dim x AsInteger=1
Dim strOutput AsString=String.Empty
'Tellertje voor hoeveel keer je wilt herhalen
For j AsInteger=1To5Step1
'Tellertje voor het alfabet
For i AsInteger=97To122Step1
x =1
strOutput =String.Empty
'Met deze While-loop ga je zien aan de hand van het
'eerste tellertje hoeveel keer de letter in een item moet
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
....
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:
'Variabelen die je nodig hebt declareren
Dim x As Integer = 1
Dim strOutput As String = String.Empty
'Tellertje voor hoeveel keer je wilt herhalen
For j As Integer = 1 To 2 Step 1
'Tellertje voor het alfabet
For i As Integer = 97 To 122 Step 1
x = 1
strOutput = String.Empty
'Met deze While-loop ga je zien aan de hand van het
'eerste tellertje hoeveel keer de letter in een item moet
'voorkomen
While x <= j
Dim i2 As Integer = 97
While i2 <= 122
strOutput &= Microsoft.VisualBasic.ChrW(i2)
End While
x = x + 1
End While
'Item toevoegen aan de lijst
ListBox1.Items.Add(strOutput)
Next
Next
'Variabelen die je nodig hebt declareren
Dim x AsInteger=1
Dim strOutput AsString=String.Empty
'Tellertje voor hoeveel keer je wilt herhalen
For j AsInteger=1To2Step1
'Tellertje voor het alfabet
For i AsInteger=97To122Step1
x =1
strOutput =String.Empty
'Met deze While-loop ga je zien aan de hand van het
'eerste tellertje hoeveel keer de letter in een item moet
'voorkomen
While x <= j
Dim i2 AsInteger=97
While i2 <=122
strOutput &= Microsoft.VisualBasic.ChrW(i2)
EndWhile
x = x +1
EndWhile
'Item toevoegen aan de lijst
ListBox1.Items.Add(strOutput)
Next
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
Abbas - 26/02/2009 22:24 (laatste wijziging 27/02/2009 13:39)
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!
'Alfabet aan de lijst toevoegen
For i As Integer = 97 To 122 Step 1
ListBox1.Items.Add(Microsoft.VisualBasic.ChrW(i))
Next
'Variabele Lijst declareren van het type String
Dim itemLijst As New List(Of String)
'Letter-loop doorgaan
For j As Integer = 97 To 122 Step 1
'Loopen van 0 tot 25
For itemNr As Integer = 0 To 25 Step 1
'aan de variabele lijst de huidige letter toevoegen plus
'dan elke keer de volgende letter van het alfabet
itemLijst.Add(Microsoft.VisualBasic.ChrW(j) & ListBox1.Items(itemNr).ToString())
Next
'Items toevoegen aan de lijst
For Each listItem As String In itemLijst
ListBox1.Items.Add(listItem)
Next
'Variabele lijst leegmaken (voor de volgende)
itemLijst.Clear()
Next
'Alfabet aan de lijst toevoegen
For i AsInteger=97To122Step1
ListBox1.Items.Add(Microsoft.VisualBasic.ChrW(i))
Next
'Variabele Lijst declareren van het type String
Dim itemLijst AsNew List(Of String)
'Letter-loop doorgaan
For j AsInteger=97To122Step1
'Loopen van 0 tot 25
For itemNr AsInteger=0To25Step1
'aan de variabele lijst de huidige letter toevoegen plus
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!
Dim lst As New List(Of String)
Dim lstTemp As New List(Of String)
Dim lst2 As New List(Of String)
For i As Integer = 97 To 122
lst.Add(ChrW(i))
Next
lst2.AddRange(lst.ToArray())
For i As Integer = 0 To 2
For Each itm As String In lst
For j As Integer = 97 To 122
lstTemp.Add(itm & ChrW(j))
Next
Next
lst.Clear()
lst.AddRange(lstTemp.ToArray())
lst2.AddRange(lstTemp.ToArray())
lstTemp.Clear()
Next
Dim str As New StreamWriter("list.txt")
For Each itm As String In lst2
str.WriteLine(itm)
Next
str.Flush()
str.Dispose()
Dim lst AsNew List(Of String)
Dim lstTemp AsNew List(Of String)
Dim lst2 AsNew List(Of String)
For i AsInteger=97To122
lst.Add(ChrW(i))
Next
lst2.AddRange(lst.ToArray())
For i AsInteger=0To2
ForEach itm AsString In lst
For j AsInteger=97To122
lstTemp.Add(itm &ChrW(j))
Next
Next
lst.Clear()
lst.AddRange(lstTemp.ToArray())
lst2.AddRange(lstTemp.ToArray())
lstTemp.Clear()
Next
DimstrAsNew StreamWriter("list.txt")
ForEach itm AsString In lst2
str.WriteLine(itm)
Next
str.Flush()
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.
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:
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
While ContinueLoop
Dim SplittedStartpoint() As String = Collector.Split
For i As Integer = AscW(SplittedStartpoint(SplittedStartpoint.Length - 1).ToString) + 1 To 122
SplittedStartpoint(SplittedStartpoint.Length - 1) = ChrW(i)
Collector = Join(SplittedStartpoint)
Next
Dim AddDigit As Boolean = True
For MyPosition As Integer = SplittedStartpoint.Length To 1 Step -1
If SplittedStartpoint(MyPosition - 1) = "z" Then
SplittedStartpoint(MyPosition - 1) = "a"
Else
SplittedStartpoint(MyPosition - 1) = ChrW(AscW(SplittedStartpoint(MyPosition - 1)) + 1)
AddDigit = False
Exit For
End If
Next
If AddDigit Then
Collector = Join(SplittedStartpoint) & " a"
Else
Collector = Join(SplittedStartpoint)
End If
End While
While ContinueLoop
Dim SplittedStartpoint()AsString= Collector.Split
For i AsInteger=AscW(SplittedStartpoint(SplittedStartpoint.Length-1).ToString)+1To122
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...