Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Double Array nacheinander hochzählen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 18.01.2015, 21:10    Titel: Double Array nacheinander hochzählen Antworten mit Zitat

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 traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.01.2015, 21:24    Titel: Antworten mit Zitat

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. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 18.01.2015, 21:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.01.2015, 21:49    Titel: Antworten mit Zitat

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. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 19.01.2015, 10:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 19.01.2015, 20:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 19.01.2015, 22:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 20.01.2015, 12:04    Titel: Antworten mit Zitat

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. verwundert 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. grinsen

@dreael:
Das ist deutlich eleganter als meine Lösung! Daumen rauf! 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz