Tipps zum Golfen in QBasic

13

Welche allgemeinen Tipps haben Sie zum Golfen in QBasic? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas spezifisch für QBasic sind (z. B. "Kommentare entfernen" ist keine Antwort).

Tipps zum QB64- Emulator sind ebenfalls willkommen. Es verfügt über einige zusätzliche Funktionen, die nicht in Microsoft QBasic enthalten sind.

DLosc
quelle
Ich bin neugierig auf deine Motivation. Ich habe QBASIC seit meinem Programmierkurs in der 10. Klasse nicht mehr verwendet. Erstaunlich, wie ich ohne jegliche Versionskontrolle direkt auf 1,44-Disketten gespeichert und (normalerweise) katastrophale Ausfälle vermieden habe.
Andrew Brēza
5
@ AndrewBrēza Motivation? Das gleiche wie meine Motivation, in jeder Sprache Golf zu spielen: zum Spaß! Ich genieße es, kleine Programme in QBasic zu schreiben (obwohl ich es für nichts Ernstes verwenden möchte). Es gibt auch den zusätzlichen Bonus, dass Sound und Grafik (sowohl Text als auch Pixel) eingebaut sind, was meine bevorzugte "echte" Sprache, Python, nicht tut.
DLosc
In QBasic ist es viel einfacher, Grafikspiele zu schreiben als in Python.
Anush
Wenn jemand grafische QBasic-Anwendungen direkt im Browser ausprobieren möchte, könnte er dies verwenden: github.com/nfriend/origins-host
mbomb007

Antworten:

10

Kennen Sie Ihre Schleifenkonstrukte

QBasic hat mehrere looping Konstrukte: FOR ... NEXT, WHILE ... WEND, und DO ... LOOP. Sie können auch GOTOoder (in bestimmten Situationen) RUNzum Schleifen verwenden.

  • FOR ... NEXTist ziemlich gut darin, was es tut. Anders als in Python ist es fast immer kürzer als das Äquivalent WHILEoder die GOTOSchleife, auch wenn es etwas schicker wird:

    FOR i=1TO 19STEP 2:?i:NEXT
    i=1:WHILE i<20:?i:i=i+2:WEND
    i=1:9?i:i=i+2:IF i<20GOTO 9
    

    Beachten Sie, dass Sie den Variablennamen nicht wiederholen müssen NEXT, und Sie können Leerzeichen zwischen Zahlen und den meisten folgenden Schlüsselwörtern entfernen.

  • WHILE ... WENDeignet sich für Schleifen, die 0-mal ausgeführt werden müssen. Wenn Sie jedoch wissen, dass die Schleife mindestens einmal ausgeführt wird, ist sie GOTOmöglicherweise ein Byte kürzer:

    WHILE n>1:n=n\2:WEND
    1n=n\2:IF n>1GOTO 1
    
  • Ich benutze nur DO ... LOOPfür Endlosschleifen (außer wo RUNkann stattdessen verwendet werden). Es kostet zwar die gleiche Anzahl von Zeichen wie eine unbedingte GOTO, ist jedoch etwas intuitiver zu lesen. (Beachten Sie, dass "Endlosschleife" Schleifen enthalten kann, bei denen Sie die Verwendung von a unterbrechen GOTO.) Die Syntax von DO WHILE/ DO UNTIL/ LOOP WHILE/ LOOP UNTIList zu ausführlich. Sie sind besser dran mit WHILEoder GOTOals angemessen.
  • GOTOist, wie oben erwähnt, der kürzeste allgemeine Weg, eine do / while-Schleife zu schreiben. Verwenden Sie einstellige Zeilennummern anstelle von Beschriftungen. Beachten Sie, dass, wenn a GOTOdas einzige Element in THENeiner IFAnweisung ist, zwei ebenso knappe Verknüpfungssyntaxen verfügbar sind:

    IF x>y GOTO 1
    IF x>y THEN 1
    

    GOTOkann auch verwendet werden, um kompliziertere Steuerungsabläufe zu erstellen . Die Neinsager bezeichnen dies als "Spaghetti-Code", aber dies ist Code-Golf: Unlesbarkeit ist fast eine Tugend! GOTOStolz!

  • RUNDies ist nützlich, wenn Sie zu einer festen Stelle im Programm springen müssen und keine der Variablenwerte beibehalten müssen. RUNstartet das Programm von oben neu; mit einem Label oder einer Zeilennummer wird es in dieser Zeile neu gestartet. Ich habe es hauptsächlich verwendet, um zustandslose Endlosschleifen zu erstellen .
