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:

Vorzeitiger Ausstieg aus Mehrfachschleifen

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



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 29.12.2023, 20:24    Titel: Vorzeitiger Ausstieg aus Mehrfachschleifen Antworten mit Zitat

Hallo Qbasic-Freunde,
hier mal wieder eine fachliche Anfrage.

Angenommen ich habe ein zweidimensionales Feld namens Zelle(i, j) definiert. (mit i = 1 bis 9, und j = 1 bis 9)
Je nach i und j sei die Zelle(i,j) mit einem bestimmten Wert belegt.

Ich suche diejenige Zelle(i, j), in der ein bestimmter, gesuchter Wert steht. Diesen Wert nenne ich mal "Eigenschaft".

Das habe ich bisher wie folgt versucht, zu lösen:
i=0
for i=1 to 9
j=0
for j=1 to 9
if Zelle(i, j) = "Eigenschaft" then
'Ich habe bei i und j die Zelle mit gewünschter Eigenschaft gefunden
'Ich merke mir i und j, um damit weiterrechnen zu können.
z =i: s=j (z und s als neue Variablen, zur Vermeidung von
Indexfehlern mit i und j)

Wenn z.B. z=i=2 und s=j=1 ist, ist es doch nicht nötig, i und j
trotzdem jeweils noch bis zur 9 durchlaufen zu lassen.

Ich würde also jetzt mit
exit for:exit for
komplett aus dieser Doppelschleife austeigen.
endif
next
next

Der folgende Befehl:
print using"#:#";z;s müßte jetzt also 2:1 als Ergebnis liefern,
eben genau das, womit es gilt weiter zu rechnen.

Passiert aber nicht! Mindestens eine der beiden Variablen z , s landet trotzdem noch bei 9. Warum? Ich bin doch bei z=2 und s=1 mit
exit for:exit for schon komplett aus dieser Doppelschleife ausgestiegen, oder etwa doch nicht?

Wie kann das sein? Was passt hier nicht richtig zusammen?

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 29.12.2023, 20:56    Titel: Antworten mit Zitat

Du kannst auch etwas auf WHILE-Basis nehmen, z.B.
Code:

Dim As Integer i, j, z, s
Dim As String zelle(1 To 9, 1 To 9)

z = -1
i = 1
While i <= 9 And z = -1
  j = 1
  While j <= 9 And z = -1
    If zelle(j, i)="Eigenschaft" Then
      z = i
      s = j
    End If
    j += 1
  Wend
  i += 1
Wend


Kurze Erklärung: Merkvariable mit Wert vorintialisieren, den es nicht gibt, hier -1. Somit bedeutet -1 auch "nicht gefunden". FOR hier durch eine WHILE-Konstruktion ersetzt, weil so zusätzlich z geprüft werden kann.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 29.12.2023, 23:01    Titel: Antworten mit Zitat

Hallo dreael,
vielen Dank für deine schnelle Antwort.
Leider präsentiert sie mir Dinge, die mir zuvor völlig unbekannt waren, weshalb ich das ganze auch nicht wirklich verstehe.

'1) Dim as integer i,j,z,s
Ich kenne nur Dim (eventuell shared) i,j,z,s as integer.
Scheint vom Syntax her aber offenbar egal zu sein.

'2) Was ist der Unterschied zwischen While-Wend und For-Next?

'3) Müßte neben z = -1 nicht auch s = -1 vorgegeben werden?

'4) Der Syntax j +=1 bzw. i +=1 begegnet mir hier zum ersten Mal.

Sorry, aber wegen dieser 4 Punkte konnte ich (als Laie) deiner kurzen Erklärung geistig leider nicht wirklich folgen. (Habe es ja nie studiert.)
Deine Darlegungen sind für mich ein einziger "Bömischer Wald".

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 30.12.2023, 00:34    Titel: Antworten mit Zitat

