Hello, Guest the thread was called1.3k times and contains 11 replays

last post from kinzi at the

Anfängerproblem mit Mengenabfrage

  • Ich stehe hier etwas auf dem Schlauch.

    Ich möchte den Anwender meines Programms eine Menge zwischen 1 und 9 Wählen lassen. Ich dachte an eine Get Abfrage. Soweit kein Problem. Aber ich möchte das nur die Tasten 1 bis 9 akzeptiert werden (außer run stop).

    Bitte nicht auslachen. Ich komme mir schon ziemlich dämlich vor, dass ich das nicht zum Laufen bekomme. ?(?(?(

    Danke

  • Code
    1. 10 GET A$:IF A$="" THEN 10
    2. 20 A=VAL(A$):IF A<1 OR A>9 THEN 10
    3. 30 PRINT "IHRE GEWAEHLTE MENGE: ";A

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • VAL() liefert bei Zeichen den Wert 0, 0 ist kleiner als 1.


    [EDIT]


    Normalerweise teste ich so etwas kurz in VICE, bevor ich es auf die Menschheit loslasse. Kann man sich zum Prinzip erheben.


    [/EDIT]


    [EDIT 2]

    Code
    1. FOR I=0 TO 255 : PRINT I, VAL(CHR$(I)) : NEXT

    q.e.d.


    [/EDIT 2]

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • Gefragt war ja eine "Menge", das habe ich als "Anzahl" (= Zahl) interpretiert. Andernfalls:

    Code
    1. 10 GET A$ : IF VAL(A$)=0 THEN 10
    2. 20 PRINT A$

    :P


    Oder so:

    Code
    1. 10 GET A$ : ON VAL(A$)+1 GOTO 10
    2. 20 PRINT A$

    Das hat den Vorteil, dass man gleich noch anhand der Menge verzweigen könnte:

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • 10 GET A$:IF A$="" THEN 10

    Da kann man das "IF A$="" THEN 10" auch gleich weglassen. Auf die dadurch minimal erhöhte Reaktionszeit wird es vermutlich nicht ankommen.


    Wenn man keine Zeilenummerabhängigkeit haben möchte, geht auch

    Code
    1. 10 FOR A=0 TO 1:GET A$: A=VAL(A$): NEXT
    2. 20 PRINT "GEWAEHLT:" A-1

    Die FOR-Schleife wird erst verlassen, wenn A einen Wert von 1 oder größer annimmt. Größer als 9 kann man mit einer Ziffer ohnehin nicht erreichen, d.h. jeder Wert ungleich 0 beendet die Schleife.

    Da das NEXT noch A um 1 erhöht, muss man fürs Ergebnis noch A-1 rechnen. ;)

    Wenn man nur 1-3 haben möchte, dann verwendet man ...:A=VAL(A$):A=A*-(A<=3) oder etwas verständlicher mit IF-THEN

    Code
    1. 10 FOR A=0 TO 1: GET A$: A=VAL(A$): IF A<1 OR A>3 THEN A=0 : NEXT
    2. 20 PRINT "GEWAEHLT:"A

    ... in der Warteschleifen bleiben, solange A < 1 oder A > 3 ist. Hier bleibt zwar die Schleife offen, aber das nächste FOR A räumt das wieder auf (oder wenn es in einem Unterprogramm ist, räumt das RETURN die Schleifenreste auf).

  • Danke, danke, danke es ist wie so oft. Viele Wege führen nach Rom aber kinzi's Vorschlag war schon das was ich gesucht habe.

    Ja, eh. Kinzis Version passt natürlich (die überflüssige Abfrage auf A$="" würde ich dennoch weglassen).
    Ich bewerbe je nur den GOTO-losen (weil GOTO leider bei Rückwärtsprüngen und umfangreichen Programmen ziemlich zeitfressend ist) Programmierstil. Zugegeben, nicht immer schön anzusehen. ;)

  • Ok. Sich gleich von Beginn an an einen sauberen Stil zu gewöhnen ist sicher wichtig. Ich werde mich bemühen. Aber bei einem Blick in meinen Code fallen euch bestimmt die Haare aus.

    Wo finde ich denn was über Guten Basic Stil?

    Als Autodidakt macht man ja vieles wie es funktioniert und weniger wie es schön ist.

    Ich bin aber für jeden Tip dankbar.

  • Guten Basic Stil?

    Böse Zungen behaupten, diese Dinge schlössen sich gegenseitig aus. :bgdev


    Kommt darauf an, was man erreichen will - "schöner" Stil geht auf Kosten der Geschwindigkeit, vor allem beim BASIC V2 der Krummodore-Geräte. Wenn Tempo keine Rolle spielt: Ein Befehl pro Zeile. Funktionale Blöcke per REM-Zeiclen einfassen. Variablen mit "DIM" am Anfang definieren und dahinter ein "REM", was sie machen. Usw., usw. ...

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.