DLosc
quelle
5

Verwenden Sie Kurzbefehle für PRINTundREM

Sie können ?anstelle von PRINTund 'anstelle von REM(comment) verwenden.

'Dies kann auch nützlich sein, wenn Sie mit Sprachen arbeiten, die 'Zeichen- oder Zeichenfolgensyntax unterstützen.

Uriel
quelle
5

Teilbarkeitsprüfung

In Programmen, in denen Sie testen müssen, ob eine Ganzzahl durch eine andere teilbar ist, ist die Verwendung der folgenden Methode naheliegend MOD:

x MOD 3=0

Ein kürzerer Weg ist die Verwendung der Ganzzahldivision:

x\3=x/3

Das heißt, xint-div 3ist xfloat-div 3.

Beachten Sie, dass beide Ansätze 0für falsch und -1für wahrheitsgemäß zurückkehren. Sie müssen daher möglicherweise das Ergebnis negieren oder subtrahieren, anstatt es zu addieren.


Wenn Sie die entgegengesetzte Bedingung müssen (dh xist nicht teilbar durch 3), ist der offensichtliche Ansatz die die Verwendung nicht-gleich Operator:

x\3<>x/3

Wenn dies xjedoch garantiert nicht negativ ist, können wir ein Byte speichern. Die Ganzzahldivision schneidet das Ergebnis ab, sodass es immer kleiner oder gleich der Gleitdivision ist. Daher können wir die Bedingung schreiben als:

x\3<x/3

In ähnlicher Weise erhöht das xAbschneiden das Ergebnis und wir können schreiben , wenn garantiert ist, dass es negativ ist . Wenn Sie das Zeichen von nicht kennen , müssen Sie bei bleiben .x\3>x/3x<>

DLosc
quelle
5

Scanner-Missbrauch

Wie in vielen Sprachen ist es wichtig zu wissen, welche Zeichen entfernt werden können und welche nicht.

  • Jedes Leerzeichen neben einem Symbol kann entfernt werden: IF""=a$THEN?0
  • Raum kann in der Regel zwischen einer Ziffer und einem Buchstaben vorkommen entfernt werden , in dieser Reihenfolge : FOR i=1TO 10STEP 2. Es gibt einige Unterschiede zwischen QBasic 1.1 (verfügbar unter archive.org ) und QB64 :
    • QBasic 1.1 ermöglicht das Entfernen von Leerzeichen zwischen einer Ziffer und einem folgenden Buchstaben. Außerdem wird in print-Anweisungen ein Semikolon zwischen aufeinanderfolgenden Werten abgeleitet: ?123xwird PRINT 123; x. Ausnahmen sind Sequenzen wie 1e2und 1d+3, die als wissenschaftliche Notation behandelt und auf 100!und 1000#(Einfach- bzw. Doppelgenauigkeit) erweitert werden.
    • QB64 ist in der Regel die gleichen, aber Ziffern kann nicht gefolgt werden d, eoder füberhaupt , wenn sie Teil einer wohlgeformten wissenschaftliche Schreibweise wörtliche sind. (Sie können beispielsweise das Leerzeichen nach der Zeilennummer in 1 FORoder nicht weglassen 9 END, wie dies auch in QBasic der Fall ist.) In print-Anweisungen werden nur Semikolons eingefügt, wenn einer der Ausdrücke ein String ist: ?123"abc"works, aber not ?TAB(5)123or ?123x.
  • In QBasic 1.1 wird ein abschließendes Semikolon zu einer PRINTAnweisung hinzugefügt, die mit einem Aufruf von TABoder endet SPC. (QB64 nicht.)
  • 0kann vor oder nach dem Komma weggelassen werden ( .1oder 1.), aber nicht beide ( .).
  • ENDIFist äquivalent zu END IF.
  • Das schließende doppelte Anführungszeichen einer Zeichenfolge kann am Ende einer Zeile weggelassen werden.
DLosc
quelle
endiffunktioniert tatsächlich in QB64, siehe diese Antwort
wastl
@wastl So ist es. Als ich es zum ersten Mal in QB64 getestet habe, habe ich eine ältere Version verwendet, in der es sich um einen Syntaxfehler handelte. Danke für die Erwähnung!
DLosc
4

kombinieren Sie NextStatements

Next:Next:Next

Darf bis auf kondensiert werden

Next k,j,i

wo die Iteratoren für die ForSchleifen sind i, jund k- in dieser Reihenfolge.

Zum Beispiel die unten (69 Bytes)

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next
Next
Next

Kann auf 65 Bytes komprimiert werden

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next k,j,i

Und was die Auswirkungen auf Formatierung und Einrückung angeht, ist es meiner Meinung nach am besten, die nächste Anweisung an der äußersten for-Anweisung auszurichten. Z.B.

Input n,m,o
For i=0To n
    For j=0To m
        For k=0To o
            ?i;j;k
Next k,j,i
Taylor Scott
quelle
4

Kennen Sie Ihre Eingabemethoden

QBasic hat mehr Möglichkeiten , Benutzertastatureingabe zu erhalten: INPUT, LINE INPUT, INPUT$, und INKEY$.

  • INPUTist Ihre Standard-Mehrzweck-Eingabeanweisung. Das Programm stoppt, was es tut, zeigt einen Cursor an und lässt den Benutzer eine Eingabe eingeben, die durch beendet wird Enter. INPUTkann Zahlen oder Zeichenfolgen lesen und mehrere Werte durch Kommas trennen. Sie können eine Zeichenfolge als Eingabeaufforderung angeben, die Standard-Fragezeichen-Eingabeaufforderung verwenden und die Eingabeaufforderung sogar ganz unterdrücken (ich habe das erst heute Abend gelernt). Einige Beispielaufrufe:
    • INPUT x$,y
      Verwendet die Standardeingabeaufforderung ? und liest eine Zeichenfolge und eine Zahl, die durch Kommas getrennt sind.
    • INPUT"Name";n$
      Fordert zum Name? Lesen einer Zeichenfolge auf.
    • INPUT"x=",x
      Fordert mit x=(kein Fragezeichen! Beachten Sie das Komma in der Syntax) und liest eine Zahl.
    • INPUT;"",s$
      Unterdrückt die Eingabeaufforderung (unter Verwendung der obigen Kommasyntax mit einer leeren Eingabeaufforderungszeichenfolge), liest eine Zeichenfolge und wechselt nicht in die nächste Zeile, wenn der Benutzer die Eingabetaste INPUTdrückt (das ist, was das Semikolon danach tut). Wenn Sie sich PRINT s$unmittelbar danach befinden, sieht Ihr Bildschirm beispielsweise so aus User_inputUser_input.
  • Ein Nachteil INPUTist, dass Sie keine Zeichenfolge mit einem Komma darin lesen können, da INPUTKomma als Feldtrennzeichen verwendet wird. Verwenden Sie zum Lesen einer einzelnen Zeile beliebiger (druckbarer ASCII-) Zeichen LINE INPUT. Es hat die gleichen Syntaxoptionen wie INPUT, außer dass es genau eine Variable braucht, die eine String-Variable sein muss. Der andere Unterschied besteht darin, dass LINE INPUTstandardmäßig keine Eingabeaufforderung angezeigt wird. Wenn Sie eines möchten, müssen Sie es explizit angeben.
  • INPUT$(n)Zeigt keine Eingabeaufforderung oder keinen Cursor an, sondern wartet einfach, bis der Benutzer nZeichen eingibt , und gibt dann eine Zeichenfolge zurück, die diese Zeichen enthält. Im Gegensatz zu INPUToder LINE INPUTmuss der Benutzer nicht Enterdanach drücken und Enterkann tatsächlich eines der Zeichen sein (es wird das ASCII-Zeichen 13 vergeben, das in C-ähnlichen Sprachen als bekannt ist \r).

    Am häufigsten ist dies nützlich INPUT$(1), normalerweise in einer Schleife. INPUT$ist gut in interaktiven Programmen, in denen einzelne Tastendrücke Dinge tun . Leider funktioniert es nur mit Schlüsseln, die ASCII-Codes haben. Dazu gehören Dinge wie Escund Backspace, aber nicht die Pfeiltasten Insertund Deleteund andere.

  • Hier INKEY$kommt was rein. Es ist ähnlich, INPUT$(1)dass es die Ergebnisse eines einzelnen Tastendrucks 1 zurückgibt , aber darin unterscheidet es sich:

    • INKEY$ nimmt kein Argument.
    • Während INPUT$(n)stoppt die Ausführung bis zum Benutzer gibt nZeichen, INKEY$halt nicht die Ausführung. Wenn der Benutzer gerade eine Taste drückt, wird INKEY$eine Zeichenfolge zurückgegeben, die diese Taste darstellt. Wenn nicht, kehrt es zurück "". Das heißt, wenn Sie INKEY$den nächsten Tastendruck erhalten möchten , müssen Sie ihn in eine Besetzt-Warteschleife einbinden: 2

      k$=""
      WHILE""=k$
      k$=INKEY$
      WEND
      
    • Beide INPUT$und INKEY$geben ASCII-Zeichen für Schlüssel zurück, die ASCII-Zeichen entsprechen (einschließlich Steuerzeichen wie Escape, Tabulator und Rücktaste). Allerdings INKEY$können auch einige Tasten behandeln, die keine ASCII - Codes. Für diese (so die Hilfedatei) gibt "INKEY $ eine 2-Byte-Zeichenfolge aus dem Null-Zeichen (ASCII 0) und dem Tastatur-Scan-Code zurück."

      Klar wie Schlamm? Hier sind einige Beispiele. Wenn Sie in der INKEY$obigen Schleife die linke Pfeiltaste drücken, k$wird die Zeichenfolge "␀K"(mit dem entsprechenden KScan-Code 75) angezeigt. Für den rechten Pfeil ist es "␀M"(77). Bild ab ist "␀Q"(81). F5 ist "␀?"(63).

      Immer noch klar wie Schlamm? Ja. Es ist nicht die intuitivste Sache der Welt. Die Hilfedatei enthält eine Tabelle mit Scan-Codes, aber ich schreibe immer nur ein kleines Programm, um die Ergebnisse auszudrucken, INKEY$und drücke eine Reihe von Tasten, um herauszufinden, welche Werte richtig sind. Wenn Sie wissen, welche Zeichen welchen Tasten entsprechen, können Sie mit RIGHT$(k$,1)und LEN(k$)zwischen den verschiedenen Fällen unterscheiden, die auftreten können.

    Endeffekt? INKEY$ist komisch, aber es ist der einzige Weg, wenn Ihr Programm nicht blockierende Eingaben erfordert oder die Pfeiltasten verwenden muss .


1 Nicht einschließlich Shift, Ctrl, Alt, PrntScr, Caps Lock, und ähnliches. Die zählen nicht. : ^ P

2 Das WHILE ... WENDIdiom hier ist das, was ich in meinem QBasic Buch gelernt. Für Golfzwecke ist eine GOTOSchleife jedoch kürzer .

DLosc
quelle
3

LOCATE kann sehr mächtig sein

Mit dieser LOCATEAnweisung können Sie den Cursor an einer beliebigen Stelle auf dem Bildschirm platzieren (innerhalb der üblichen 80 x 40 Zeichen) und an dieser Stelle etwas ausdrucken. Diese Antwort auf eine Herausforderung ist ein echter Beweis dafür (und wird auch mit vielen anderen Tipps aus diesem Thema kombiniert).

Die Herausforderung besteht darin, jedes Zeichen, das ein Benutzer gedrückt hat, in einem 16x6-Raster auszugeben. Mit LOCATEdieser ist einfach eine Frage der div und mod über den ASCII - Code ( ain diesem Code):

LOCATE a\16-1,1+2*(a MOD 16)

Und dann das Zeichen drucken:

?CHR$(a)
steenbergh
quelle
3

In QBasic ist es üblich, die DIMAnweisung zum Erstellen von Variablen zu verwenden und ihnen einen Namen und einen Typ zu geben. Dies ist jedoch nicht zwingend erforderlich. QBasic kann einen Typ auch durch das Suffix des Variablennamens ableiten. Da Sie eine Variable nicht gleichzeitig deklarieren und initialisieren können, ist es oft DIMratsam, das Codegolf zu überspringen . Zwei Schnipsel, die funktional identisch sind *:

DIM a AS STRING: a = "example"
a$ = "example"

* Beachten Sie, dass dadurch zwei verschiedene Variablennamen erstellt werden.

Sie können den Variablentyp angeben, indem Sie $am Ende eines Variablennamens Zeichenfolgen, !Zahlen mit einfacher Genauigkeit und %doppelte Werte hinzufügen . Singles werden angenommen, wenn kein Typ angegeben ist.

a$ = "Definitely a string"
b! = "Error!"

Beachten Sie, dass dies auch für Arrays gilt. Normalerweise ist ein Array wie folgt definiert:

DIM a(20) AS STRING

Arrays müssen aber auch nicht DIMmed sein:

a$(2) = "QBasic 4 FUN!"

a$ist jetzt ein Array für Strings mit 11 Slots: von Index 0 bis einschließlich Index 10. Dies geschieht, weil QBasic über eine Option verfügt, die sowohl eine 0-basierte als auch eine 1-basierte Indizierung für Arrays ermöglicht. Eine Standard-Array-Art unterstützt beides.

Erinnern Sie sich an das Array mit zwanzig Steckplätzen, das wir DIMoben angegeben haben? Das hat tatsächlich 21 Steckplätze, da das gleiche Prinzip sowohl für gedimmte als auch für nicht gedimmte Arrays gilt.

steenbergh
quelle
Ich habe nie bemerkt, dass dies auch für Arrays gilt. Interessant.
Trichoplax
3

Verkürzende IFAussagen

IF Anweisungen sind ziemlich teuer, und wenn Sie sie ablegen, können viele Bytes gespart werden.

Betrachten Sie Folgendes (nach einer Antwort von Erik dem Outgolfer):

IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF

Das erste, was wir tun können, ist das Speichern ENDIFmit einer einzeiligen IFAnweisung:

IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0

Dies funktioniert, solange Sie nicht versuchen, es in die gleiche Zeile wie irgendetwas anderes zu setzen. Insbesondere wenn Sie verschachtelte IFAnweisungen haben, kann nur die innerste einzeilig sein.

Aber in diesem Fall können wir die IFVerwendung von Mathematik vollständig eliminieren . Überlegen Sie, was wir eigentlich wollen:

  • Wenn RND<.5wahr ist ( -1), wollen wir:
    • x um 1 verringern
    • y gleich bleiben
    • a(i) 1 werden
  • Andernfalls wollen wir , wenn RND<.5false ( 0) ist:
    • x gleich bleiben
    • y um 1 verringern
    • a(i) zu 0 werden

Nun , wenn wir das Ergebnis der bedingten in einer Variablen (speichern r=RND<.5), können wir die neuen Werte von berechnen x, yund a(i):

  • Wann rist -1, x=x-1; wenn rist 0, x=x+0.
  • Wann rist -1, y=y+0; wenn rist 0, y=y-1.
  • Wann rist -1, a(i)=1; wenn rist 0, a(i)=0.

Unser endgültiger Code sieht also so aus:

r=RND<.5
x=x+r
y=y-1-r
a(i)=-r

Satte 20 Bytes (40%) mehr als in der Originalversion.


Der mathematische Ansatz kann überraschend oft angewendet werden, aber wenn es einen logischen Unterschied zwischen den beiden Fällen gibt (z. B. wenn Sie in einem Fall etwas eingeben müssen, in dem anderen jedoch nicht), müssen Sie ihn trotzdem verwenden IF.

DLosc
quelle
3

Manchmal sollten Sie Arrays vermeiden

Arrays in QBasic haben, wenn sie ohne instanziiert werden DIM, nur 11 Slots. Wenn eine Herausforderung mehr als 11 Steckplätze erfordert (oder N Steckplätze, wobei N größer als 11 sein kann), sollten Sie DIMdas Array verwenden. Nehmen wir außerdem an, wir möchten dieses Array mit Daten füllen:

DIM a$(12)
a$(0) = "Value 1"
a$(1) = "Value 2"
...

Auch beim Golfen kann dies viel Platz in Anspruch nehmen. In solchen Fällen kann es billiger sein, dies in Bytes zu tun:

a$ = "value 1value 2"

Hier platzieren wir alles in 1 verketteten String. Später greifen wir wie folgt darauf zu:

?MID$(a$,i*7,7)

Für diesen Ansatz ist es wichtig, dass alle Werte gleich lang sind. Nehmen Sie den längsten Wert und füllen Sie alle anderen aus:

a$="one  two  threefour "

Sie müssen nicht den letzten Wert auffüllen, und Sie können sogar die abschließenden Anführungszeichen überspringen! Wenn die Abfrage angibt, dass in der Antwort kein Leerraum zulässig ist RTRIM$(), beheben Sie diesen Fehler.

Sie können diese Technik hier in Aktion sehen .

steenbergh
quelle
3

PRINT( ?) hat einige Macken

Zahlen werden mit einem führenden und einem hinteren Leerzeichen gedruckt.

Beim Drucken wird ein Zeilenumbruch eingefügt. Dieses Verhalten kann geändert werden, indem am Ende der Anweisung ein Komma hinzugefügt wird, um stattdessen einen Tabulator einzufügen, oder ein Semikolon, um Einfügungen zu vermeiden:

Es ist nicht erforderlich, beim Drucken &oder ;zwischen verschiedenen Vorgängen zu wechseln, z. ?1"x"s$druckt die Zahl 1mit Leerzeichen auf jeder Seite, den Buchstaben xund den Inhalt vons$

?"foo"
?"bar"
?10
?"foo",
?"bar"
?"foo"; 
?"bar"
?1CHR$(65)
?1" "CHR$(65)
?"A","B

Ausgänge

foo
bar
 10
foo           bar
foobar
 1 A
 1  A
A             B

Das Drucken eines Zeilenumbruchs kann mit nur erfolgen ?

steenbergh
quelle
Speziell beim Drucken von Zahlen: Ein Leerzeichen wird vor der Zahl gedruckt, wenn es nicht negativ ist. Andernfalls wird dort ein Minuszeichen -gedruckt. Nach der Nummer wird ein Leerzeichen gedruckt. Der beste Weg, diese Leerzeichen zu PRINT USINGentfernen, ist --keine Angabe, ob Sie dies zu dieser Antwort hinzufügen möchten oder ob es sich um eine separate Antwort handeln sollte.
DLosc
2

WRITE kann anstelle von nützlich sein PRINT

PRINTIn der Regel ist dies die Art und Weise, wie Sie die Ausgabe durchführen möchten, da sie ziemlich flexibel ist und die ?Verknüpfung enthält. Mit dem WRITEBefehl können Sie jedoch in bestimmten Situationen Bytes sparen:

  • Wenn Sie einen String ausgeben, setzen WRITESie ihn in doppelte Anführungszeichen ( "). Wenn Sie eine Ausgabe mit doppelten Anführungszeichen benötigen, WRITE s$ist sie viel kürzer als ?CHR$(34);s$;CHR$(34). Siehe zum Beispiel die kürzeste bekannte QBasic-Quine .
  • Fügt bei der Ausgabe einer Zahl WRITEkeine Leerzeichen vor und nach dieser ein PRINT. WRITE nist viel kürzer als ?MID$(STR$(n),2). Siehe zum Beispiel FizzBuzz in QB64 .
  • WRITETrennen Sie bei der Ausgabe mehrerer Werte diese durch Kommas: WRITE 123,"abc"Outputs 123,"abc". Ich kann mir kein Szenario vorstellen, in dem dies nützlich wäre, aber das heißt nicht, dass es keines gibt.

Einschränkungen von WRITE:

  • Es gibt keine Möglichkeit, mehrere Werte ohne ein Trennzeichen wie mit auszugeben PRINT a;b.
  • Es gibt keine Möglichkeit, den Zeilenumbruch am Ende der Ausgabe zu unterdrücken. (Möglicherweise können Sie das umgehen LOCATE, aber das kostet eine Menge Bytes.)
DLosc
quelle
1

Manchmal führt QBasic Eingaben in Funktionen aus. Missbrauch das!

Es gibt einige Funktionen, die Zeichen anstelle von Zeichenfolgen verarbeiten, aber charin QBasic gibt es keinen Datentyp , sondern nur den string ($)Typ. Nehmen Sie zum Beispiel die ASC()Funktion, die den ASCII-Schlüsselcode für ein Zeichen zurückgibt. Wenn wir eintreten würden

PRINT ASC("lala")

nur der erste lwürde von QBasic berücksichtigt. Auf diese Weise müssen wir uns nicht darum kümmern, eine Saite auf Länge 1 zu kürzen.

Ein weiteres Beispiel stammt aus dieser Frage, in der die STRING$()Funktion in einer der Antworten verwendet wird.

Die STRING $ -Funktion akzeptiert zwei Argumente, eine Zahl n und eine Zeichenfolge s $, und erstellt eine Zeichenfolge, die aus n Kopien des ersten Zeichens von s $ besteht

@ DLosc, hier

Beachten Sie, dass QBasic, wenn ein String mit mehreren Zeichen angeboten wird und nur ein Zeichen benötigt, automatisch das erste Zeichen verwendet und den Rest ignoriert.

steenbergh
quelle