Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 23.02.2008, 16:09 Titel: Nur gerade Zahlen beim dividieren |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 23.02.2008, 16:16 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.02.2008, 16:27 Titel: |
|
|
ungerade Zahlen machst du so gerade:
Code: |
Geradezahl = Ungeradezahl + Ungeradezahl MOD 2
|
macht bei einem rechentrainer aber nicht viel sinn...  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 23.02.2008, 16:33 Titel: |
|
|
Oh, sorry, ich mein schon ganze Zahlen
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...
...durch...
...ersetzen. _________________ MfG
Seb |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 23.02.2008, 16:38 Titel: |
|
|
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  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 23.02.2008, 16:42 Titel: |
|
|
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  |
jop  _________________ MfG
Seb |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 23.02.2008, 21:47 Titel: |
|
|
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 |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 24.02.2008, 09:10 Titel: |
|
|
Danke!
Werde ich in mein Programm einbauen. _________________ MfG
Seb |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 24.02.2008, 13:18 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 24.02.2008, 14:51 Titel: |
|
|
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.
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 |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 24.02.2008, 19:30 Titel: |
|
|
Danke!
Beim ersten habe ich deinen Code genommen und beim zweiten Problem war einfach kein...
... 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)  _________________ MfG
Seb |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 24.02.2008, 19:37 Titel: |
|
|
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 |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 24.02.2008, 20:51 Titel: |
|
|
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 |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 25.02.2008, 01:14 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.02.2008, 13:26 Titel: |
|
|
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 |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 25.02.2008, 16:14 Titel: |
|
|
Ich mach jetzt einmal bei + und - das mit % und bei * und : mit &.
Hoffentlich funktioniert es... _________________ MfG
Seb |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 26.02.2008, 12:59 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 26.02.2008, 14:46 Titel: |
|
|
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
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 |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 26.02.2008, 17:53 Titel: |
|
|
Ok, bis jetzt müsste alles klar sein  _________________ MfG
Seb |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 26.02.2008, 20:54 Titel: |
|
|
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:
_________________ MfG
Seb |
|
Nach oben |
|
 |
|