Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 18.01.2015, 21:10 Titel: Double Array nacheinander hochzählen |
|
|
Ich zerbreche mir schon seit paar std den kopf...
Ich habe versucht in einem array aus double zahlen die nacheinander hochgezählt werden sollen einen algo zu proggen aber ich bin bisher gescheitert. Ich möchte es ungern mit mehreren verschachtelten for schleifen machen weil die array grösse anpassbar sein sollte.
zb soll das so ablaufen
[0.0] [0.0] [0.0]..
[1.0][0.0] [0.0]...
...
..
Wenn nun das erste 10.0 zb hat soll es auf 0.0 gesetzt werden und das zweite 1.0 auf addiert usw immer bis alle array irgentwann auf [10.0] sind..
Klar mit verschachtelten vorschleifen geht sowas aber es muss auch anders gehen nur komme ich auf keinen vernüpftigen algo  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.01.2015, 21:24 Titel: |
|
|
hmm, ich habe keine Ahnung, ob ich dich richtig verstanden habe ... aber wenn ja, dann würde ich folgendermaßen vorgehen:
Code: | DO
FOR i AS INTEGER = LBOUND(array) TO UBOUND(array)
array(i) += 1
IF array(i) > 10.0 THEN
array(i) = 0 ' und beim nächsten Feldeintrag fortfahren
ELSE
EXIT FOR ' spätere Einträge nicht weiter bearbeiten
END IF
NEXT
LOOP UNTIL array(UBOUND(array)) >= 10 ' letzter Eintrag auf Maximum |
edit: Die Abbruchbedingung stimmt noch nicht, wie ich sehe; aber das findest du vielleicht jetzt selbst heraus.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 18.01.2015, 21:37 Titel: |
|
|
hmmm setzt er nicht immer nur das vordere array hoch?
am ende sollen zb alle arrays 10 haben
array[0] = 10.0
array[1] = 10.0
array[2] = 10.0
array[3] = 10.0
array[4] = 10.0
Das hochzählen soll wie so nen uhr prinzip funktionieren erst das array[0] von 0.0 bis 10.0 dann das nächste + 1 und array [0] wieder auf 0 setzen und soweiter bis das letzte array den max wert hat, |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.01.2015, 21:49 Titel: |
|
|
Er setzt immer das vordere Array hoch, und wenn dieses bereits auf 10 war, das nächste (und wenn dieses bereits auf 10 war, das nächste, und wenn dieses bereits auf 10 war, das nächste ...)
Mit der richtigen Abbruchbedingung endet er bei 10, 10, 10, ..., 10, 10
(jetzt mit der falschen Bedingung endet er schon bei 0, 0, 0, ..., 0, 10)
Lass dir doch einfach vor jedem LOOP den Array-Inhalt ausgeben; dann siehst du, ob das Programm macht, was du willst.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 19.01.2015, 10:49 Titel: |
|
|
So funktioniert es
Code: | Dim As Double array(3)
Do
array(LBound(array)) += 1.0
For x As Integer = LBound(array) To UBound(array) - 1
If array(x) > 10.0 Then
If x = UBound(array) - 1 And array(UBound(array)) = 10.0 Then
Exit Do
EndIf
array(x + 1) += 1.0
array(x) = 0.0
Else
Exit For
EndIf
Next
'zur kontrolle
Locate 1,1,0
For x As Integer = LBound(array) To UBound(array)
Print array(x);" "
Next
'Sleep 100
Loop
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 19.01.2015, 20:23 Titel: |
|
|
Ich hatte es ein bisschen anders gelöst; im Prinzip läuft es aber auf dasselbe heraus.
Code: | DIM AS DOUBLE array(3)
DO
FOR i AS INTEGER = LBOUND(array) TO UBOUND(array)
array(i) += 1
IF array(i) > 10.0 THEN
IF i = UBOUND(array) THEN EXIT DO
array(i) = 0 ' und beim nächsten Feldeintrag fortfahren
ELSE
EXIT FOR ' spätere Einträge nicht weiter bearbeiten
END IF
NEXT
FOR i AS INTEGER = LBOUND(array) TO UBOUND(array)
PRINT array(i);
NEXT
PRINT
LOOP ' letzter Eintrag auf Maximum |
Man sollte vielleicht dazu sagen, dass sowohl bei meiner als auch bei grindstones Lösung die Array-Belegung nach der Schleife nicht auf 10,10,10...10 liegt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 19.01.2015, 22:47 Titel: |
|
|
0oFreako0 hat Folgendes geschrieben: | zb soll das so ablaufen
[0.0] [0.0] [0.0]..
[1.0][0.0] [0.0]... |
nemored hat Folgendes geschrieben: | hmm, ich habe keine Ahnung, ob ich dich richtig verstanden habe ... |
@0oFreako0: Soll das Ziel demfall eine Art Tonbandzählwerk ergeben, jedes Array-Element eine Ziffer, der niedrigste Index die Einer, nächstes Element die Zehner, drittes die Hunderter?
Falls ja, dann ist die Sache nur halb so wild. Mit dem starren Ansatz der verschachtelten For-Schleifen hast Du die Idee bereits selber geliefert:
Code: | ' Einfacher Zähler
Dim z0 As Integer, z1 As Integer, z2 As Integer
' Primitiv-Ansatz (Problem starre Ziffernzahl)
For z2 = 0 To 9
For z1 = 0 To 9
For z0 = 0 To 9
' Ausgeben
Print Chr(48 + z2, 48 + z1, 48 + z0)
Next z0
Next z1
Next z2 |
Lösung: Die For-Schleifen liefern Dir bereits die Grundidee, aber jetzt musst Du deren Tiefe mittels Rekursion noch flexibel machen:
Code: | ' Flexibler Ansatz mittels Rekursion
Dim z(3) As Integer
Sub Zaehlen(z() As Integer, ind As Integer)
Dim i As Integer
If ind < LBound(z) Then
' Innerste Ebene erreicht => ausgeben
For i=UBound(z) To LBound(z) Step -1
Print Chr(48 + z(i));
Next i
Print
Else
For i=0 To 9 ' Direktes "For z(ind)=0 To 9" geht nicht...
z(ind) = i
Zaehlen z(), ind - 1
Next i
EndIf
End Sub
Zaehlen z(), UBound(z) |
In diesem Fall lässt sich die Ziffernzahl unseres Zählers frei einstellen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 20.01.2015, 12:04 Titel: |
|
|
nemored hat Folgendes geschrieben: | Man sollte vielleicht dazu sagen, dass sowohl bei meiner als auch bei grindstones Lösung die Array-Belegung nach der Schleife nicht auf 10,10,10...10 liegt. | Du hast recht, da habe ich gar nicht drauf geachtet. Man sollte die Abbruchbedingung besser vor dem Hochzählen prüfen: Code: | Dim As Double array(3)
Do
For x As Integer = LBound(array) To UBound(array)
If array(x) <> 10.0 Then
Exit For
ElseIf x = UBound(array) Then
Exit Do
EndIf
Next
array(LBound(array)) += 1.0
For x As Integer = LBound(array) To UBound(array) - 1
If array(x) > 10.0 Then
array(x + 1) += 1.0
array(x) = 0.0
Else
Exit For
EndIf
Next
'zur kontrolle
Locate 1,1,0
For x As Integer = LBound(array) To UBound(array)
Print array(x);" "
Next
'Sleep 100
Loop
Print
For x As Integer = LBound(array) To UBound(array)
Print array(x);" "
Next
Sleep | Dann klappt's auch mit dem Endstand.
@dreael:
Das ist deutlich eleganter als meine Lösung! Die Schleife zählt allerdings nur bis 9.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
|