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:

Nur gerade Zahlen beim dividieren
Gehe zu Seite 1, 2  Weiter
 
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
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 23.02.2008, 16:09    Titel: Nur gerade Zahlen beim dividieren Antworten mit Zitat

Hallo!

Ich habe ein kleines Rechenprogramm mit Zufallszahlen programmiert.

Allerdings kommen beim dividieren nur selten gerade Zahlen raus.

Wie kann ich machen, dass nur gerade Zahlen rauskommen?:
Code:
RANDOMIZE TIMER
ZAHL1% = INT(RND * 999) + 1
ZAHL2% = INT(-RND * 999) + 1
PRINT ZAHL1%; ": ("; ZAHL2%; ") ="
INPUT EINGABE1%
IF EINGABE1% = ZAHL1% / ZAHL2% THEN PRINT "---richtig---" ELSE PRINT "---falsch---"

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



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

BeitragVerfasst am: 23.02.2008, 16:16    Titel: Antworten mit Zitat

Gerade Zahlen? Oder meinst du ganze Zahlen?

Ganze Zahlen würde ich anders herum machen: zwei Zahlen erzeugen, miteinander multiplizieren und dann das Produkt und einen der beiden Faktoren anzeigen. Zu erraten ist der andere der beiden Faktoren.
_________________
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
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.02.2008, 16:27    Titel: Antworten mit Zitat

ungerade Zahlen machst du so gerade:
Code:

Geradezahl = Ungeradezahl + Ungeradezahl MOD 2


macht bei einem rechentrainer aber nicht viel sinn... cool
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 23.02.2008, 16:33    Titel: Antworten mit Zitat

Oh, sorry, ich mein schon ganze Zahlen grinsen

Also z.b. 50*60=300.
Dann 300:60 oder 300:50.
Ich probiers mal:
Code:
RANDOMIZE TIMER
ZAHL1% = INT(RND * 999) + 1
ZAHL2% = INT(-RND * 999) + 1
ZAHL3% = ZAHL1% * ZAHL2%
PRINT ZAHL3%; ": ("; ZAHL2%; ") ="
INPUT EINGABE1%
IF EINGABE1% = ZAHL3% / ZAHL2% THEN PRINT "---richtig---" ELSE PRINT "---falsch---"


€dit:
In der letzten Zeile kann man...
Code:
ZAHL3% / ZAHL2%

...durch...
Code:
ZAHL1%

...ersetzen.
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



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

BeitragVerfasst am: 23.02.2008, 16:38    Titel: Antworten mit Zitat

In der letzten Zeile kannst du auch schreiben:
Code:
IF EINGABE1% = ZAHL1% THEN PRINT "---richtig---" ELSE PRINT "---falsch---"

Warum setzt du in der Ausgabe die Zahl, durch die dividiert wird, in Klammern?


edit: die erste Anmerkung kam wohl zu spät grinsen
_________________
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
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 23.02.2008, 16:42    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Warum setzt du in der Ausgabe die Zahl, durch die dividiert wird, in Klammern?

Das hab ich so in der Schule gelernt(bin erst in der 6. Klasse)?!
posetive Zahl +/-/*/: posetive Zahl
posetive Zahl +/-/*/: (negative Zahl)
negative Zahl +/-/*/: posetive Zahl
negative Zahl +/-/*/: (negative Zahl)

nemored hat Folgendes geschrieben:
edit: die erste Anmerkung kam wohl zu spät grinsen

jop happy
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



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

BeitragVerfasst am: 23.02.2008, 21:47    Titel: Antworten mit Zitat

Seb hat Folgendes geschrieben:
nemored hat Folgendes geschrieben:
Warum setzt du in der Ausgabe die Zahl, durch die dividiert wird, in Klammern?

Das hab ich so in der Schule gelernt(bin erst in der 6. Klasse)?!

Stimmt, ja, habe beim Posten nicht an daran gedacht, dass du negative Zahlen verwendest. Du könntest natürlich eine Fallunterscheidung machen:
Code:
PRINT ZAHL3%; " : ";
IF ZAHL2%<0 THEN PRINT "("; ZAHL2%; ")"; ELSE PRINT ZAHL2%;
PRINT " = ";

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



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 09:10    Titel: Antworten mit Zitat

Danke! lächeln
Werde ich in mein Programm einbauen.
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 13:18    Titel: Antworten mit Zitat

Ich habe noch ein Problem:
Ich wollte das Programm mit Benutzern machen.
Beim erstellen habe ich Folgenden Code.
Normal sollte das Programm immer eine Datei von 1 bis 5 erstellen, aber das Programm erstellt immer eine Datei, die "01" heißt:
Code:
PRINT "Gebe deinen Benutzernamen ein:"
INPUT NewBenutzer$
OPEN "count.txt" FOR INPUT AS #6
INPUT #6, d6$
CLOSE #6
Count$ = d6$ + "1"
IF Count$ > "5" THEN
PRINT "Du kannst nicht mehr als 5 Benutzer erstellen!!!"
SLEEP 2
GOTO 1



Das zweite Problem:
Bei der Benutzer-Auswähl-Funktion kommt immer die Meldung:
Zitat:
Eingabe nach Dateiende

Der Code:
Code:
PRINT "Gebe deinen Benutzernamen ein:"
PRINT "(Benutzer muss schon vorhanden sein)"
PRINT "(Auf Groß- und Klein-Schreibung achten)"
INPUT OpenBenutzer$
OPEN "1.txt" FOR INPUT AS #1
INPUT #1, d1$
CLOSE #1
OPEN "2.txt" FOR INPUT AS #2
INPUT #2, d2$
CLOSE #2
IF d1$ = OpenBenutzer$ THEN
PRINT "Benutzer gefunden!!!"
SLEEP 2
Username$ = OpenBenutzer$
GOTO 2
END IF
IF d2$ = OpenBenutzer$ THEN
PRINT "Benutzer gefunden!!!"
SLEEP 2
Username$ = OpenBenutzer$
GOTO 2
END IF
PRINT "Benutzer wurde nicht gefunden!!!"
SLEEP 2
GOTO 1


Danke schonmal vorab.
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 24.02.2008, 14:51    Titel: Antworten mit Zitat

Seb hat Folgendes geschrieben:

Normal sollte das Programm immer eine Datei von 1 bis 5 erstellen, aber das Programm erstellt immer eine Datei, die "01" heißt:


Das kommt, weil du nicht die Zahlen Null und Eins addierst, sondern das Zeichen "1" an das Zeichen "0" anhängst, das in d6$ gespeichert ist.

Code:
Count$ = d6$ + "1"


Wenn du die Zahlenwerte addieren willst, musst du erst den String, also die Textvariable in eine Zahl umwandeln, z.B. mit VAL. Oder, weil es hier nur eine einstellige Zahl ist mit

Code:
Count$ = CHR$(ASC(d6$) + 1)



Seb hat Folgendes geschrieben:
Das zweite Problem:
Bei der Benutzer-Auswähl-Funktion kommt immer die Meldung:
Zitat:
Eingabe nach Dateiende


Dann steht nichts in den Dateien? Vielleicht ist beim Erstellen schon etwas schief gegangen. Hast du dir die Dateien z.B. mit Notepad angesehen, ob etwas drin steht? Es wäre auch interessant zu wissen, wohin die GOTOs führen...

Du solltest versuchen, alle Angaben in eine Datei zu packen. In die erste Zeile dieser Datei schreibst Du die Anzahl der Benutzer und liest dann einfach mit einer Schleife soviele weitere Zeilen ein, wie in der ersten angegeben sind. Auch hier kannst du z.B. mit VAL wieder den Zahlwert des Zeichens (0-5) ermitteln, das in der ersten Zeile der Datei steht.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 19:30    Titel: Antworten mit Zitat

Danke!

Beim ersten habe ich deinen Code genommen und beim zweiten Problem war einfach kein...
Zitat:
""

... in der Datei.

Das mit alle Daten in eine Datei packen kann ich noch nicht(siehe auch Thema "kleines Spiel" mit der "READ" und "DATA"-Funktion) missbilligen
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
dreael
Administrator


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

BeitragVerfasst am: 24.02.2008, 19:37    Titel: Antworten mit Zitat

Zum Titelthema: Offensichtlich willst Du ein einfacher Kopfrechentrainer fürs ganzzahlige Dividieren programmieren. In diesem Fall hilfreich:
Code:
INPUT "Divident"; a%
INPUT "Divisor"; b%
PRINT "Ergibt";a%\b%;"Rest";a% MOD b%

d.h. "\" und "MOD" sind zwei Unzertrennliche in der Ganzzahlarithmetik von QB. Um Aufgaben zu generieren, kann es übrigens fast zweckmässiger sein, das Ergebnis und Divisor mit RND zu erzeugen und am Bildschirm das Produkt anzeigen, d.h.
Code:
e%=1+CINT(INT(10!*RND))
d%=1+CINT(INT(10!*RND))
PRINT e%*d%;":";d%;"="
INPUT l%
IF l%=e% THEN
  PRINT "Richtig"
ELSE
  PRINT "Falsch"
END IF

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 20:51    Titel: Antworten mit Zitat

Bei mir kommt immer eine Fehlermeldung "Überlauf"?!:
Code:
RANDOMIZE TIMER
ZAHL1% = INT(-RND * 999) + 1
ZAHL2% = INT(RND * 999) + 1
ZAHL3% = ZAHL1& * ZAHL2&
PRINT ZAHL3%; ":"; ZAHL2%; "="
PRINT
INPUT ZAHLA1%
IF ZAHLA1% = ZAHL3& / ZAHL2& THEN PRINT "---richtig---" ELSE PRINT "---falsch---"

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 25.02.2008, 01:14    Titel: Antworten mit Zitat

999 * 999 = 998001.
Integer-Variablen können aber höchstens Zahlen bis +-32767 aufnehmen ( = 2^15-1)
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.02.2008, 13:26    Titel: Antworten mit Zitat

Seb hat Folgendes geschrieben:
Bei mir kommt immer eine Fehlermeldung "Überlauf"?!:
Code:
ZAHL1% = INT(-RND * 999) + 1
ZAHL2% = INT(RND * 999) + 1
ZAHL3% = ZAHL1& * ZAHL2&
...
IF ZAHLA1% = ZAHL3& / ZAHL2& THEN PRINT "---richtig---" ELSE PRINT "---falsch---"


Du wirfst die Suffixe auch etwas durcheinander, also die Zeichen hinter den Variablen, die kennzeichnen, um was für einen Typ es sich handelt, also in diesem Fall das % und das &-Zeichen. Mal schreibst du ZAHL1%, mal ZAHL1&. Für das Programm sind das ganz unterschiedliche Variable. Hier ist alles genau erklärt:

http://www.antonis.de/qbkochbu/index.htm#vari

EDIT: Die Überlauf-Fehlermeldung gibt es wohl an dieser Stelle:

Code:
IF ZAHLA1% = ZAHL3& / ZAHL2& THEN...


Du schreibst die Werte in die Variablen ZAHLx%, rechnest dann aber mit ZAHLx&. ZAHL2& ist aber wie oben beschrieben eben eine andere Variable als ZAHL2%. Deshalb steht nix drin bzw. ist sie gleich Null und durch Null teilen führt zum Überlauf. Das Einfachste wäre, überall den "grossen" &-Typ, also Long Integer zu verwenden.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 25.02.2008, 16:14    Titel: Antworten mit Zitat

Ich mach jetzt einmal bei + und - das mit % und bei * und : mit &.

Hoffentlich funktioniert es...
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 26.02.2008, 12:59    Titel: Antworten mit Zitat

Hallo

Wenn du dir überlegst, was du tust, brauchst du nicht zu hoffen. Die verschiedenen Variablentypen belegen unterschiedlich viel Speicherplatz (16, 32, 64 Bit) und der Computer kann eine Berechnung um so schneller durchführen, je weniger Bit die beteiligten Variablen haben. Wenn man ein Programm mit sehr vielen Variablen hat, mit denen viele Berechnungen durchgeführt werden sollen, ist es wichtig, immer nur den kleinsten nötigen Variablentyp zu benutzen um keinen Speicherplatz und keine Rechengeschwindigkeit zu verschwenden. Früher, bei alten Computern, war das noch wichtiger. Bei deinem Spiel kommt es zwar nicht so darauf an, aber das mit den verschiedenen Variablentypen ist eine wichtige Grundlage fürs Programmieren, das solltest du wirklich verstanden haben, bevor du weiter machst.

Du musst dir also einfach nur überlegen, welches das größt bzw. kleinstmögliche Ergebnis einer Berechnung ist und dann den passenden Variablentyp aussuchen.

QB-Kochbuch hat Folgendes geschrieben:
- anna% : INTEGER, Ganzzahl mit Vorzeichen (16 bit) -32768...32767
- otto& : LONG, lange Ganzzahl mit Vorzeichen (32 bit) -2147483648...2147483647


Also liegst du mit deiner Methode % für plus und minus bzw. & für mal und geteilt schon ganz gut. Denn 999+999=1998, passt also in eine INTEGER (%). Dagegen ist 999*999=998001, passt also nicht mehr in INTEGER aber in LONG (&).

Da ist noch eine Sache, die nicht auf Anhieb logisch erscheint.

Code:
faktor1% = 999
faktor2% = 999
ergebnis& = faktor1% * faktor2%


führt ebenfalls zu einem Überlauffehler. Das liegt daran, dass QBasic erst die Berechnung rechts vom Gleichheitszeichen ausführt und dazu nur den grössten Variablentyp benutzt, der auf der rechten Seite vorkommt. Intern wird für das Ergebnis der Rechnung Speicherplatz reserviert, aber eben wie gesagt nur so viel, wie der der größte Variablentyp hat, der rechts vom Gleichheitszeichen steht. Hier wären das 16 Bit, weil es nur zwei Integervariable sind. Erst, wenn die Berechnung ausgeführt ist, wird in einem zweiten Schritt das Ergebnis aus diesem internen Ergebnisspeicher in die Variable links vom Gleichheitszeichen kopiert. Da 16 Bit für das Ergebnis aber zu wenig sind, kommt schon vor diesem Kopieren ein Überlauf.

Macht man es dagegen so,

Code:
faktor1% = 999
faktor2% = 999
ergebnis& = faktor1%
ergebnis& = ergebnis& * faktor2%


dann geht es. Ist es jetzt klar, warum?

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


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

BeitragVerfasst am: 26.02.2008, 14:46    Titel: Antworten mit Zitat

Vielleicht als Ergänzung:
Code:
ergebnis& = faktor1% * faktor2%

wird von der Rangfolge her als
Code:
ergebnis& = CLNG(faktor1% * faktor2%)

durchgeführt. Problem hierbei: Die "*"-Operation wird noch im 16-Bit-Zahlensystem durchgeführt, was die besagten Überlaufsprobleme verursachen kann. Abhilfe: Wir müssen dafür sorgen, dass die "*"-Operation als 32-Bit durchgeführt wird. Bewirkt man in diesem Fall mit
Code:
ergebnis& = CLNG(faktor1%) * CLNG(faktor2%)

d.h. Faktoren vom Typ zuerst umwandeln, erst dann multiplizieren, nicht umgekehrt.

Hinweis: Streng typisierte Sprache wie Pascal, Modula-2 und ADA verlangen immer explizite Typenumwandlung. Ich empfehle eigentlich auch in QB immer die Pascal-Philosophie, weil man den Compiler hinsichtlich der zuverwendenden Arithmetik gezielt steuern kann.

Vielleicht sollte ich den FreeBasic-Entwicklern ein
Code:
Option StrictTypes

o.ä. als Feature Request für den Compiler stellen, d.h. wenn aktiviert, müssen Typen immer genau stimmen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 26.02.2008, 17:53    Titel: Antworten mit Zitat

Ok, bis jetzt müsste alles klar sein Ja!
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 26.02.2008, 20:54    Titel: Antworten mit Zitat

Und doch noch ein Problem:
Wenn die Zahlen, die man speichern will größer als nur einstellig ist, kommen zeichen wie "<", etc.

Wie Skilltronic ja oben schon erwähnt hat:
Skilltronic hat Folgendes geschrieben:
Wenn du die Zahlenwerte addieren willst, musst du erst den String, also die Textvariable in eine Zahl umwandeln, z.B. mit VAL. Oder, weil es hier nur eine einstellige Zahl ist mit

Code:
Count$ = CHR$(ASC(d6$) + 1)

Wie geht das mit mehrstelligen Zahlen?

Hier nochmal der Code:
Code:
Count$ = d6$ + "1"

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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