Zu 1)
DIM AS INTEGER i, j, z, s
funktioniert, glaube ich, nicht in QBasic (sondern nur in FreeBASIC). In QBasic wäre es wohl stattdessen
DIM i AS INTEGER, j AS INTEGER, z AS INTEGER, s AS INTEGER

Zu 2)
FOR...NEXT führt eine eigene Zählvariable mit, durch die festgelegt wird, wie oft die Schleife durchlaufen wird. Das bedeutet, du hast eine fest gegebene Anzahl an Durchläufen, die vor Beginn der Schleife feststeht.
Bei WHILE...WEND kannst du jede beliebige Laufbedingung nehmen: Die Schleife wird so lange durchlaufen, wie die Laufbedingung erfüllt ist. Das ist deutlich flexibler als FOR...NEXT, dafür muss man sich um den Schleifenabbruch auch selbst kümmern. Welche der beiden Schleifentypen besser geeignet ist, hängt von der konkreten Situation ab.

Zu 3)
Ich habe das Programm nur kurz überflogen; z=-1 ist notwendig, damit die Schleifen überhaupt durchlaufen werden, denn als Bedingung für das Durchlaufen der Schleifen muss ja unter anderem z=-1 sein. s=-1 ist für den Programmablauf nicht nötig. Ob es aber trotzdem - für die Auswertung des Ergebnisses - sinnvoll sein könnte, zu Beginn s=-1 zu setzten, kann ich auf die Schnelle nicht sagen. Letztendlich wahrscheinlich nicht nötig, da es reicht, z auszuwerten; je nach eigenen Bedürfnissen vielleicht trotzdem sinnvoll.

Zu 4)
Auch i+=1 existiert, glaube ich, in QBasic noch nicht. Es ist eine Kurzschreibweise für i=i+1.


Und noch zur Ausgangsfrage:
Ausstieg aus zwei FOR-Schleifen gleichzeitig funktioniert in QBasic leider auch nicht (in FreeBASIC dagegen schon). Alternativ dazu könntest du dir merken, dass du aussteigen willst:
Code:
ausstieg = 0
FOR i = 1 TO 9
  FOR j = 1 TO 9
    IF bedingung=erfuellt THEN
      ausstieg = 1
      EXIT FOR
    END IF
    ' ...
  NEXT
  IF ausstieg = 1 THEN EXIT FOR
  ' ...
NEXT

_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 30.12.2023, 01:18    Titel: Antworten mit Zitat

Hallo Revilo,

so würde es funktionieren, und die Zuweisung der Indices an andere Variablen wäre auch überflüssig:

Code:
DIM zelle(10, 10) AS STRING
zelle(2, 1) = "Eigenschaft"

beenden = 0
i = 0
FOR i = 1 TO 9
   j = 0
   FOR j = 1 TO 9
      IF zelle(i, j) = "Eigenschaft" THEN
         z = i: s = j: beenden = 1
      END IF
      IF beenden THEN EXIT FOR
   NEXT
   IF beenden THEN EXIT FOR
NEXT
PRINT
PRINT z; ":"; s
PRINT i; ":"; j

aber ich sehe gerade, nemored war schneller. lächeln

Code:
DIM a, b, c AS INTEGER
funktioniert auch in QBasic, allerdings nicht
Code:
DIM AS INTEGER a, b, c
In FreeBASIC wäre beides möglich.

Ansonsten ist nemoreds Erklärungen nichts hinzuzufügen.

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: 4597
Wohnort: ~/

BeitragVerfasst am: 30.12.2023, 01:33    Titel: Antworten mit Zitat

Allerdings bin ich mir nicht sicher, ob
Code:
DIM a, b, c AS INTEGER

auch das macht, was man auf den ersten Blick erwartet. QBasic braucht ja keine explizite Typendeklarierung, also gehe ich davon aus, dass mit obiger Befehlszeile nur c sicher als Integer deklariert wird, a und b dagegen abhängig von der Standarddeklaration - oder irre ich mich da?
_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 30.12.2023, 02:39    Titel: Antworten mit Zitat

Stimmt tatsächlich! verwundert
Code:
DIM a, b, c AS INTEGER
a = 1.1
b = 1.2
c = 1.3
PRINT a; b; c

liefert als Ausgabe
Code:
1.1 1.2 1


Nach den Fehlern, die durch solche Seiteneffekte entstehen, kann man sich totsuchen. Nur gut, daß FB zumindest diesen Fallstrick vermeidet. zwinkern

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
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 30.12.2023, 03:01    Titel: Antworten mit Zitat

Hallo nemored, hallo grindstone,
vielen Dank für eure schnelle Antwort.
Ihr hattet beide die gleiche gute Idee, einfach eine Flag-Variable zu nutzen.
Bei dir, nemored, heißt sie ausstieg.
Bei dir, grindstone, beenden. Ist aber vom Prinzip her dasselbe.

Vielen Dank euch beiden für den Hinweis, daß der Freebasic-Syntax in Qbasic nicht funktioniert. Das erspart mir einen Haufen unnötiger Sucherei und unnötige Nachfragen im Forum.

Offenbar kommt Qbasic mit meinem Syntax "exit for:exit for" nicht zurecht.
Wenn ich das richtig verstanden habe, muß ich also jede Teil-Schleife,
die für i und die für j separat, jede für sich, mit "exit for" beenden.
Ich muß also besagte Flag-Variable nacheinander sowohl auf i und danach auf j anwenden. Richtig?

Eure "fast" identischen Lösungen sorgen auf jeden Fall dafür, daß ich meinen gewohnten Programmier-Stil mit "For-Next-Schleifen" beibehalten kann. Es erspart mir also das Umlernen auf "While - Wend".
Dafür gebührt euch beiden mein besonderer Dank.

Nemored, speziell zu dir:
Den Syntax DIM (eventuell shared) i,j,x,y AS INTEGER nutze ich in
Qbasic schon solange ich mich überhaupt mit Programmierung befasse.
Bisher funktionierte er, entgegen deiner Befürchtung, für alle Variablen völlig sauber, also nicht nur für die letzte (hier y).
Vielleicht hilft es dir irgend wie weiter, dies zu wissen.

Ich wünsche allen Forums-Teilnehmern einen guten Rutsch ins neue Jahr,
aber euch beiden besonders. Bleibt gesund.

Mit netten Grüßen Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 30.12.2023, 03:35    Titel: Antworten mit Zitat

Hallo grindstone,
das Thema "Seitenfehler" ist für alle Nutzer bestimmt immer wieder sehr
nervig, mich eingeschlossen.

Hast du irgend eine Idee, warum für a,b,c
nicht 1.1 , 1.2, 1.3 (wie erwartet) , sondern 1.1 , 1.2 und 1 (statt 1.3)
ausgegeben wird?

Auf das Ergebnis eines Programms muß man sich letztlich auch verlassen können. Andernfalls steht doch die Funktionalität des gesamten Proramms infrage.


Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 30.12.2023, 11:08    Titel: Antworten mit Zitat

Zitat:
Offenbar kommt Qbasic mit meinem Syntax "exit for:exit for" nicht zurecht.

Hintergrundinformation: Mit dem ersten EXIT FOR wird die Schleife verlassen - das Programm kommt also gar nicht bis zum zweiten EXIT FOR.

Zitat:
Ich muß also besagte Flag-Variable nacheinander sowohl auf i und danach auf j anwenden. Richtig?

Die innere Schlefe könntest du ganz normal verlassen; da spielt die Flag-Variable keine Rolle. Um aber die äußere Schleife ebenfalls zu verlassen, muss die Flag-Variable gesetzt sein, und gesetzt wird sie vor dem Verlassen der inneren Schleife.
Code:
Äußere Schleife
    Innere Schleife
        Ist die Abbruchbedingung erfüllt?
        Wenn ja: Setze Flag (für später) und verlasse die innere Schleife
    Ende der inneren Schleife

    'wieder zurück in der äußeren Schleife
    Ist die Flag gesetzt?
    Wenn ja: Verlasse die äußere Schleife
Ende der äußeren Schleife


Zitat:
Hast du irgend eine Idee, warum für a,b,c
nicht 1.1 , 1.2, 1.3 (wie erwartet) , sondern 1.1 , 1.2 und 1 (statt 1.3)
ausgegeben wird?

Erwartet worden wäre nicht die Ausgabe 1.1, 1.2, 1.3, sondern die Ausgabe 1, 1, 1 - es soll sich ja um Integer (also Ganzzahlen) handeln.
QBasic verwendet als Datentyp standardmäßig SINGLE (Gleitkommazahl mit einfacher Genauigkeit). Ein
Code:
DIM a

erzeugt also eine Single-Variable namens a (sofern du vorher kein DEFINT, DEFSTR oder sonstiges einsetzt). Mit dem Befehl
Code:
DIM a, b, c AS INTEGER

legst du drei Variablen an, und zwar a und b nach Standarddeklaration (also Single) und c als Integer. Dass es bei dir bisher "für alle Variablen völlig sauber" funktioniert hat, liegt daran, dass ein Single-Wert problemlos in einen Integer-Wert transformiert werden kann. Spätestens, wenn du "echte Integer-Dinge" machen willst - z. B. automatisches Runden bei einer Division - wird es Probleme geben.
_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 30.12.2023, 15:16    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Spätestens, wenn du "echte Integer-Dinge" machen willst - z. B. automatisches Runden bei einer Division - wird es Probleme geben.

Hier mal ein ganz einfaches Beispiel:
Code:
DIM a, b, c AS INTEGER
DIM x AS SINGLE

x = 1.3
a = x
b = x
c = x
PRINT
PRINT a, b, c

x = 1.7
a = x
b = x
c = x
PRINT a, b, c
Das Gemeine an solchen Fehlern ist, daß sie nur zeitweise auftreten und deshalb oft eine ganze Weile unbemerkt bleiben.

Revilo hat Folgendes geschrieben:
Offenbar kommt Qbasic mit meinem Syntax "exit for:exit for" nicht zurecht.
In FreeBASIC gäbe es dafür die Syntax
Code:
Exit For, For
(Nein, ich käme niiiiiiiie auf die Idee, für FreeBASIC Werbung zu machen, auch wenn die compilierten Programme etwa um den Faktor 100 schneller laufen als bei QBasic. zwinkern )

Revilo hat Folgendes geschrieben:
Eure "fast" identischen Lösungen sorgen auf jeden Fall dafür, daß ich meinen gewohnten Programmier-Stil mit "For-Next-Schleifen" beibehalten kann. Es erspart mir also das Umlernen auf "While - Wend".
For...Next und While...Wend sind eigentlich zwei ganz unterschiedliche Dinge - auch wenn man es so hinbiegen kann, daß sich das eine wie das andere verhält.

Statt While...Wend bevorzuge ich übrigens Do...Loop, weil man dort die Abbruchbedingung wahlweise sowohl am Anfang als auch am Ende prüfen kann, während dies bei While...Wend nur am Anfang möglich ist.

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: 4597
Wohnort: ~/

BeitragVerfasst am: 30.12.2023, 21:28    Titel: Antworten mit Zitat

Zitat:
Statt While...Wend bevorzuge ich übrigens Do...Loop, weil man dort die Abbruchbedingung wahlweise sowohl am Anfang als auch am Ende prüfen kann, während dies bei While...Wend nur am Anfang möglich ist.

Tatsächlich kann ich mich in den QBasic-Zeiten nur an ein einziges Mal erinnern, dass ich WHILE...WEND verwendet habe - nämlich um zwei Schleifen gleichzeitig zu verlassen. lachen
Code:
WHILE ersteBedingung = erfuellt
  DO WHILE zweiteBedingung = erfuellt
    EXIT WHILE
  LOOP
WEND

_________________
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
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 31.12.2023, 18:30    Titel: Antworten mit Zitat

Hallo nemored,
zum Thema single und integer:
Habe ich das richtig verstanden?
Im Syntax DIM a,b,c as integer gilt offenbar:
a, b als Standardsingle, nur c als "Ausnahme" integer. richtig?

Dann hätte ich es mit demselben Ergebnis auch so machen können:
DIM a,b (Standard-Single)
DIM c as integer (Integer als "Ausnahme") richtig?

Wenn das zutrifft, habe ich meine Variablen jahrelang falsch definiert.
Meine Überlegung dabei war:
Eine "Integer"-Variable, wie z.B. simple Zähler i, j, k .... beansprucht doch weniger Speicherplatz, als eine "Single"-Variable.
Warum also "Single" verwenden, wenn Zähler eh keine Kommastelle haben? O.g. Syntax sollte also Speicherplatz sparen.
Wenn sich dieser Syntax letztlich aber nur auf c und nicht auf alle auswirkt, ist diese Einsparung wesentlich geringer, als eigentlich erhofft.

Dann hätte auch:
DIM a,b,c als Definition ausgereicht (eben alles Standard-Single).
Das separate Einstellen von c auf "integer" wäre dann hinsichtlich der Speicherersparnis nur Pille-Palle, also unnötig.

Da i, j, k als Indizes fungieren sollen, hielt ich es für besser, sie als "Integer" zu definieren. Da sind Kommastellen, ja nicht nötig, wie sie bei "Single" eingeräumt werden.
Frage: bedeutet "eingeräumt" automatisch auch zwingend erforderlich?

Mathematisch gibt es keinen Unterschied zwischen i = 2 ( i als Integer)
und i = 2.0 ( i als Single). Macht das vom Syntax her bei der Verwendung als Index einen Unterschied, oder wird generell 2 als Index verwendet, egal ob 2 oder 2.0 ?

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 31.12.2023, 19:41    Titel: Antworten mit Zitat

Hallo grindstone,
meines Wissens habe ich dir niiiiiiiie unterstellt, Werbung für Free-Basic zu machen. Daher verstehe ich nicht, warum du meinst, extra (in Klammern) darauf hinweisen zu müssen.
Selbst, wenn du für Free-Basic werben würdest, wäre es immer noch meine Entscheidung, ob ich mich von ihr ansprechen lassen würde oder eben nicht.
Ich bin mit Qbasic zufrieden, weil es meinen bescheidenen Ansprüchen völlig genügt. Nichts für ungut, ich wollte das nur klargestellt wissen.

Zum Fachlichen:

DIM a, b, c AS INTEGER
DIM x AS SINGLE

x = 1.3
a = x
b = x
c = x
PRINT
PRINT a, b, c

x = 1.7
a = x
b = x
c = x
PRINT a, b, c

macht für mich keinen Unterschied, wenn man mal davon absieht, daß
mal x = 1.3 und mal x = 1.7 gilt.

Der Befehl print a,b,c müßte für 1.3 also ergeben: 1.3, 1.3, 1.3.
Für 1.7 entsprechend : 1.7, 1.7, 1.7.

Tut er das etwa nicht?

Warum fügst du bei x=1.3 zuvor ein weiteres "print" ein?

Du schreibst:
Das Gemeine an solchen Fehlern ist, daß ........
Was wäre denn der Fehler? Eigentlich dürfte es doch gar keinen geben.
Der Befehl print a,b,c läuft doch nach demselben Prinzip ab,
egal, ob ich a,b,c jeweils mit 1.3 oder 1.7 belege.
Ein mögl. Fehler kann ja wohl schlecht von der jeweiligen Kommastelle abhängen.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 31.12.2023, 20:53    Titel: Antworten mit Zitat

Code:
DIM a,b

erzeugt - solange nicht anders definiert - zwei Single-Variablen, das ist richtig.
Wegen der Speichergrößen in QBasic habe ich nochmal nachschlagen müssen, aber es ist richtig: ein Integer ist 16 Bit groß, ein Single 32 Bit, belegt also doppelt so viel Speicher. In QBasic mag der Speicherverbrauch sogar eine bedeutende Rolle spielen, eigentlich wichtiger ist aber, dass Integer ein Datentyp ist, mit dem man exakt rechnen kann, Single und Double dagegen Gleitkommatypen sind, die technisch bedingt Rechenungenauigkeiten in Kauf nehmen. Das ist nichts beunruhigendes, sondern ganz normal, aber man sollte darüber Bescheid wissen.

Zitat:
Der Befehl print a,b,c müßte für 1.3 also ergeben: 1.3, 1.3, 1.3.
Für 1.7 entsprechend : 1.7, 1.7, 1.7.

c ist aber keine Gleitkommazahl, sondern ein Integer. Daher ist c beim ersten Mal 1, beim zweiten Mal 2.
Ein alleinstehendes PRINT gibt eine Leerzeile aus (zur schöneren Gestaltung der Ausgabe).
_________________
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
nemored



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

BeitragVerfasst am: 31.12.2023, 20:58    Titel: Antworten mit Zitat

Nachtrag: Noch ein anderes Beispiel; vielleicht verdeutlicht dieses das "Problem" besser:
Code:
DIM a, b AS INTEGER
DIM x AS SINGLE

x = 1.2
a = x
b = x

PRINT "5 x a = "; 5*a
PRINT "5 x b = "; 5*b

_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 01.01.2024, 06:04    Titel: Antworten mit Zitat

Revilo hat Folgendes geschrieben:
Hallo grindstone,
meines Wissens habe ich dir niiiiiiiie unterstellt, Werbung für Free-Basic zu machen. Daher verstehe ich nicht, warum du meinst, extra (in Klammern) darauf hinweisen zu müssen.
Diese Bemerkung von mir bezog sich nicht auf etwas, das du geschrieben hast, sondern war ironisch gemeint, weil ich natürlich gerade Werbung für FreeBASIC gemacht hatte, durch den Hinweis auf dessen erweiterte Möglichkeiten. Falls also für eines deiner zukünftigen Projekte die Leistungsfähigkeit von QBasic nicht mehr ausreichen sollte... zwinkern

Revilo hat Folgendes geschrieben:
Du schreibst:
Das Gemeine an solchen Fehlern ist, daß ........
Was wäre denn der Fehler? Eigentlich dürfte es doch gar keinen geben.
Der Befehl print a,b,c läuft doch nach demselben Prinzip ab,
egal, ob ich a,b,c jeweils mit 1.3 oder 1.7 belege.
Ein mögl. Fehler kann ja wohl schlecht von der jeweiligen Kommastelle abhängen.
Dazu eine kleine Geschichte aus der Frühzeit meiner Computerei: Damals bin ich als Betreuer in einer Jugendfreizeit mitgefahren und hatte für meinen C64 ein Taschengeld-Verwaltungsprogramm geschrieben. Eine der Funktionen dieses Programms war die Ermittelung des Kassenbestandes, also die Summe aller Buchungen (Ein- und Auszahlungen) von allen Teilnehmern (der Brotkasten hat dafür fast 8 Minuten gebraucht grinsen ). Natürlich habe ich dafür erst einmal Gleitkommazahlen benutzt, wie ich es aus dem Alltag gewohnt war, mußte aber feststellen, daß das Ergebnis um 20 bis 30 Pfennig vom korrekten Wert abwich. Erst als ich intern mit Pfennigen und damit mit Integerzahlen gerechnet habe, stimmte das Ergebnis.

Zu jener Zeit konnte ich mir dieses inkonsistente Verhalten noch nicht erklären, habe aber schon die (wertvolle) Erfahrung gemacht, daß man mit Gleitkommazahlen nicht exakt rechnen kann.

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 QBasic. 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