QBasic/完整書籍檢視
INPUT 命令用於從使用者那裡收集輸入。本節將嘗試教你如何根據使用者的請求收集輸入。有關即時輸入,請參閱 QBasic/高階輸入。
以下是 input 命令的語法
INPUT "[text to user]"; [variable] ' Question mark added
或
INPUT "[text to user]", [variable] ' No question mark added
示例
INPUT "What is your name"; name$
或
INPUT "What is your age", age
在向用戶輸出文字後使用分號 (;) 時,將在輸出中新增問號 (?) 和空格 ( )。使用逗號 (,) 時,不會新增問號。
如果指定字串(例如,'name$'),則使用者在按“回車”鍵之前輸入的任何內容都將被接受。
如果指定數值變數(例如,'age'),則使用者必須輸入數字。如果輸入任何非數字鍵,則將輸出錯誤訊息“從頭開始重做”,並重新執行 INPUT 命令。
CLS
INPUT "What is your name"; name$
PRINT "Hello, "; name$;
INPUT "How old are you"; age
INPUT "What is your best computer game?", game$
PRINT " name:"; name$
PRINT " age:"; age; " years old"
PRINT "best game:"; game$
請注意:在 PRINT 命令中,(;) 函式連線(合併)字串變數的內容與引號 (" ") 之間的文字。請注意空格的使用,以便最終列印的文字正確讀取。
如果在 PRINT 命令中指定了數值變數,則會在數字之前和之後自動新增額外的空格。
另請參閱:LINE INPUT 命令用於從檔案讀取一行文字(並將結果放入字串變數中),或輸入一系列變數(在這種情況下,找到的任何逗號將被視為欄位之間的分隔符)。
INPUT # 使用開啟的檔案流從檔案本身收集資料。該檔案可以是資料檔案、點陣圖或文字檔案。語法為
INPUT #file_stream, variable1 ; variable2$ ' more variables can be taken.
LINE INPUT 用於收集文字檔案中的整行。語法
LINE INPUT 1,file_line '1 is the file stream number. Can be any other number too.
警告:如果輸入超過檔案末尾,將發出錯誤: "輸入超過檔案末尾 "。可以使用 LOF 和 EOF 函式來防止錯誤。(LOF 代表檔案長度,而 EOF 代表檔案結尾)
以下段落需要安裝了 QBasic 的計算機
首先,將以下程式中的所有內容(“PRINT "Hello World"”)寫入文字編輯器或 QBasic IDE(整合開發環境)本身,並將其儲存為“1HELLO.BAS”。接下來,在 QBasic 中開啟該檔案(除非你使用的是 QBasic IDE,在這種情況下它已經開啟),然後按 F5 鍵。你也可以使用 IDE 視窗頂部的選單欄上的“執行”選單。這將執行(執行)該程式。單詞“Hello World”應出現在螢幕的左上角。你剛剛執行了第一個 QBasic 程式。如果你再次按 F5,另一行文字“Hello World”將出現在螢幕的左上角,將第一行推到螢幕的第二行。你可以對本華夏公益教科書中的其他示例程式遵循相同的步驟。
PRINT "Hello World"
PRINT 是 QBasic 的文字輸出函式。它是我們將透過本節探索的命令。PRINT 是 QBasic 函式,需要引數。我們剛剛執行的“Hello, World!”程式中的引數是單詞“Hello, World!”。因此,PRINT 是函式,“Hello, World!”是我們傳遞給函式的引數。
PRINT [螢幕文字]
注意:作為快捷方式,只需使用問號“?”代替命令“PRINT”。同樣,可以使用單引號“'”代替關鍵字 REM 來在程式碼中插入註釋
PRINT "This line will be erased"
CLS
PRINT "Hello";
PRINT " World",
PRINT "Hello Jupiter"
PRINT "Good Bye",,"For";" Now"
PRINT 1,2,3,4,5
以下是程式輸出應顯示的樣子
Hello World Hello Jupiter
Good Bye For Now
1 2 3 4 5
2HELLO.BAS 的第一行將“This line will be erased.”輸出到螢幕。但是,在第二行中,CLS 命令在立即清除屏幕後執行。因此,它只會閃爍一下。文字“Hello Jupiter”應與下面的“2”對齊。可以連續使用多個逗號。在本例中,在“Good Bye”之後使用了兩個逗號,將“For Now”移動到兩個製表符列上。“For Now”應與“3”對齊。
關於此主題的最後一句話是,嘗試一下。嘗試在程式中使用逗號和分號。
CLS
hello$ = "Hello World"
number = 12
PRINT hello$, number
變數用於儲存資訊。它們就像容器。你可以在其中放入資訊,然後稍後將資訊更改為其他內容。在第一個示例中,它們可能看起來不太有用,但在下一節(輸入)中,它們將變得非常有用。
在本例中,我們使用兩種型別的變數:字串變數和數值變數。字串變數儲存字串,例如單詞。(字元是字母、數字或符號。)在本例中,字元是字母。字串變數用美元符號表示變數名稱的結尾。本程式中的字串變數是 hello$。你為 hello$ 分配的任何值都將在 PRINT 語句中顯示。數值變數是 number。數值變數沒有像字串變數那樣的特殊結尾。
CLS
LOCATE 14, 34 'position the left eye
PRINT "<=>" 'draw the left eye
LOCATE 14, 43 'position the right eye
PRINT "<=>" 'draw the right eye
LOCATE 16, 39 'position the nose
PRINT "o|o" 'draw the nose
LOCATE 18, 36 'position the mouth
PRINT "\_______/" 'draw the mouth
LOCATE 19, 42 'the bottom
PRINT "The Face by QBasic"
LOCATE 語句
[edit | edit source]LOCATE 用於定位游標以輸出下一段文字。與讀取 (X,Y) 的笛卡爾座標相反,locate 語句為 LOCATE Y,X。在這種情況下,Y 是從螢幕頂部向下移動的距離,而 X 是從螢幕左側移動的距離。LOCATE 不遵循標準座標系的原因是,它不需要包含 X 部分;可以使用 LOCATE Y 格式,它只指定要開始的行。
LOCATE[row, column]
LOCATE[row]
5FACE.BAS
[edit | edit source] CLS
LOCATE 14, 34
COLOR 9
PRINT "<=>"
LOCATE 14, 43
PRINT "<=>"
COLOR 11
LOCATE 16, 39
PRINT "o|o"
COLOR 4
LOCATE 18, 36
PRINT "\_______/"
COLOR 20
LOCATE 19, 42
PRINT "U"
LOCATE 1, 1
COLOR 16, 1
PRINT "Hello World"
COLOR 語句
[edit | edit source]5FACE.BAS 程式被分成很多部分,以便於閱讀。這是一個好的程式設計習慣的例子。每三行程式碼指定了人臉部分的顏色、位置和形狀。位置和顏色的順序無關緊要。新的 COLOR 語句允許您更改文字的顏色。一旦更改,所有輸出都將以新顏色顯示,直到使用 COLOR 或 CLS 為止。
COLOR [foreground]
COLOR [foreground], [background]
顏色由數字指定,將在下一節中討論。
顏色編號
[edit | edit source]有 16 種顏色(在螢幕模式 0 中),從 0 到 15 編號。
| 0 | 黑色 | 8 | 灰色 |
| 1 | 藍色 | 9 | 淺藍色 |
| 2 | 綠色 | 10 | 淺綠色 |
| 3 | 青色 | 11 | 淺青色 |
| 4 | 紅色 | 12 | 淺紅色 |
| 5 | 紫色 | 13 | 淺紫色 |
| 6 | 棕色/橙色 | 14 | 黃色(淺橙色) |
| 7 | 淺灰色(白色) | 15 | 白色(淺白色) |
如果您仔細觀察此圖表,您會發現有 8 種主要顏色(0 到 7),然後這些顏色重複,每種顏色都以更淺的色調顯示。您可能還會注意到顏色充當二進位制值的組合(其中藍色=1,綠色=2,紅色=4 等)。這使得記憶顏色方案變得容易得多。閃爍顏色也可用:從 16 開始,顏色再次開始閃爍黑色並延伸到 31(閃爍白色)。但是,閃爍選項不可用於背景,僅用於文字(前景)。在您要閃爍的顏色中新增 16。例如:2+16=18 - 閃爍的綠色,4+16=20 - 閃爍的紅色。
可以使用閃爍的前景文字和強烈的背景,但這超出了本 QBasic 教科書的範圍,並且可能在 MS Windows 在視窗模式下顯示控制檯時不起作用。
字型
[edit | edit source]在 VGA 相容的顯示卡上,您可以檢查和更改螢幕模式 0 中使用的字型。
OUT &H3CE, 5: OUT &H3CF, 0 'Clear even/odd mode OUT &H3CE, 6: OUT &H3CF, 4 'Map VGA mem A0000-BFFFF OUT &H3C4, 2: OUT &H3C5, 4 'Set bit plane 2 OUT &H3C4, 4: OUT &H3C5, 6 'Clear even/odd mode again
您現在可以使用 PEEK 和 POKE 訪問字元資料。它從絕對地址 &HA0000 開始,每個字元為 32 位元組,每個位元組都是八位的一行。每個位元組的最高位對應於每行的最左側畫素。通常僅使用前 16 行或 8 行,具體取決於 WIDTH 設定。
完成後,請務必將記憶體對映恢復到 QBasic 所期望的設定
OUT &H3CE, 6: OUT &H3CF, 14 'Map VGA mem B8000-BFFFF
總結
[edit | edit source]在本節中,我們介紹了幾種操作文字輸出的方法。所有內容都圍繞 PRINT 語句展開。LOCATE 和 COLOR 修改了文字的顯示位置及其外觀。我們使用 CLS 清除螢幕,並簡要介紹了變數,這些變數將在後面的部分中進行擴充套件。
基礎數學
[edit | edit source]QBasic 中有六種數值變數
| 型別 | 最小值 | 最大值 |
|---|---|---|
| 整數 | -32,768 | 32,767 |
| 長整數 | -2,147,483,648 | 2,147,483,647 |
| 浮點數 | -3.37x10^38 | 3.37x10^38 |
| 雙精度浮點數 | -1.67x10^308 | 1.67x10^308 |
| 64 位整數 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
| 64 位浮點數 | ±1.18E−4932 | ±1.18E+4932 |
請注意,只有在 QB64 中才可以使用 64 位的整數和浮點數型別的變數。
很多程式設計都是數學。別擔心:很多數學都很簡單,但它仍然是數學。在本節中,我們將學習一些基本數學(與您在三年級學到的內容相同)以及運算元字。
方程式設定
[edit | edit source]在 QBasic 中,方程式具有基本設定,即右邊和左邊。例如 X=5,您可能已經猜到,這將變數 X 設定為 5。但我們也可以在右邊使用變數。Y=X*10 將 Y 設定為 X 的 10 倍,在這種情況下為 50。在下一個程式中,我將展示幾個方程式,讓您瞭解數學。
7MATH.BAS
[edit | edit source] CLS
'Set a-d to initial values
a = 10
b = 6
c = 3.1415
d = 3.333333
e = a + b
PRINT a; "+"; b; "="; e
f = c * d
PRINT c; "x"; d; "="; f
g = b - c
PRINT b; "-"; c; "="; g
h = b / d
PRINT b; "/"; d; "="; h
i = INT(d)
PRINT "Remove the decimal from "; d; "="; i
理解 7MATH.BAS
[edit | edit source]您從中學到的最重要的內容是數學方程式的設定。我認為您可以弄清楚所有符號的含義以及它們的作用,但 QBasic 對方程式很挑剔。對於“e=a+b”,如果您嘗試“a+b=e”,它將無法工作。我想在 7MATH.BAS 中解決的最後一件事是 INT() 函式。就詞彙而言,函式是指接受一段資訊併為您返回另一段資訊的東西。因此 PRINT 是一個語句,而 INT() 是一個函式。INT() 函式接受一個數字並截斷其小數部分,它不進行四捨五入。因此 INT(5.1) 為 5,INT(5.999) 仍然為 5。如果您要四捨五入數字,請使用 CINT()。
8MATH.BAS
[edit | edit source] CLS
INPUT "Enter a number: ", x
PRINT
x = x + 5
PRINT "X is now: "; x
x = x * x
PRINT "X is now: "; x
x = x / 5
PRINT "X is now: "; x
x = x - 4
PRINT "X is now: "; x
x = x / x
PRINT "X should be 1: "; x
理解 8MATH.BAS
[edit | edit source]8MATH.BAS 展示了一個在程式設計中非常重要但在數學中不可能實現的簡單概念。計算機計算方程式的過程是在方程式右邊進行所有數學運算,然後將其貼上到左邊的變數中。因此方程式 x=x+5 非常有意義,與數學中的矛盾不同。根據當前值重新分配變數的值很常見,也是減少變數數量的好方法。
9TIP.BAS
[edit | edit source] CLS
INPUT "How much is your bill: ", bill
INPUT "What percent tip do you want to give: ", tip
tip = tip / 100 'change percent to decimal
tip = tip * bill 'change decimal to money
PRINT
PRINT "The tip is"; tip; "$."
PRINT "Pay"; tip + bill; "$ total."
小費計算器
[edit | edit source]9TIP.BAS 根據您希望給的小費百分比和賬單,計算您的小費和總賬單。前三行清除螢幕並從使用者處獲取資訊。第五行將小費從百分比更改為正確的十進位制數,方法是除以 100(例如,20%=.2 因為 20/100=.2)。下一行將該百分比乘以賬單,將其轉換為美元價值。因此,如果您的賬單為 20.00 美元,並且您付了 20% 的小費,它將乘以 20*.2,即 4 或 4.00 美元。最後三行格式化輸出。
這是一個完整的程式的好例子。它從使用者那裡收集資訊,處理資訊,並向用戶提供反饋。此外,程式的中間部分是變數儲存的一個很好的例子。這是一個需要一些練習才能掌握的主題。在編寫程式時,如果您使用太多變數,將很難跟蹤所有變數。如果您嘗試過度節省,您的程式碼可能難以理解。
您可能會注意到,如果您輸入的賬單金額不是精確的美元值,程式可能會輸出超過兩位小數。作為練習,嘗試修改程式,使其只顯示兩位小數 - 您可以使用 `CINT()` 函式或任何您打算使用的其他舍入方法。
'ORder of OPerations
CLS
a = 15
b = 10
c = 12.2
d = 1.618
PRINT a * b + c 'these two are different
PRINT a * (b + c)
PRINT
PRINT b - c / d 'these two are different
PRINT (b - c) / d
PRINT
PRINT a * b - c * d / a + d 'these two are the same
PRINT (a * b) - ((c * d) / a) + d
10OROP.BAS 是運算順序和如何使用括號來操縱它的一個例子。我不打算在這裡深入解釋運算順序。我能給出的最好的建議是,除非您確定運算順序,否則請使用括號來確保方程式按您想要的方式工作。您只需要知道括號是,最深層的巢狀括號首先計算。如果您想了解更多資訊,有很多代數資源可用。關於這一點,您可能希望複習一下代數。雖然它對於程式設計不是必需的,但它可以幫助簡化程式設計,並使您能夠建立更高階的程式。
雖然我們將在下一節中討論它們的用途,但我希望討論隨機數的生成。QBasic 有一個隨機數語句 RND,它生成一個介於 0 和 1 之間的隨機小數。您可以將其視為一個隨機百分比。起初,這可能看起來像一個奇怪的生成隨機數的方式。但是,用一點數學知識,很容易操縱它來提供您想要的任何範圍內的數字。
第一步是用一個數字(您想要的範圍)乘以 RND。例如 'RND*10'。這將返回介於 0 和 10(包括 0 和 10)之間的隨機數(小數)。因此,要選擇一個介於零和十之間的隨機數,我們會說 '(RND*10)'
CLS
RANDOMIZE TIMER
PRINT "Random number from 0-9:"; RND * 10
PRINT
PRINT "Random number from 1-10:"; (RND * 10) + 1
PRINT
PRINT "Random integer from 1-10:"; INT(RND * 10) + 1
PRINT
PRINT "Random even integer from 50-100:"; INT(RND * 25) * 2 + 50
關於 11RND.BAS 的一些說明,第二行 RANDOMIZE TIMER,設定計算機使用當前時間來選擇隨機數。如果您不這樣做,它每次都會選擇相同的隨機數(試試看,編寫一個單行程式,PRINT RND,並反覆執行它,您的螢幕將充滿相同的數字)這對於某些應用程式來說可能很有用,但對於大多數應用程式來說則不然。在所有使用 RND 語句的程式的頂部新增 RANDOMIZE TIMER,它們將變得不那麼可預測。這個程式只展示了一些從隨機數生成器中選擇所需內容的方法。最後一行顯示您可以對得到的內容非常具體。確保執行此程式幾次,以檢視不同的結果。
要從程式的兩個或多個部分中選擇要執行的部分,可以使用 IF 語句。還可以使用 WHILE、DO UNTIL 和 CASE 語句。所有這些都透過使用布林邏輯“測試”來控制條件執行,測試的結果要麼為 TRUE 要麼為 FALSE。要重複一段程式碼一定次數,可以使用 FOR 語句。
IF 測試可以在單行中執行,但也可以像其他語句一樣用來控制程式碼塊。
布林邏輯是一種測試,它只產生兩種可能的結果之一,真或假。測試本質上始終是數學上的……當兩個字元(或字串)“比較”時,使用的是它們的 ASCII 碼(因此 a < b 且 b < A)。
在 QBasic 中使用的比較運算子為:= 如果兩個變數相等則為真 < 如果第一個小於第二個則為真 =< 如果第一個小於或等於第二個則為真 > 如果第一個大於第二個則為真 >= 如果第一個大於或等於第二個則為真 <> 如果兩個不相等則為真
可以使用“AND”、“OR”和“NOT”運算子將多個測試連結在一起。我們將在後面詳細介紹這些運算子的含義,但您可能已經理解前兩個運算子了。
QBasic 中最有用的語句之一是 IF 語句。它允許您根據給定的條件選擇程式將執行的操作。接下來的幾個程式將介紹一些使用 IF 語句的方法。
IF [conditional] THEN [do this]
單行 IF 是最簡單的示例。要執行程式碼塊,使用 END IF
IF [conditional] THEN
[do this]
[and do this]
...
[and also do this]
END IF
IF [conditional] THEN [do this] ELSE [do that]
要從兩個不同的程式碼塊中選擇,使用 ELSE 語句。
IF [conditional] THEN [do this] .. [and do this] ELSE [do that] .. [and also that] END IF
作為從頭開始一個全新的 IF THEN ELSE 語句序列的替代方案。您可以在 THEN 語句(s)之後新增 ELSEIF [條件] THEN。這不會建立新的巢狀級別。
IF [條件] THEN
[do this] .. [and do this]
ELSEIF [條件] THEN
[do that] .. [and also that]
ELSEIF [條件] THEN
[do the other] .. [and also ...]
ELSE
[do this final thing]
END IF
FOR <variable name> = <start value> TO <end value> [STEP <increment>] [do this] ... [and do this] NEXT
<增量> 可以是 + 或 -,並且是可選的。如果省略,預設值為 +1。FOR 迴圈中包含的程式碼始終至少執行一次,因為只有在 'NEXT' 語句處才會檢查變數的值是否超過結束值。
當 NEXT 語句執行時,變數將根據 STEP 值進行修改,並與結束值進行比較。如果變數尚未超過結束值,控制權將返回到 FOR 語句後的行。
您可以使用 EXIT FOR 命令提前退出 FOR 迴圈。
CLS
RANDOMIZE TIMER
num = INT(RND * 20) + 1
FOR count = 1 TO 5
INPUT "Pick a number between 1 and 20: ", answer
IF answer = num THEN PRINT "You win after";count;"guesses!": END
NEXT
PRINT "You lose"
WHILE <condition is true> [do this] .. [and this] WEND
如果條件為真,則執行 WHILE 語句後的程式碼。當執行 WEND 命令時,它將控制權返回給 WHILE 語句(在那裡再次測試條件)。當條件計算為 FALSE 時,控制權將傳遞到 WEND 語句後的語句。
PRINT "Press any key to continue"
WHILE INKEY$=""
WEND
在上面的例子中,您看到了一個“按任意鍵繼續”的提示,它會等待使用者按下任何鍵。(INKEY$ 功能將在 高階輸入 中介紹。)
DO...LOOP
[edit | edit source]DO [this] .. [and this] LOOP WHILE <condition is true> / LOOP UNTIL <condition is true>
DO...LOOP 結構是 WHILE 迴圈的更高階形式 - 與其他流程控制塊一樣,它由 DO 和 LOOP 標記以表示邊界。
它依賴於放置在 DO 或 LOOP 後的條件語句。
DO
a$ = inkey$
LOOP WHILE a$=""
作為替代方案,您可以用 UNTIL 替換 WHILE,讓迴圈在滿足特定條件之前繼續。
DO
x=x+1
LOOP UNTIL x >= 10
在某些版本的 BASIC 中,UNTIL 或 WHILE 條件可以跟隨 DO 語句而不是 LOOP 語句(前測),與上面顯示的(後測)相反。
12IF.BAS
[edit | edit source] CLS
RANDOMIZE TIMER
num = INT(RND * 100) + 1
DO
INPUT "Pick a number between 1 and 100: ", answer
IF num = answer THEN PRINT "You Got It!"
IF num > answer THEN PRINT "Too Small"
IF num < answer THEN PRINT "Too big"
LOOP UNTIL num = answer
PRINT "Game Over."
SELECT CASE
[edit | edit source] SELECT CASE <variable expression>
CASE <value>
[do this]
CASE <value 2>
[do instead]
...
CASE ELSE
...
END SELECT
select 語句是重複使用 IF 語句的替代方法。<變量表達式> 被計算並依次與每個 CASE <值> 進行比較。當找到與 CASE <值> 匹配的值時,將執行後面的 [do this] 程式碼。如果執行了 EXIT CASE,控制權將傳遞到 END SELECT 後的行,否則將檢查下一個 CASE <值>。如果未找到匹配項,則執行 CASE ELSE。請注意,<值> 可以是數字、字元或字串或邏輯表示式(例如 '>0'、'<>1')。還要注意,可能會找到並執行多個 CASE 匹配(因此,例如,如果兩個 CASE <值> 是 'CASE >1' 和 'CASE >10',一個計算結果為 11(或更多)的 <變量表達式> 將導致 CASE >1 和 CASE >10 都被執行)。
CLS
PRINT "WELCOME"
PRINT "I HAVE AN ANSWER FOR ANY OF YOUR QUESTIONS"
10 INPUT "WRITE YOUR QUESTION AND I'LL GIVE YOU AN ANSWER ", question$
RANDOMIZE TIMER
PRINT
answer = INT(RND * 4 + 1)
SELECT CASE answer
CASE 1
PRINT "PLEASE REPHRASE YOUR QUESTION."
CASE 2
PRINT "YOUR QUESTION IS MEANINGLESS."
CASE 3
PRINT "DO YOU THINK I CAN ANSWER THIS?"
CASE 4
PRINT "THIS QUESTION LOOKS FUNNY."
END SELECT
PRINT
PRINT "ENTER ANOTHER QUESTION", K$
GOTO 10
如果一個引數會被多個 case 語句覆蓋,第一個選項將優先考慮。
高階輸入
[edit | edit source]INKEY$
[edit | edit source]從使用者那裡獲取即時資訊有點困難。為此,我們將使用 INKEY$ 命令,它會檢查使用者是否鍵入了一個鍵,並將該鍵壓送到程式中。
看看這段程式碼,然後我們將深入瞭解它。
DO
LET k$ = INKEY$
LOOP UNTIL k$ <> ""
SELECT CASE k$
CASE "q"
QuitProgram
CASE "c"
MakeCircle
CASE "s"
MakeSquare
END SELECT
第一部分是 DO-LOOP,它不斷輪詢 INKEY$ 以獲取返回值。在基本用法中,如果沒有任何鍵被按下,INKEY$ 會返回一個空字串,並繼續執行程式。一旦按下鍵,INKEY$ 會立即返回該鍵。
鍵盤緩衝區
[edit | edit source]INKEY$ 在做什麼,它是怎麼工作的呢?
雖然 INKEY$ 命令看起來像返回當前按下的鍵,但事實並非如此。它被程式用來回答“KEYboard 緩衝區中有什麼?”這個問題。要理解這一點,您需要理解什麼是基本的緩衝區,以及為什麼使用它。
在舊的系統中(不一定是指 IBM PC),一個單一的晶片處理鍵盤輸入,並控制 Caps Lock 和 Num Lock 的 LED 燈。由於計算機一次可以做很多事情(例如,從滑鼠獲取輸入,處理數字,呼叫子例程,在螢幕上顯示新資訊),因此它需要能夠記住在它忙於其他工作時鍵盤上按了什麼鍵。該晶片包含了一些記憶體(稱為緩衝區),用於跟蹤有限數量的鍵壓。
在 IBM PC 的 Dos 平臺下,硬體略有改變。在硬體緩衝區中,按下或釋放一個鍵會中斷正在執行的程式,以將一個鍵擊新增到位於 BIOS 中的軟體緩衝區中。這個過程通常是使用者沒有意識到的,對系統性能的影響很小。但是,這個緩衝區允許 15 個字元:當計算機繁忙時試圖溢位它會導致短暫的蜂鳴聲,並且會丟棄任何後續的字元。
INKEY$ 命令將此緩衝區用作 FIFO(先進先出)緩衝區。舉個例子,假設您有一個遊戲,螢幕上有一個彈跳球,底部有一個擋板。計算機程式必須不斷更新螢幕以顯示球的運動。在執行此操作時,程式會經過一個 INKEY$ 命令來檢視返回的值。如果使用者自上次呼叫該命令以來按下了某個鍵,它將返回該鍵。假設球正在向右移動,使用者需要按 “R” 鍵告訴程式將擋板向右移動。由於程式忙於移動球並更新螢幕,因此它不會立即注意到使用者按下了該鍵。相反,鍵壓將儲存在鍵盤緩衝區中,並在幾毫秒(或微秒)後,當 INKEY$ 命令被使用時被檢索。
在許多程式中(如上所述),INKEY$ 將出現在迴圈中。它被反覆請求。這使得程式可以一次獲取一個字元的使用者輸入。使用我們上面的例子,使用者可能需要反覆按下 R,直到擋板在球的下方。另一方面,使用者可能按了太多次 R,需要按 L 將其向左移動。由於 INKEY$ 命令使用的是 FIFO 緩衝區,因此它將始終按照使用者輸入的順序檢索按下的鍵。
總而言之,INKEY$ 命令始終會返回並刪除鍵盤緩衝區中的第一個字元。一般來說,它被反覆使用以檢索所有按下的鍵,並允許使用者以接近“即時”的方式與程式互動。如果鍵盤緩衝區中沒有鍵,INKEY$ 會返回一個空字串(無字元)。
掃描碼
[edit | edit source]有些鍵壓與 ASCII 字元沒有關聯。當按下這些鍵之一時,INKEY$ 返回一個包含兩個字元的字串:第一個字元是空字元(ASCII 碼 0),第二個是鍵盤的原始掃描碼。掃描碼的完整列表可以在 QBASIC 幫助檔案中找到。您也可以透過檢查按下這些鍵時 INKEY$ 的結果來確定掃描碼。
Ctrl+ Extended; prefixed with CHR$(0)
1 A 3 Ctrl+2
2 B 15 Shift+Tab
3 C
4 D Alt+ Alt+ Alt+ Alt+
5 E 16 Q 30 A 44 Z 120 1
6 F 17 W 31 S 45 X 121 2
7 G 18 E 32 D 46 C 122 3
8 H Backspace 19 R 33 F 47 V 123 4
9 I Tab 20 T 34 G 48 B 124 5
10 J Ctrl+Enter 21 Y 35 H 49 N 125 6
11 K 22 U 36 J 50 M 126 7
12 L 23 I 37 K 127 8
13 M Enter 24 O 38 L 128 9
14 N 25 P 129 0
15 O 130 -
16 P Shift Ctrl Alt 131 =
17 Q 59 84 94 104 F1
18 R 60 85 95 105 F2
19 S 61 86 96 106 F3
20 T 62 87 97 107 F4
21 U 63 88 98 108 F5
22 V 64 89 99 109 F6
23 W 65 90 100 110 F7
24 X 66 91 101 111 F8
25 Y 67 92 102 112 F9
26 Z 68 93 103 113 F10
27 [ Escape 133 135 137 139 F11
28 \ 134 136 138 140 F12
29 ]
30 6 71 Home 72 Up 73 PgUp
31 - 75 Left 77 Right
79 End 80 Down 81 PgDn
Ctrl+ 82 Insert 83 Del
127 Backspace
119 Ctrl+Home 132 Ctrl+PgUp
115 Ctrl+Left 116 Ctrl+Right
117 Ctrl+End 118 Ctrl+PgDn
子例程和函式
[edit | edit source]目的
[edit | edit source]子例程和函式是將程式碼分解成可重用“塊”的方法。它們允許程式設計師透過呼叫相應的過程或函式來重用一組通用的指令。
例如,假設您需要列印多個值表。一種方法是直接將所有表 PRINT 命令輸入到您需要它們的位置。但是,這不僅會使程式非常大,而且還會使除錯或更改表“樣式”變得更加困難。更簡單的方法是建立一個單一的“打印表”過程,並將所有 PRINT 命令輸入到其中。然後,每當您需要打印表格時,您只需使用要列印的值列表“呼叫” “打印表”過程即可。
過程 vs. 函式
[edit | edit source]過程會執行某些操作,但不會為程式設計師返回任何值。例如,過程可能用於設定螢幕模式和調色盤。
函式會執行某些操作並返回一個值。例如,如果您需要找到兩個值的平均值,您可以編寫一個函式,該函式接收兩個數字並返回平均值。
GOTO 和 GOSUB
[edit | edit source]GOTO 和 GOSUB 語句是最初建立子程式的方法。它們在較舊的 BASIC 實現中最為常見,並出於相容性原因保留了下來;但是,不建議在其他程式語言或大型專案中使用它們,因為 GOTO 使“跟蹤”程式流程變得更加困難,而 GOSUB 不會“隔離”對任何變數所做的更改。
這兩個命令依賴於標籤,標籤有兩種形式。第一種也是較舊的形式是在每一行開頭編寫行號(通常以 10 為增量)。較新的方法類似於其他程式語言,即一個單詞後跟一個冒號。
GOTO 語句很簡單;它只是將執行點移至給定的標籤。
GOSUB 語句將控制權轉移到給定的標籤,但是當遇到 RETURN 語句時,執行將返回到 GOSUB 語句後的下一行。在 GOSUB 中所做的任何更改都將反映到“主”程式碼中使用的實際變數中。
ON ERROR 允許您為程式定義錯誤處理程式;當發生錯誤時,它會立即跳轉到給定的標籤。程式到達 RESUME 語句後,控制權將返回,該語句可以將控制權返回到同一位置、下一條語句或任何其他所需標籤。
在 Qbasic 中,錯誤處理程式不能位於任何子程式中。因此,任何錯誤檢查或標誌都必須透過使用與主模組共享的變數來處理。
注意:如果您的錯誤處理例程中沒有“resume”語句(即您嘗試使用 gotos 來完成所有操作),則錯誤處理只會工作一次 - 下一個“on error”將被忽略,並且程式將結束,就像您根本沒有“on error”語句一樣。此問題似乎沒有在任何文件中提及。我花了三個小時才弄清楚為什麼兩個幾乎相同的程式部分的行為如此不同。
宣告子程式的更佳方法是使用 SUB 語句塊,因為(預設情況下)在退出時會丟棄在子程式中使用的任何新變數。
在 QBasic IDE 中,這樣做會將 SUB 塊移動到它自己的視窗中,以防止意外刪除模組,並使程式程式碼更容易組織。
呼叫子程式就像編寫子程式的名稱(傳遞任何必需的引數)一樣簡單。如果需要,可以使用 CALL 語句來向其他程式設計師表明它是一個子程式。
SUB name (params)
{SHARED variables 'if any}
'{code to execute}
' ...
' ...
{STATIC variables 'if any, to be saved for use next time}
END SUB
雖然傳遞給子程式的引數是按“引用”傳遞的(即它們在 SUB 中使用新名稱),但對值所做的任何更改都會“反映回”原始值。預設情況下,在達到 END SUB 時(或執行 EXIT SUB 時)會丟棄在 SUB 中使用的所有其他變數,除非如下所述:
要在下一個 CALL 中“保留”在 SUB 中使用的變數的值以供重複使用,請在最後使用 STATIC 關鍵字。
如果您需要訪問一個變數(未作為引數傳遞),請使用 SHARED 關鍵字在子程式的開頭定義它(共享變數保留其名稱)。
函式是一種返回值的子程式形式。定義子程式中所適用的一切也適用於函式。在函式中,返回值是透過將函式名用作變數來建立的 - 當達到有效的退出或結束呼叫時,返回值將傳遞給呼叫表示式。有兩種方法可以從函式中返回,一種是到達 END FUNCTION 語句,另一種是呼叫 EXIT FUNCTION。END FUNCTION 和 EXIT FUNCTION 之間的區別在於,只能有一個 END FUNCTION,並且它必須出現在函式的所有其他程式碼之後,因為它表示程式碼塊的結束。EXIT FUNCTION 可以出現多次,並且可以放置在任何認為合適的地方。
FUNCTION name (params)
' Shared variable declarations
name = result
' ...
END FUNCTION
函式的宣告方式與變數相同 - 它返回它定義為返回的變數型別,與變數定義為包含其指定型別的方式相同。預設情況下,它是數字,但附加一個美元符號表示它返回一個字串。
函式只能在表示式中呼叫;與子程式不同,它們不是獨立的語句。
QBasic 有五種內建型別:INTEGER (%)、LONG (&) 整數、SINGLE (!) 浮點數、DOUBLE (#) 浮點數和 STRING ($)。QB64 還有兩種內建型別:_INTEGER64 (&&) 和 _FLOAT (##)
隱式宣告是透過在變數名稱末尾新增型別字元來完成的(%、&、!、#、$、&&、##)。有關更多資訊,請參見 QBasic/Basic Math。
顯式宣告是透過在第一次使用之前使用 DIM 語句來完成的。
DIM a AS STRING
DIM b AS INTEGER
DIM c AS LONG
DIM d AS SINGLE
DIM e AS DOUBLE
DIM f AS _INTEGER64 'QB64 only
DIM g AS _FLOAT 'QB64 only
如果您不使用隱式或顯式宣告,則 QBASIC 直譯器會假設 SINGLE 型別。
使用者定義型別允許您建立自己的資料結構。請注意,自定義型別類似於陣列。
TYPE playertype
name AS STRING
score AS INTEGER
END TYPE
然後,您可以根據此型別宣告變數,並訪問它們。
DIM playername AS playertype
playername.name = "Bob"
playername.score = 92
上面的示例展示瞭如何將自定義型別用於維護資料,例如在玩遊戲的玩家身上。
陣列是在單個變數中儲存的值的集合。STRING 是字元的陣列(因此,例如,char$(1) 表示字串 char$ 中的第一個字元)。數字陣列應使用 DIM 指令定義(除非您定義它們,否則它們在每個維度上都限制為 10 個元素)。
預設情況下,QBasic 中的陣列大小是靜態的,不能在程式的後續部分更改。設定此類陣列的程式碼如下所示:
DIM myArray(10) as TYPE 'this is explaining the datatype to be used during program execution in array'
TYPE 可以是任何內建的 QBasic(INTEGER、LONG、SINGLE、DOUBLE、STRING)或使用者定義的型別。如果沒有指定,則陣列將採用由變數名稱字尾定義的型別 - INTEGER (%)、LONG (&) 整數、SINGLE (!) 浮點數、DOUBLE (#)、STRING ($) - 或者如果沒有,則為 INTEGER。
警告:如果您的資料型別是字串,則 DIM string(10) 定義一個包含 10 個字元的單個字串,而不是 10 個任意長度的字串!(10 個最多包含 128 個字元的字串將被定義為 DIM string(10,128)
透過在程式開頭髮出元命令 '$DYNAMIC,您可以使陣列變為動態的
' $DYNAMIC
DIM myDynamicArray(5) as INTEGER
REDIM myDynamicArray(10) as INTEGER
現在這段程式碼是完全合法的。
要釋放陣列佔用的空間,請使用 ERASE 語句。
陣列不限於一個維度 - 可以宣告一個數組來接受兩個引數,以表示值網格。
DIM housenames(25,25) as STRING
您不能使用 REDIM 語句來更改陣列的維度數,即使使用動態分配也是如此。
在大多數語言中,陣列從值 0 開始,並向上計數。在 basic 中,可以索引陣列,使它們從任何值開始,並以任何其他值結束。
DIM deltas(-5 TO 5)
您可以使用 OPTION BASE 語句更改預設的下界。
在本課中,我們將學習如何建立和修改檔案。在這樣做的過程中,我們將建立一個文字編輯器的部分內容來處理讀寫磁碟上的檔案 - 該程式在本節結束時不會完成,而是在高階文字輸出中完成。
讓我們從設定主程式開始
'$DYNAMIC
ON ERROR GOTO handler ' Prepares the error handler
DIM text(50) AS STRING ' Used to contain the text file.
maxlines = 50 ' Contains the current size of the buffer.
DO
CLS 'clears the screen
INPUT "Would you like to create a (N)ew file, (L)oad an existing one, or (E)xit the program"; choice$
SELECT CASE UCASE$(choice$) 'UCASE$ converts strings to UPPER CASE
CASE "N" 'New file
CASE "L" 'Load a file
CASE "E" 'Exit
CLS
END
END SELECT
LOOP 'returns to the top of the program.
handler:
errorflag = ERR ' Keep track of the error that occurred.
RESUME NEXT ' Proceeds with the next statement.
如您所見,我們正在使用CASE而不是IF. IF語句有時比 case 語句更有效,但現在,我們想要避免義大利麵條程式碼(其中有太多GOTO's)。
到目前為止,我們還沒有太多內容,但這只是一個開始。我們已經詢問了使用者他們想做什麼,並完成了 1/3 的選項。從這個角度來說,還不錯!
OPEN 語句允許從磁碟讀取或寫入資訊。通常,OPEN 語句遵循以下模式
OPEN file$ FOR INPUT AS 1
OPEN file$ FOR OUTPUT AS 2
檔案$確定要使用的檔名。該FOR部分指示如何訪問或操作檔案 - 它可以是 APPEND、BINARY、INPUT、OUTPUT 和 RANDOM。該AS #是用於該檔案控制代碼的識別符號 - 如果需要,它可以是一個變數。
當你需要訪問或寫入檔案控制代碼的內容時,PRINT 和 INPUT 語句需要檔案控制代碼作為第一個引數
INPUT #1, a$
PRINT #2, a$
在某些情況下,你需要檢測是否將要到達檔案末尾 - 這是由 EOF 函式執行的,它接受一個接收輸入的檔案控制代碼。
我們現在將新增一個子例程,以從磁碟讀取完整檔案,作為文字行,放入一個名為 text() 的字串陣列中。也可以讀取一個包含數值的 data 檔案(並將這些值輸入到一個數字陣列中),但這屬於另一個主題。
請注意,透過逐行讀取直到檔案末尾,查詢檔案 'size' 的程式碼,以及使用 'SEEK' 來 '迴繞' 到開頭。
SUB LoadFile
SHARED filename$
SHARED lines, maxlines
SHARED text() AS STRING
SHARED errorflag
INPUT "Enter filename: "; filename$
OPEN filename$ FOR INPUT AS 1
IF errorflag <> 0 THEN
errorflag = 0
CLOSE
PRINT "File not found - press return to continue."
INPUT "", a$
EXIT SUB
END IF
' Count the number of lines.
lines = 0
DO WHILE NOT EOF(1)
LINE INPUT #1, l$
lines = lines + 1
LOOP
'Allocate enough space for input.
IF maxlines > lines THEN
REDIM text(lines + 25) AS STRING
maxlines = lines + 25
END IF
SEEK #1, 1 ' Rewind to the beginning of the file.
' Read the lines into the buffer
FOR cline = 1 TO lines
LINE INPUT #1, text(cline)
NEXT
CLOSE 1
errorflag = 0
END SUB
上面的示例將檔案視為 type=text。如果檔案包含數字(例如,每行 N 個整數 x M 行的資料陣列),則可以一次讀取一個數字(input #),直接輸入到數字陣列中。Input 將一次讀取一個數字,在每個數字輸入後 '停止'。數字可以用 '任何東西' 分隔(因此文字行將被跳過)。
用於將檔案寫入磁碟的函式更簡單
SUB SaveFile (outfile$)
SHARED filename$
SHARED lines, maxlines
SHARED text() AS STRING
SHARED errorflag
IF outfile$ = "" THEN
LOCATE 1, 1
INPUT "Enter filename: "; outfile$
END IF
OPEN outfile$ FOR OUTPUT AS 1
IF errorflag <> 0 THEN
errorflag = 0
CLOSE
PRINT "Couldn't save file - press return to continue."
INPUT "", a$
EXIT SUB
END IF
' Write each line to the file
FOR cline = 1 TO lines
PRINT #1, text(cline)
NEXT
CLOSE 1
errorflag = 0
filename$ = outfile$
END SUB
第 2 部分:新檔案
[編輯 | 編輯原始碼]為了建立一個新檔案,你必須以 OUTPUT 模式開啟它,然後關閉它。示例
OPEN NEWFILE FOR OUTPUT AS #1
CLOSE #1
**注意:** 如果你不小心打開了現有檔案,它的所有內容都將被覆蓋!
當你嘗試編寫你的文字編輯器時,你可能會意識到你需要將游標放置在螢幕上的特定位置。這是使用LOCATE語句。
要更改當前列印顏色,請使用COLOR語句。
COLOR 7,0 'Uses the default white on black.
COLOR 15,0 'Bright white on black.
COLOR 0,1 'Black on blue
COLOR 14,0 'Bright yellow.
這可以用於底部標題欄或狀態列。
檔案PRINT USING語句允許你以指定格式輸出字串或數字。使用此語句,你可以將數字寫入指定的小數位數或執行高階輸出。
最常見的格式說明符是#和.,它們分別為數字和小數點保留空間。你也可以使用下劃線來確保列印某個字元的字面意義。
注意:**PRINT USING** 無法為數字新增*前導零*。例如,如果你指定 3 位數字 (###),兩位數將以前導空格輸出。
在執行特定過程之前,你需要一些時間。通常,最好在過程中製作一個動畫,表明程式沒有掛起,而是在繼續。為什麼要用非常複雜的圖形來製作?使用這個:<syntaxhighlight lang = QBasic> SUB TEXT_ANIM
X = 15 ' CAN BE ANY OTHER VALUE TOO
Y = 15 ' CAN BE ANY OTHER VALUE
LOCATE Y,X
DO
PRINT "> "
SLEEP 1
CLS
PRINT " > "
SLEEP 1
CLS
PRINT " > "
SLEEP 1
CLS
PRINT " > "
SLEEP 1
CLS
PRINT " > "
SLEEP 1
CLS
PRINT " >"
SLEEP 1
CLS
LOOP UNTIL INKEY$ <> ""
END SUB </SOURCE> 該程式使用 **INKEY$**,你還沒有學習過,以及 **SLEEP** 和 **DO...LOOP**,你也沒有學習過。有關更多資訊,請參閱流程控制和附錄。
QBasic 有三種發出聲音的方式。
- BEEP 命令
- SOUND 命令
- PLAY 命令
以前用作 PRINT CHR$(07),現在可用的 BEEP 命令會發出蜂鳴聲。它通常用於在顯示某些重要訊息時吸引注意。
'Syntax example
BEEP
PRINT CHR$(07)
這兩個命令,正如在計算機上執行此程式可以看出,完全相同。
SOUND 命令從 PC 揚聲器產生特定頻率的特定持續時間的音調。一次只能播放一個音調。如果連續發出多個 SOUND 語句,第一個語句之後的每個語句都不會執行,直到之前的語句完成。
SOUND f, d
- f - 頻率,單位為赫茲,範圍為 37 到 32767
- d - 持續時間,單位為刻度,範圍為 0 到 65535,每秒 18.2 個刻度
SOUND 100, 18.2
播放 100 赫茲波形,持續 18.2 個刻度,約 1 秒。
QBasic 允許的最低頻率是 37 Hz,這大約是第 2 個八度的 D 音。最高頻率是 32 767 Hz,但此音調無法聽到,因為正常人的聽力範圍在 20 000 Hz 結束。
SOUND 命令的另一個功能是使用它來控制程式中的時間。
For x% = 1 TO 10
Print x%
Sound 3200,18.2
NEXT
此程式將列印數字 1 到 10,每個數字之間延遲 1 秒,並播放 3200 赫茲的音調,間隔 1 秒。(由 FalcoN 編輯)
PLAY 命令用於播放樂音,八度。它一次只能播放一個音符。
除此之外,play 命令可以播放複雜的儲存的 "歌曲"。這是透過使用歌曲字串實現的。有關字串命令的詳細資訊,請參閱QBasic/附錄#PLAY。
rem Music keyboard
do
note$ = inkey$
select case ucase$(note$)
case "A"
Play "A"
case "B"
Play "B"
case "C"
Play "C"
case "D"
Play "D"
case "E"
Play "E"
case "F"
Play "F"
case "G"
Play "G"
end select
loop until ucase$(note$) = "Q"
end
這段程式碼使用了一個選擇情況命令來檢查 note$ 的值。Ucase$ 用於確保無論 Caps Lock 是否開啟,都不會有區別。play 命令用於播放不同的音符。這裡沒有使用 play 的其他功能。
QBasic 在圖形方面能力有限,但可以用它建立許多優秀的程式。PSET、CIRCLE、LINE 等命令用於在 QBasic 中繪製圖形。使用 QBasic 建立的圖形程式的優秀例子是 **對稱圖示** 和 **對稱分形**。
Screen 將允許你設定它的使用方式。文字圖形、兩者兼有,以及你正在處理的表面的大小。Screen 0 .. 表示僅文字。Screen 12 .. 表示 64 X 480 X 16 色 & 文字。
PSET 命令允許程式設計師在螢幕上顯示畫素。在輸入命令之前,必須確保 SCREEN 命令已存在。請看這個例子
SCREEN 13 PSET (1,1), 43
此命令將在座標 1, 1 處顯示一個黃色畫素。座標是 X 和 Y 座標,與任何其他數學情況一樣。因此 PSET 命令必須具有這種佈局才能正常工作
PSET ([X coordinate], [Y coordinate]), [Colour of Pixel]
請記住,X 座標是在螢幕上從左到右的座標,Y 座標是在螢幕上從上到下的座標。
LINE [[STEP](x1!,y1!)]-[STEP](x2!,y2!) [,[color%] [,[B | BF] [,style%]]]
STEP Specifies that coordinates are relative to the current
graphics cursor position.
(x1!,y1!), The screen coordinates of the start of the line and of
(x2!,y2!) the end of the line.
color% A color attribute that sets the color of the line or
rectangle. The available color attributes depend on your
graphics adapter and the screen mode set by the most
recent SCREEN statement.
B Draws a rectangle instead of a line.
BF Draws a filled box.
style% A 16-bit value whose bits set whether or not pixels are
drawn. Use to draw dashed or dotted lines.
這個簡單的程式顯示一條線
Screen 13 LINE (160,10)-(100,50),13

CIRCLE (100, 100), 25, 4,0,3.14
這將在座標處顯示一個圓圈。該函式的佈局如下
CIRCLE ([X Coordinate], [Y Coordinate]), [Radius], [Colour Number],[Start Angle],[Finish Angle]
請記住在前面新增一個 SCREEN 命令。
要使用 PAINT,必須宣告一個 SCREEN 命令。該命令具有告訴 QBasic 從哪裡開始的座標。顏色編號指定要使用的顏色,而邊框顏色告訴 PAINT 命令當它遇到該顏色的畫素時不要再繪製。在幾乎所有情況下,你都需要使用邊框顏色引數,僅僅是因為沒有它,PAINT 將覆蓋整個螢幕。
PAINT ([X Coordinate],[Y Coordinate]), [Color Number], [Border Color]1,2,3,4,5,5
待辦事項
使用此命令建立的圖形可以透過使用圖形編輯器或手動使用 DATA 命令來建立。DATA 命令是將資訊輸入 QBasic 並由 READ 命令讀取的一種方式。請記住,DATA 命令不能在子例程或函式中使用。請看這個例子
SCREEN 7 FOR y = 1 TO 10 FOR x = 1 TO 10 READ z PSET (x, y), z NEXT NEXT DATA 04, 04, 04, 04, 04, 04, 04, 04, 04, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 00, 00, 00, 00, 00, 00, 00, 00, 04 DATA 04, 04, 04, 04, 04, 04, 04, 04, 04, 04
FOR 命令宣告要讀取的畫素數量。在這個特定的程式中,有 10 x 10(100)個畫素,所以我們輸入
FOR x = 1 TO 10 FOR y = 1 TO 10
我們現在已經聲明瞭 x 和 y 平面。如果你想要更小或更大的點陣圖,你可以更改這些值。READ 命令讀取 DATA 命令並將收集到的資訊宣告為 z。
READ z
PSET 讀取平面和 DATA 讀取,並生成點陣圖。
PSET (x, y), z
它的工作原理類似於本頁的第一個示例,只是它讀取了多個畫素
動畫基本上是在固定時間段內變化的圖形。這裡我們將使用一個 do-loop。
SCREEN 7 ' we need to use a graphics enabled screen mode
animation 'calling the sub
SUB animation
SCREEN 7
x = 10 'set first x- coordinate
y = 10 'set first y-coordinate
DO
CLS ' going back to a blank screen so that the previous rectangle is erased
x = x + 3 ' setting increment of coordinate x
y = y + 3 ' setting increment of coordinate y
LINE (x, y)-(x + 5, y) 'drawing lines
LINE (x, y + 5)-(x + 5, y + 5)
LINE (x, y)-(x, y + 5)
LINE (x + 5, y)-(x + 5, y + 5)
SLEEP 2
LOOP UNTIL INKEY$ <> ""
END SUB
解釋
- 我們已從預設的 Qbasic 僅文字螢幕切換到啟用圖形的螢幕。
- 我們已呼叫建立動畫的子程式。
- 我們已開始 do-loop 直到。這使動畫能夠執行,直到使用者按下一個鍵結束它。
- 我們已設定座標的增量。這使得方框可以在新的位置而不是同一個位置繪製。如果希望它只在一個方向上移動,我們只需要在一個變數中設定增量。
- 我們已從每個座標繪製到另一個座標的線條。請注意,每次一個座標保持固定,而其他座標會改變。(這裡我指的是兩個座標集,第一個是起始座標,第二個是結束座標)
- 我們已發出一個 sleep 命令。這會停止執行 2 秒。如果沒有它,do-loop 會比我們想要的更快執行,動畫會很短暫。
- 透過對變數使用 RND,你可以建立隨機的、不可預測的動畫。
在此步驟中,我們將使用 QB64 內建的 _mousehide、_mousex、_mousey、_mouseinput 和 _mousebutton 命令來控制滑鼠輸入。
These Functions only work in QB64!
_mousehide
screen 7
mousetrack
sub mousetrack
do while _mouseinput
cls
X = _mousex
Y = _mousey
LINE (X - 10, Y)-(X + 10, Y), 15
LINE (X, Y - 10)-(X, Y + 10), 15
IF _MOUSEBUTTON(1) THEN
IF X > A AND X < A + 25 AND Y > B AND Y < B + 25 THEN
message$ = "yes"
goto action
END IF
END IF
loop until inkey$ <> ""
- 這裡第一個函式 "_mousehide" 阻止預設的指標滑鼠格式顯示在螢幕上
- Mouseinput 函式檢索滑鼠資訊。
- 接下來的函式 "_mousex" 和 "_mousey" 包含滑鼠的當前 x 和 y 座標。
- 這些行繪製了一個基本的觸發器。
- "_mousebutton" 函式返回所按滑鼠按鈕的值,“1” 表示按下了左鍵。
- 如果滑鼠按鈕事件發生在某個封閉區域內,則會發出“message$”形式的訊息。這可以稍後使用。
- 如果滿足了前面的條件,則過程會轉到行標籤“action”,這裡可能包含要執行的任何命令。
- 否則,該過程會迴圈,直到滿足“迴圈直到”條件。它也可以是除上面給出的條件以外的其他條件。
這些圖形和動畫可用於建立一個完整的遊戲。你可以使用“Inkey$”命令而不是“滑鼠”函式來發出各種場景和情況,每種情況都有一個完整的程式碼來決定接下來發生什麼。
你可以使用“.txt”檔案來儲存資訊,而不是製作不包含任何使用者資訊的遊戲。這些資訊可以稍後檢索,用於建立具有完整“職業”選項的遊戲。
在 Qbasic 中,3 維或 3D 圖形只不過是在二維結構中新增一個額外的 'z' 軸,並沿著該軸進行擴充套件。這可以透過在每次新的 x 和 y 位置繪製一個盒子或所需的結構來實現。這與動畫非常相似,只是我們不會在繪製完結構後擦除它,並且不需要任何中間暫停。您可以透過檢視下面給出的 3D 盒子程式來更好地理解。
Redo:
cls
screen 1
Input "Enter the X-position?";k 'entering coordinates of the screen from where to start.
Input "Enter the Y-position?";l ' this also determines the size of the box.
color 1
for i = 1 to 50 step 2 rem box ' step to ensure space between the boxes, make it one to eliminate the space. The 50 number sets the extension of the box along the z axis
a = k+i:b = l+i ' this "for-next" loop draws the box over and over again, each with incremented values of k and l.
line (a,a)-(b,a)
line (a,b)-(b,b)
line (a,a)-(a,b)
line (b,a)-(b,b)
next rem diagonals
line (k,k)-(a,a) ' the four diagonals to the structure , which make it more realistic
line (l,l)-(b,b)
line (l,k)-(b,a)
line (k,l)-(a,b)
Input"Do you want to redo? (Y/N)";ans$
if ucase$(ans$)="Y" then goto Redo
end
除了 QB64 之外的所有 IDE 中,這些函式均無法工作。
rem image_display
cls
Dim Image as long
x = 1000 'resolution
y = 1000
Image = _loadimage("TEST.jpg") 'loading the image
screen _newimage(x,y,32) 'putting screen sizes
_putimage (0,0),Image 'putting image
所以您可能非常期待大量程式碼。就是這樣,您需要在 QB64 中顯示影像的所有內容!
那麼,這令人驚歎的簡單程式碼究竟做了什麼?
逐步解釋
- 我們已將變數 Image 定義為一個長整型值。這是因為 _loadimage 函式返回的影像控制代碼是一個長整型值。
- x 和 y 是我們的變數。它們儲存我們需要設定為解析度的值。因此,對於 8n00 x 900 的影像,x = 800,y = 900。
- 影像變數 Image 接下來被賦予影像“TEST.jpg”的控制代碼值。一條健康的警告:將影像儲存在 QB64 IDE 資料夾中。否則,該函式將無法工作!
- 接下來,我們將螢幕調整為適合影像。newimage 函式需要三個引數:解析度引數和顏色模式引數。這裡我們使用 32 位顏色模式,您也可以使用 256 位調色盤顏色模式。
- 最後,我們使用 _putimage 放置影像,它將 Image 變數(我們的影像控制代碼)作為其引數。
好吧,您一定在想,所有這些命令都必須以完全相同的順序使用。不,事實並非如此。您可以單獨使用 _newimage 來設定螢幕細節,如下所示
screen _Newimage(1000,1000,256)
此程式碼將螢幕設定為巨大的 1000 x 1000 解析度,並使用 256 位調色盤顏色模式!
關於 QBasic 的主題,有很多優秀的網站。以下是最佳網站的列表
Petes QBasic 網站:此網站主要針對那些正在考慮使用 QBasic 編寫影片遊戲的人。
QBasic 頁面:這是一個獲取 QBasic 原始碼和程式的好網站。
QBasic 新聞:QBasic 社群中最新的最新新聞。
面向兒童的 QBasic 程式設計:一個適合年輕人開始程式設計的好網站。
Qb64 : 瞭解 QB64 的所有內容。
此外,QB64 IDE 具有一個內建的幫助頁面,在您不知道如何使用命令時提供必要的幫助。唯一的缺點是,除非您選擇命令並右鍵單擊它,然後單擊“關於 .... 的幫助”,否則它不會顯示任何幫助,這意味著您至少需要在尋求幫助之前知道命令的名稱。
如果您正在學習 QBasic,那麼您很可能對程式設計還很陌生。這是一個多樣化的世界,探索它!
以下是一些非常好的程式語言,供您進一步學習
此程式可用於非常簡單地製作一個簡單的、功能正常的計算器。
Rem calculator
cls
10
print "input first operand"
input a
print "select operation"
input b
print "addition(a)"
print "subtraction(s)"
print "multiplication(m)"
print "division(d)"
print "exponentification(e)"
print "rooting(r)"
print "Quit(q)"
do
next$ = inkey$
loop until next$ <> ""
gosub input_var2
select case next$
case "a"
c = a + b
print "sum is:";c
case "s"
c = a - b
print "Difference is:";c
case "m"
c= a*b
print "Product is :";c
case "d"
c = a/b
print "Quotient is:";c
case "e"
c = a^b
print "Exponentification is:"c
case "r"
c = a^ 1/b
print "Root is:";c
case "q"
end
end select
sleep 3
goto 10
sub input_var
input "enter second operand";b
end sub
有關參考,請轉到 基本數學
使用動畫製作一個簡單的遊戲。
SCREEN 7
COLOR 15, 1
_MOUSEHIDE
CLS
LOCATE 5, 1
PRINT "GUNSHOTS"
DO
NEXT$ = INKEY$
LOOP UNTIL NEXT$ <> ""
CLS
LOCATE 5, 1
PRINT "In this game, you require to bring"
PRINT ""
PRINT "the crosshairs to the box"
PRINT ""
PRINT " , which is the target ,"
PRINT ""
PRINT " and click to shoot it."
PRINT ""
PRINT " In this game , you control"
PRINT ""
PRINT "the crosshairs with your mouse."
PRINT ""
PRINT " You will be given a"
PRINT ""
PRINT " fixed number of tries."
PRINT ""
PRINT " The number of times you hit the target,"
PRINT ""
PRINT " you will be given a point "
DO
NEXT$ = INKEY$
LOOP UNTIL NEXT$ <> ""
CLS
LOCATE 5, 1
PRINT "Get Ready!"
DO
NEXT$ = INKEY$
LOOP UNTIL NEXT$ <> ""
10
A = INT(RND * 100)
B = INT(RND * 100)
DO: K$ = INKEY$
20
DO WHILE _MOUSEINPUT
CLS
IF TRY_COUNT > 30 THEN
CLS
LOCATE 10, 1
PRINT "Remarks:"
IF POINT_COUNT < 10 THEN PRINT "OH NO! NICE TRY!"
IF POINT_COUNT > 10 AND POINT_COUNT < 16 THEN PRINT "GOOD WORK!"
IF POINT_COUNT > 15 AND POINT_COUNT < 21 THEN PRINT "GREAT!"
IF POINT_COUNT > 20 AND POINT_COUNT < 26 THEN PRINT "AMAZING!"
END
END IF
SECOND = VAL(RIGHT$(TIME$, 2))
IF PREVSEC <> SECOND THEN
COUNT = COUNT + 1
END IF
LOCATE 25, 25
PRINT POINT_COUNT
X = _MOUSEX: Y = _MOUSEY
LINE (X - 10, Y)-(X + 10, Y), 15
LINE (X, Y - 10)-(X, Y + 10), 15
LINE (A, B)-(A + 25, B), 15
LINE (A, B + 25)-(A + 25, B + 25), 15
LINE (A, B)-(A, B + 25), 15
LINE (A + 25, B)-(A + 25, B + 25), 15
PAINT (A, B), (1), 15
IF _MOUSEBUTTON(1) THEN
IF X > A AND X < A + 25 AND Y > B AND Y < B + 25 THEN
POINT_COUNT = POINT_COUNT + 1
TRY_COUNT = TRY_COUNT + 1
GOTO 10
END IF
END IF
IF COUNT > 1 THEN
COUNT = 0
TRY_COUNT = TRY_COUNT + 1
GOTO 10
END IF
PREVSEC = SECOND
GOTO 20
LOOP
LOOP
有關參考,請轉到 高階圖形
一個類似於數字時鐘的時鐘,沒有指標。如果您想使用 draw 製作指標。
REM Clock
SCREEN 7
CLS
start:
SCREEN 7
_FONT 16
LOCATE 1, 5
PRINT "CLOCK"
PRINT "________________________________________"
LINE (50, 50)-(100, 100), 1, BF
LOCATE 9, 5
PRINT "TIME"
LOCATE 10, 5
PRINT "CONTROL"
LINE (150, 50)-(200, 100), 2, BF
LOCATE 9, 18.5
PRINT "STOP WATCH"
DO
exit$ = INKEY$
IF exit$ = "e" OR exit$ = "E" THEN
CLS
SCREEN 7
COLOR 2, 1
LOCATE 5, 5
PRINT "YOU HAVE ABORTED THE CLOCK"
WHILE close_count <> 10
close_count = close_count + 1
LOCATE 7, 5
PRINT "APPLICATION ";
IF close_count MOD 2 = 1 THEN
PRINT "CLOSING >>> "
ELSE
PRINT "CLOSING >>> "
END IF
SLEEP 1
WEND
CLS
SCREEN 7
COLOR 10, 0
END
END IF
Mouser mx, my, mb
IF mb THEN
IF mx >= 50 AND my >= 50 AND mx <= 100 AND my <= 100 THEN 'button down
DO WHILE mb 'wait for button release
Mouser mx, my, mb
LOOP
'verify mouse still in box area
IF mx >= 50 AND my >= 50 AND mx <= 100 AND my <= 100 THEN
GOTO proccess
END IF
END IF
END IF
Mouser mx, my, mb
IF mb THEN
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN 'button down
DO WHILE mb 'wait for button release
Mouser mx, my, mb
LOOP
'verify mouse still in box area
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN
time_control = 1
GOTO proccess
END IF
END IF
END IF
LOOP
proccess:
IF time_control = 0 THEN
time_enter:
LOCATE 12, 6
INPUT "enter time"; t
IF t > 1800 THEN
mistake = mistake + 1
IF mistake > 3 THEN
PRINT "BLOCKED"
END
END IF
GOTO time_enter
END IF
END IF
Mouser mx, my, mb
IF mb THEN
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN 'button down
DO WHILE mb 'wait for button release
Mouser mx, my, mb
LOOP
'verify mouse still in box area
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN
time_control = 1
GOTO proccess
END IF
END IF
END IF
WHILE INKEY$ <> " "
SLEEP 1
count = count + 1
tc = tc + 1
BEEP
CLS
LOCATE 1, 5
PRINT "CLOCK"
PRINT "________________________________________"
IF time_control = 1 THEN
LINE (150, 50)-(200, 100), 2, BF
END IF
LOCATE 3, 5
PRINT "CURRENT TIME:"; TIME$
LOCATE 5, 5
PRINT "MINUTES:"; minute
LOCATE 6, 5
PRINT "SECONDS:"; count
IF count = 60 THEN
count = 0
minute = minute + 1
END IF
IF time_control = 0 THEN
LOCATE 8, 5
PRINT "TIME LEFT:"; (t - tc) \ 60; ":"; (t - tc) MOD 60
IF tc = t THEN
BEEP
BEEP
BEEP
BEEP
END
END IF
END IF
IF time_control = 1 THEN
Mouser mx, my, mb
IF mb THEN
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN 'button down
DO WHILE mb 'wait for button release
Mouser mx, my, mb
LOOP
'verify mouse still in box area
IF mx >= 150 AND my >= 50 AND mx <= 200 AND my <= 100 THEN
END
END IF
END IF
END IF
LOCATE 10, 10
PRINT "PRESS BUTTON TO END"
END IF
WEND
GOTO start
SUB Mouser (x, y, b)
mi = _MOUSEINPUT
b = _MOUSEBUTTON(1)
x = _MOUSEX
y = _MOUSEY
END SUB
這是您迄今為止閱讀的所有章節的邏輯組合。
是的,這是一個二進位制解碼器,但也是一個二進位制編碼器。它接受任何十進位制系統數字,並將其轉換為二進位制。執行此程式自行檢視。
REM binary
SCREEN 7
COLOR 1, 2
_FONT 16
LOCATE 7, 10
PRINT "Binary Coder"
SLEEP 5
start:
CLS
LOCATE 1, 1
PRINT "Binary coder"
PRINT "_____________"
PRINT ""
PRINT ""
PRINT ""
PRINT ""
INPUT "Enter Decimal number"; a
CLS
LOCATE 1, 1
PRINT "Binary coder"
PRINT "_____________"
PRINT ""
PRINT ""
WHILE a <> 0
PRINT a MOD 2;
IF a MOD 2 = 1 THEN
a = a \ 2
ELSE a = a / 2
END IF
WEND
PRINT ""
PRINT ""
PRINT "Binary code is reversed"
WHILE INKEY$ <> " "
WEND
GOTO start
唯一的問題是:二進位制程式碼被反轉了。您可能已經透過檢視最後一個 PRINT 語句猜到了。我仍然沒有找到如何反轉它的方法,所以我想您必須自己做。並且,WHILE 迴圈有一個以分號結尾的 print 語句。這用於確保下一個數字出現在它之後,而不是在下一行。
還記得大猩猩嗎?好吧,去掉圖形,剩下的就是它。
10
RANDOMIZE TIMER
cor = RND * 150
cor2 = CINT(cor)
IF cor2 < 30 AND cor2 > -30 THEN GOTO 10
PRINT "The object to hit is at coordinates"; cor2
INPUT "enter velocity"; v
INPUT "enter angle"; a
d = ((v ^ 2) * SIN(2 * a)) / 10
PRINT "Hit on:"
PRINT CINT(-d)
IF CINT(-d) < cor2 + 30 AND CINT(-d) > cor2 - 30 THEN
PRINT "Well Done!"
ELSEIF CINT(-d) < 30 AND CINT(-d) > -30 THEN PRINT "Hey , you hit us!"
ELSE PRINT "Ugh, not on target"
END IF
嗯?好吧,現在數學很複雜,但公式基本上是一樣的。在這裡,彈丸必須落在撞擊物體的 30 個座標中,否則您就輸了。有關數學部分的更多資訊,請參閱 維基百科:彈丸運動。提示:新增圖形。它將是一個龐大而臃腫的程式碼,但最終產品將非常棒!
好吧,現在,你能聽到多高的頻率聲音?使用此程式測試您的聽力。
REM ultrasonic_test
CLS
freq = 20000
DO
PRINT "Frequency is:"; freq
SOUND freq, 18.2
INPUT "Can you hear?"; ans$
IF ans$ = "no" THEN
freqrange = freq
GOTO 10
END IF
freq = freq + 100
LOOP
10
freq = freqrange
DO
PRINT "frequency is:"; freq
SOUND freq, 18.2
INPUT "can you hear?"; ans$
IF ans$ = "no" THEN
PRINT "your max frequency is:"; freq
END
END IF
freq = freq + 2
LOOP
看看這個!
N = ABS(expression returning a numerical value)
返回表示式的“絕對值”,將負數變為正數(例如,-4 變為 4)。
PRINT ABS(54.345) 'This will print the value ABS now as it is (54.345)
PRINT ABS(-43) 'This will print the value as (43)
.
OPEN "file.txt" FOR APPEND ACCESS WRITE
這將設定已在程式中宣告的檔案的訪問許可權。程式設計師可以設定三個設定。它們是
READ - Sets up the file to be read only, no writing. WRITE - Writes only to the file. Cannot be read. READ WRITE - Sets the file to both of the settings above.
FOR APPEND 將檔案開啟為文字檔案,並將檔案指標設定為檔案末尾,從而將新輸出追加到檔案。如果省略,FOR RANDOM 是預設值,它將檔案開啟為一系列固定長度的記錄,並將檔案指標設定為檔案開頭。新資料將覆蓋檔案中的現有資料,不會發出警告。
PRINT ASC("t") 'Will print 116
列印括號中找到的字元的 ASCII 程式碼編號。如果程式設計師在括號中輸入字串,則只會顯示字串的第一個字元。
ATN(expression)
內建三角函式的一部分。計算結果為數值的表示式將轉換為其反正切。
angle = ATN( B ) angle2 = ATN( 23 / 34 )
BEEP
主機板上的 BIOS 被指示從 PC '揚聲器' 發出“嗶”聲。另請參見 SOUND 和 PLAY。
一個較舊、過時的替代方法是使用:PRINT CHR$(07)
此命令後來被 BEEP 命令替換。
BLOAD file_path$, memory_offset%
將使用 BSAVE 儲存的檔案載入到記憶體中。
- file_path$ 是檔案位置
- memory_offset 是一個整數,指定要將檔案載入到的記憶體偏移量
起始記憶體地址由偏移量和最近一次對 DEF SEG 語句的呼叫確定
BSAVE file_path$, memory_offset%, length&
將記憶體區域的內容儲存到可以使用 BLOAD 載入的檔案中
- file_path$ 是檔案位置
- memory_offset 是一個整數,指定要儲存的記憶體偏移量
- length 要複製的位元組數
起始記憶體地址由偏移量和最近一次對 DEF SEG 語句的呼叫確定
CALL ABSOLUTE([argument%, ...,] address%)
將提供的引數(必須是 INTEGER)從左到右壓入堆疊,然後對位於 address 的組合語言例程進行遠呼叫。要使用的程式碼段使用 DEF SEG 設定。通常 QBasic 會壓入引數的地址,但如果引數之前有 BYVAL,則會壓入引數的值。
請注意,由於 QBasic 從左到右壓入引數,因此如果您提供三個引數,例如,堆疊將如下所示
SS:SP Return IP +0002 Return CS +0004 Argument 3 +0006 Argument 2 +0008 Argument 1
示例
'POP CX 'POP DX 'POP BX 'POP AX 'MOV [BX], AX 'PUSH DX 'PUSH CX 'RETF A$ = "YZ[Xë•RQ╦" 'Codepage: 437 I% = 42: J% = 0 IF VARSEG(A$) <> VARSEG(J%) THEN STOP 'Both A$ and J% are stored in DGROUP. DEF SEG = VARSEG(A$) CALL ABSOLUTE(BYVAL I%, J%, PEEK(VARPTR(A$) + 3) * 256& OR PEEK(VARPTR(A$) + 2)) PRINT J%
QBasic 不會將 BP 設定為機器語言例程的堆疊幀,而是將其指向呼叫 QBasic 過程的堆疊幀,它看起來像這樣
-???? Variable 3 -???? Variable 2 -???? Variable 1 -???? Return value (only if the procedure is a FUNCTION, absent if a SUB) -0002 BP of calling procedure SS:BP BP of calling procedure (yes, again) +0002 Six bytes referring back to the calling procedure to use when executing END/EXIT SUB/FUNCTION +0008 Argument 3 +000A Argument 2 +000C Argument 1
用 -/+???? 表示的偏移量將取決於變數的大小和存在、返回值和引數。例如,INTEGER 變數將佔用兩個位元組,而 LONG 變數佔用四個位元組。正如人們可能預期的那樣,考慮到 QBasic 如何傳遞引數,變數按宣告的相反順序儲存。與呼叫機器語言例程時相反,這裡的引數將始終是地址。對於按值傳遞的引數,將在堆疊上分配空間,並將該空間的地址傳遞給過程。
SELECT CASE expression CASE test1[, test2, ...]: statements [CASE test4[, test5, ...]: statements] [CASE ELSE: statements] END SELECT
執行第一個 CASE 語句之後的語句,其中測試匹配表示式。測試可以採用以下形式
expression
expression1 TO expression2
IS {<|<=|=|<>|>=|>} expression
這是一個沒有 CASE 命令的程式的示例,它為值分配不同的路徑
PRINT "1. Print 'path'" PRINT "2. Print 'hello'" PRINT "3. Quit" INPUT "Enter a choice: "; a$ IF a$ = "1" THEN PRINT "path": RUN IF a$ = "2" THEN PRINT "hello": RUN IF a$ <> "3" THEN PRINT "That is not a valid choice.": RUN
這是使用 CASE 命令的程式的樣子
PRINT "1. Print 'path'" PRINT "2. Print 'hello'" PRINT "3. Quit" INPUT "Enter a choice: "; a$ SELECT CASE a$ CASE "1": PRINT "path": RUN CASE "2": PRINT "hello": RUN CASE IS <> "3": PRINT "That is not a valid choice.": RUN END SELECT
CHAIN filename
這將執行連結到另一個 QBasic 程式。可以透過在 CHAIN 語句之前使用 COMMON 語句將值傳遞給另一個程式。請注意,除非第二個程式使用 CHAIN 將執行傳遞迴第一個程式,否則執行不會返回到第一個程式。
CHDIR directoryname
這用於設定工作目錄,也稱為當前目錄。目錄名與 DOS 中的宣告方式完全相同,不支援長檔名。例如
CHDIR "C:\DOS"
請注意,這不會更改當前驅動器,並且每個驅動器都有自己的工作目錄。您可以像這樣設定當前驅動器
SHELL "C:"
這將返回 ASCII 程式碼值的字串字元符號。
name$ = CHR$([ascii character code])
通常用於在無法鍵入該字元時將字元“載入”到字串變數中(例如 Esc 鍵或 F{n}(功能鍵)或 QBASIC 直譯器會“識別”並執行的字元。以下四個字元不能出現在 QBasic 字串文字中
- 0 Null:到行尾的所有字元都將被刪除,包括此字元。
- 10 Line Feed:表示行尾。
- 13 Carriage Return:此字元將被刪除。
- 34 引號:表示字串文字的結尾。
這是一些字元程式碼的列表:-
07 Beep (same as BEEP) 08 Backspace 09 Tab 27 Esc 72 Up Arrow 75 Left Arrow 77 Right Arrow 80 Down Arrow
這將括號中的內容四捨五入到最接近的整數。
PRINT CINT(4573.73994596)
4574
CIRCLE ([X Coordinate], [Y Coordinate]), [Radius], [Colour],[Start],[End],[Aspect]
允許程式設計師顯示一個圓圈。與所有圖形命令一樣,它必須與 SCREEN 命令一起使用。
CLEAR
重置所有變數、字串、陣列並關閉所有檔案。QBasic 上的重置命令。
CLOSE
關閉所有開啟的檔案
CLOSE #2
僅關閉作為資料流 2 開啟的檔案。其他檔案保持開啟狀態
CLS
清除活動螢幕。擦除所有文字、圖形,將游標重置到左上角 (1,1),並將當前背景色(必須使用 COLOR 命令設定)應用於整個螢幕。
COLOR [Text Colour], [Background Colour]
這可以讓您更改在下次“列印”到當前輸出視窗時使用的文字和背景顏色。 它可以像這樣完成
COLOR 14, 01 PRINT "Yellow on Blue"
您可以選擇十六種顏色
00: Black 08: Dark Grey 01: Dark Blue 09: Light Blue 02: Dark Green 10: Light Green 03: Dark Cyan 11: Light Cyan 04: Dark Red 12: Light Red 05: Dark Purple 13: Magenta 06: Orange Brown 14: Yellow 07: Grey 15: White
這些值是您在 COLOR 命令中輸入的數字。
注意 只有螢幕模式 0、7、8、9、10 支援背景顏色。 要用背景顏色“重新繪製”整個螢幕,請使用 CLS 命令。
將變數宣告為“全域性”,這允許在多個 QBasic 程式/指令碼中訪問其值(另請參閱 CHAIN 命令)
COMMON SHARED [variablename]
每個宣告“variablename”為 COMMON 的程式將共享相同的值。
注意。 所有 COMMON 語句必須出現在程式的開頭(即在任何可執行語句之前)。
修復變數,使其不能在程式中更改。
CONST (name) {AS (type = INTEGER / STRING)} = (expression or value)
例如:-
CONST PI = 3.14159265
將值 3.14159265 賦值給 PI。
CONST PI2 = 2 * PI
必須在使用 PI 計算 PI2 之前為 PI 賦值。 通常,所有 CONST 都在程式開頭宣告。
DATA [constant]
與 READ 和 RESTORE 命令結合使用。 主要用於處理圖形的程式,此命令允許 QBasic 讀取大量的常量。 READ 命令訪問資料,而 RESTORE 命令“重新整理”資料,使其可以再次使用。
一個系統變數,始終包含當前日期,以 mm-dd-yyyy 格式的字串形式表示。 像這樣使用它
a$ = DATE$
設定當前段地址。
DEG SEG [=address]
- address 是一個段地址,可以包含 0 到 65535 之間的任何值。
如果省略 address,DEF SEG 會將當前段地址重置為預設資料段。 DEF SEG 由 BLOAD、BSAVE、CALL ABSOLUTE、PEEK 和 POKE 使用
_DEST 設定當前寫入頁面或影像。 _DEST image_handle 將目標影像傳送到儲存在長變數 image_handle 中的控制代碼影像。 _DESt 0 將目標影像傳送到正在使用的當前螢幕。
這用於宣告陣列(早期版本的 QBasic 要求定義所有變數,而不僅僅是大於 10 的陣列)
DIM [Array Name] ([count],[count], ..)
陣列名稱可以是任何型別(整數、雙精度、字串等)。 如果未宣告,則假定為單精度浮點數。 字串可以使用 $ 符號(帶有 % 符號的整數)“宣告”。 QBASIC 直譯器容忍不超過 10 個計數的數字陣列,而不需要宣告它們。
注意 早期版本的 QBasic 沒有明確地將陣列的內容設定為零(請參閱 CLEAR 命令)
DIM table%(100,2)
建立一個名為 table% 的整數陣列,包含 100x2 = 200 個條目
DIM form$(5)
建立一個名為 form$ 的字串陣列,包含 5 個字串
DIM quotient(20) AS DOUBLE
建立一個名為 quotient 的陣列,包含 20 個雙精度數字
DO [program] LOOP UNTIL [test condition becomes TRUE]
用於在程式中建立迴圈。 [condition] 僅在第一次執行 [program] 程式碼後測試(另請參閱 WHILE)。 例如
num$ = 1 sum$ = 0 DO sum$ = 2 * num$ PRINT sum$ num$ = num$ + 1 LOOP UNTIL num$ = 13
這不起作用 但以下內容有效
num = 1 sum = 0 DO sum = 2 * num PRINT sum num = num + 1 LOOP UNTIL num = 13
DRAW "[string expression]"
用於從當前“游標”位置以當前顏色繪製一條直線。 DRAW 定義方向(向上、向下等)和線的長度(以畫素為單位)。 例如:-
SCREEN 7 PSET (50, 50), 4 DRAW "u50 r50 d50 l50"
每個數字前面的字母是方向
U = Up E = Upper-right D = Down F = Lower-right L = Left G = Lower-left R = Right H = Upper-left
繪製“游標”停留線上條結束的位置。 u50 從 50,50 向上繪製,結束於 50,0 r50 從 50,0 向右繪製,結束於 100,0 d50 從 100,0 向下繪製,結束於 100,50 l50 從 100,50 向左繪製,結束於 50,50
因此,顯示的示例將繪製一個紅色的“線框”正方形。
另請參閱 LINE 和 CIRCLE 命令。
注意:從 0,0 到 100,100 的對角線將長 100 * root(2) 畫素(即 141)
END
表示程式的結束。 當 QBasic 看到此命令時,它通常會顯示一條語句,提示:“按任意鍵繼續”。
END TYPE結束 TYPE 定義。END DEF結束 DEF FN 函式定義。END SUB結束 SUB 過程定義。END FUNCTION結束 FUNCTION 過程定義。END IF結束多行 IF 塊。END SELECT結束 SELECT CASE 塊。
ENVIRON [string expression]
注意:如果您在 Windows 系統上執行 QBasic,則無法使用此命令。
此命令可幫助您在會話期間設定環境變數。 從 QBasic.exe 直譯器退出後,變數將恢復為其原始值。
這檢查指定在 () 中的檔案中是否還有更多資料值要讀取。 EOF() 返回一個布林值/二進位制值,1 或 0。 如果未到達檔案末尾,則為 0;如果讀取了檔案中的最後一個值,則為 1(另請參閱 LINE INPUT)
OPEN File.txt FOR INPUT AS #1 DO INPUT #1, text$ PRINT text$ LOOP UNTIL EOF(1) END
請注意,由於 INPUT 在到達 UNTIL 之前執行,因此 File.txt 必須包含至少一行文字 - 如果檔案為空,您將收到“錯誤 (62) 輸入超過檔案末尾”。
ERASE [arrayname] [,]
用於刪除所有已定義的陣列。
系統變數,儲存與處理上一行程式碼相關的數值。 如果該行完成且無錯誤,則 ERROR 設定為 0。 如果該行失敗,則 ERROR 設定為下面所示的值之一。 最常用於將程式流重定向到錯誤處理程式碼,如:-
ON ERROR GOTO [line number / label]
如果 ERROR 非零,程式流跳轉到指定的行號或標籤。 如果 ERROR 為零,程式流繼續執行下一行。
為了手動測試您的程式並檢查錯誤處理例程是否正常執行,可以手動設定 ERROR:-
ERROR [number]
設定 ERROR = number
錯誤號如下所示
1 NEXT without FOR 39 CASE ELSE expected 2 Syntax Error 40 Variable required 3 RETURN without GOSUB 50 FIELD overflow 4 Out of DATA 51 Internal error 5 Illegal function call 52 Bad file name or number 6 Overflow 53 File not found 7 Out of memory 54 Bad file mode 8 Label not defined 55 File already open 9 Subscript out of range 56 FIELD statement active 10 Duplicate definition 57 Device I/O error 11 Division by zero 58 File already exists 12 Illegal in direct mode 59 Bad record length 13 Type mismatch 61 Disk full 14 Out of string space 62 Input past end of file 16 String formula too complex 63 Bad record number 17 Cannot continue 64 Bad file name 18 Function not defined 67 Too many files 19 Yes RESUME 68 Device unavailable 20 RESUME without error 69 Communication-buffer overflow 24 Device timeout 70 Permission denied 25 Device Fault 71 Disk not ready 26 FOR without NEXT 72 Disk-media error 27 Out of paper 73 Advanced feature unavailable 29 WHILE without WEND 74 Rename across disks 30 WEND without WHILE 75 Path/File access error 33 Duplicate label 76 Path not found 35 Subprogram not defined 37 Argument-count mismatch 38 Array not defined
請注意,ERROR 在執行失敗時設定,而不是在“讀取”程式碼時設定 - 因此,例如,在將結果分配給不存在的陣列變數或寫入不存在的檔案之前,將發現“除以 0”。
允許立即退出子程式或迴圈,而不處理該子程式或迴圈程式碼的其餘部分
EXIT DEF
從 DEF FN 函式退出。
EXIT DO
從 DO 迴圈退出,執行繼續執行 LOOP 命令之後的命令
EXIT FOR
從 FOR 迴圈退出,執行將繼續從 NEXT 命令之後的命令開始。
EXIT FUNCTION
退出 FUNCTION 過程,執行將繼續從函式呼叫之後的命令開始。
EXIT SUB
退出 SUB 過程。
FOR .. NEXT
[edit | edit source]FOR [variable name] = [start value] TO [end value] {STEP n}
[program code]
NEXT [variable name]
變數被設定為 [開始值],然後執行程式程式碼,在 Next 語句中,變數被遞增 1(或者,如果指定了,則遞增 STEP 值)。結果值與 [結束值] 進行比較,**如果不相等**,程式流程將返回到 FOR 語句之後的行。
例如
FOR a = 200 TO 197 STEP-1 PRINT a NEXT a
200 199 198
在使用 STEP 時要小心,因為很有可能用 STEP 跨過(結束值),結果 FOR 迴圈將“永遠”執行(即,直到使用者中止直譯器或發生錯誤),例如:
FOR a = 200 TO 197 STEP-2 PRINT a NEXT a
200 198 196 194 192 ... 0 -2 -4 ... -32768 ERROR 溢位
GOSUB
[edit | edit source]GOSUB [subroutine line number / label]
命令處理跳轉到指定的子程式。當遇到 RETURN 命令時,處理將返回到此點,並繼續執行 GOSUB 下面的行。
IF
[edit | edit source]IF [variable or string] [operator] [variable or string] THEN [command] {ELSE [command]}
比較變數或字串。例如,如果您想檢查使用者輸入的密碼是否正確,您可能會輸入
IF a$ = "password" THEN PRINT "Password Correct"
其中 a$ 是使用者輸入的密碼。一些運算子包括
"="- 等於
"<"- 小於(僅在變數或字串是數字值時使用)
">"- 大於(僅在變數或字串是數字值時使用)
"<>"- 不等於
"<="- 小於或等於(僅在變數或字串是數字值時使用)
">="- 大於或等於(僅在變數或字串是數字值時使用)
還可以使用 if 命令對數字值執行操作,然後將它們與其他字串或變數進行比較,例如以下示例:
IF a+5 = 15 THEN PRINT "Correct"
IF a*6 = b*8 THEN PRINT "Correct"
INCLUDE(僅限 QUICKbasic)
[edit | edit source]QUICKBasic 支援透過 $INCLUDE 指令使用包含檔案
(Note that the Qbasic interpreter does NOT support this command.)
'$INCLUDE: 'foobar.bi'
請注意,包含指令以撇號、美元符號為字首,並且包含檔案的名稱用單引號括起來。
INKEY$
[edit | edit source][variable] = INKEY$
當您希望程式使用來自鍵盤的按鍵輸入時,使用此方法。檢視有關其工作原理的示例
a$ = INKEY$ PRINT "Press Esc to Exit" END IF a$ = CHR$(27)
您可以將其與 CHR$ 命令結合使用,也可以輸入字母(例如 A)。
INPUT
[edit | edit source]INPUT [String Literal] [,or;] [Variable]
顯示字串文字,如果字串文字後面跟著分號,則顯示問號,並且使用者輸入直到他們按回車鍵為止,輸入將輸入到變數中。變數可以是字串或數字。如果使用者嘗試為數字變數輸入字串,程式將再次要求輸入。字串文字是可選的。如果使用字串文字,則需要逗號 (,) 或分號 (;)。
INPUT #
[edit | edit source]INPUT #n [String Literal] [,or;] [Variable]
從指定的流檔案 (參見 LINE INPUT #) 讀取字串/值
INPUT #1, a$, b$, n, m
從作為 #1 開啟的檔案中讀取 4 個值。a$ 被分配了直到 ','(逗號)或行尾的所有文字,b$ 被分配了文字的下一段,然後解釋兩個數值並將它們分配給 n 和 m。
請注意,在檔案中,數字可以用“任何東西”分隔 - 因此,如果在當前檔案的“行”上沒有找到數字(對於“n”或“m”),則將搜尋檔案的其餘部分,直到找到數字為止。然後輸入將“指向”檔案中滿足輸入語句所需的最後一個數字後的位置(參見“seek #”命令)
INSTR
[edit | edit source]INSTR (start%, Search$, Find$)
返回 Find$ 在 Search$ 中第一次出現的開始處的字元位置,從 Search$ 中的字元位置 'start%' 開始。如果未找到 Find$,則返回 0。start% 是可選的(預設值 = 1,Search$ 的第一個字元)
Pos = INSTR ("abcdefghi", "de")
返回 4
LEFT$()
[edit | edit source]A$ = LEFT$(B$,N)
A$ 被設定為 B$ 的 N 個最左邊的字元。
A$ = LEFT$("Get the start only",6)
返回 "Get th"
另請參閱 RIGHT$()、MID$()。
LET
[edit | edit source]LET [variable] = [value]
早期版本的 QBasic.exe 命令直譯器需要使用 'LET' 命令將值分配給變數。後來的版本不需要。
LET N = 227 / 99 LET A$="a line of simple text"
等效於:
N = 227 / 99 A$="a line of simple text"
LINE
[edit | edit source]LINE ([X], [Y]) - ([X], [Y]), [Colour Number]
用於在 QBasic 中繪製線條。第一個 X 和 Y 用作線條開始處的座標,第二個集合用於協調線條的結束位置。您必須在程式開頭放置 SCREEN 命令才能使其正常工作。
注意。在 SCREEN 13 中,顏色編號 == 調色盤編號
LINE INPUT #
[edit | edit source]LINE INPUT #1, a$
從作為流 #1 開啟的檔案中以文字字元形式讀取完整行,並將其放置在 a$ 中。
要找到“行尾”,QBasic 直譯器會搜尋“回車”+“換行”(0x0D、0x0A)字元。在讀取在 UNIX/LINUX 系統上建立的文字檔案(其中僅使用“換行”0x0A 來表示“行尾”)時,LINE INPUT 將無法識別“行尾”,並將繼續輸入,直到檔案結束為止。對於超過 2k 個字元的檔案,結果將是“字串空間不足”錯誤,因為 a$ “溢位”。一個解決方案是使用能夠處理 UNIX 檔案的文字編輯器開啟並“另存為”,然後嘗試使用 QBasic 處理該檔案。
LOADIMAGE(僅限 QB64)
[edit | edit source](注意!本節中的命令是指名為“QB64”的第三方程式。QUICKbasic 和 Qbasic 均不支援 _LOADIMAGE、_NEWIMAGE 或 _PUTIMAGE 命令。QUICKbasic 和 Qbasic 都有一個“SCREEN”命令,但它在這兩種語言中的工作方式不同於在 QB64 中。)
_LOADIMAGE("image.jpg")
顯示影像。必須與命令 SCREEN、_NEWIMAGE 和 _PUTIMAGE 一起使用。
示例
DIM rabbit AS LONG SCREEN _NEWIMAGE(800, 600, 32) rabbit = _LOADIMAGE("rabbit.jpg") _PUTIMAGE (100,100), rabbit
LOOP
[edit | edit source]DO [Program] LOOP UNTIL [condition]
用於在程式中建立迴圈。此命令在迴圈開始後檢查條件。它與 DO 命令一起使用。
LPRINT
[edit | edit source]LPRINT [statement or variable]
將文字列印到印表機。LPRINT 命令期望印表機連線到 LPT1(PRN) 埠。如果印表機未連線到 LPT1,QBasic 將顯示“裝置故障”錯誤訊息。
如果您的印表機連線到 COM 埠,請使用 MS-DOS MODE 命令將列印從 LPT1 重定向到 COMx(例如,要重定向到 COM1,請使用以下命令
MODE LPT1=COM1
如果您需要在完成後取消重定向,請使用以下命令
MODE LPT1
MID$
[edit | edit source]a$=MID$(string$,start%[,length%]) MID$(string$,start%[,length%])=b$
在第一個用法中,a$ 被設定為從字串中獲取的子字串,從字元 start% 開始,取 Length% 個字元。如果省略 length%,則將取該行的其餘部分(即 start% 和所有右側的字元)。
在第二個用法中,string$ 的 length% 個字元被替換為 b$,從 start% 開始。如果省略 length%,則將替換該行的其餘部分(即 start% 和所有右側的字元)。
另請參閱 LEFT$ RIGHT$ LEN
a MOD b
返回 a 除以 b 的整數商的餘數
例如,10 MOD 3 返回 1
_NEWIMAGE 用於將長變數設定為螢幕尺寸,或與 SCREEN 命令一起使用(見附錄後面的內容)直接設定螢幕詳細資訊。它非常有用,因為您可以放大具有 RGB 顏色設定的 SCREEN 模式“13”,如果您發現預設尺寸太小。
語法:_NEWIMAGE(width,length,screen_mode)
- width 和 length 是長變數,而 screen_mode 是您希望更改的螢幕模式格式。
例如:
_NEWIMAGE(1000,1000,24),256
其中,256 是顏色的數量
它還用於為要放置的影像(首先使用 LOADIMAGE 載入它)準備視窗螢幕表面。
OPEN "[(path)\8.3 file name.ext]" (FOR {INPUT/OUTPUT} AS #{n})
這將開啟一個檔案。您必須提供 DOS 檔名,例如
OPEN "data.txt" FOR INPUT AS #1
以資料流 #1 的形式開啟現有檔案 data.txt 以供讀取。由於未指定路徑,因此該檔案必須與 QBasic.exe 位於同一資料夾中 - 否則,處理將停止,並出現“檔案未找到”錯誤
OPEN "C:\TEMP\RUN.LOG" FOR OUTPUT AS #2
以資料流 #2 的形式在 C:\TEMP 資料夾中開啟一個名為 RUN.LOG 的空檔案。任何同名的現有檔案將被替換。
PALETTE[palette number, required colour]
僅適用於 VGA(SCREEN 模式 13),將調色盤條目設定為新的 RGB 顏色。調色盤編號必須在 1-256 範圍內。所需顏色是由(所需藍色 * 65536)+(所需綠色 * 256)+ 所需紅色之和建立的 LONG 整數。
RANDOMIZE TIMER A = INT((RND * 100)) + 1
RANDOMIZE 將為 QBasic 的隨機數生成器設定種子。在 QBasic 中,通常只需使用 RANDOMIZE TIMER 來確保序列在每次執行時保持一致。
該示例是一個數學運算,用於從 1 到 100 獲取一個隨機數。
INT 代表整數,RND 代表隨機,而“*”代表隨機數要選擇的範圍。加“1”只是為了確保選擇的數字是從 1 到 100 而不是從 0 到 99。
注意:此函式的後續呼叫不保證相同的隨機數序列。
READ AIM(I)
此命令與 DATA 命令結合使用,允許 QBasic 讀取資料。這主要用於處理大量資料,例如點陣圖。
REM {comments}
' {comments}
當直譯器在行首遇到 REM 或 " ' "(單引號)時,將忽略該行的其餘部分
RETURN
表示子例程的結束
RANDOMIZE TIMER A = INT((RND * 100)) + 1
RND 將提供 0 到 1 之間的隨機數。
該示例是一個數學運算,用於從 1 到 100 獲取一個隨機數。RANDOMIZE TIMER 將為獨特的序列設定初始種子。INT 代表整數,RND 代表隨機,而“*”代表隨機數要選擇的範圍。加“1”只是為了確保選擇的數字是從 1 到 100 而不是從 0 到 99。
在內部,種子是一個 24 位數,以以下方法迭代:rnd_seed = (rnd_seed*16598013+12820163) MOD 2^24
PLAY "[string expression]"
用於在 PC 揚聲器上播放 QBasic 中的音符和樂譜。音調由字母 A 到 G 表示。變音符用“+”或“#”(升調)或“-”(降調)表示,緊跟在音符字母之後。參見此示例
PLAY "C C# C C#"
字串表示式中的空格將被忽略。還有一些程式碼用於設定持續時間、八度和速度。它們不區分大小寫。PLAY 按字串中出現的順序執行命令或音符。任何更改屬性的指示符對該指示符後面的音符有效。
Ln Sets the duration (length) of the notes. The variable n does not indicate an actual duration
amount but rather a note type; L1 - whole note, L2 - half note, L4 - quarter note, etc.
(L8, L16, L32, L64, ...). By default, n = 4.
For triplets and quintets, use L3, L6, L12, ... and L5, L10, L20, ... series respectively.
The shorthand notation of length is also provided for a note. For example, "L4 CDE L8 FG L4 AB"
can be shortened to "L4 CDE F8G8 AB". F and G play as eighth notes while others play as quarter notes.
On Sets the current octave. Valid values for n are 0 through 6. An octave begins with C and ends with B.
Remember that C- is equivalent to B.
< > Changes the current octave respectively down or up one level.
Nn Plays a specified note in the seven-octave range. Valid values are from 0 to 84. (0 is a pause.)
Cannot use with sharp and flat. Cannot use with the shorthand notation neither.
MN Stand for Music Normal. Note duration is 7/8ths of the length indicated by Ln. It is the default mode.
ML Stand for Music Legato. Note duration is full length of that indicated by Ln.
MS Stand for Music Staccato. Note duration is 3/4ths of the length indicated by Ln.
Pn Causes a silence (pause) for the length of note indicated (same as Ln).
Tn Sets the number of "L4"s per minute (tempo). Valid values are from 32 to 255. The default value is T120.
. When placed after a note, it causes the duration of the note to be 3/2 of the set duration.
This is how to get "dotted" notes. "L4 C#." would play C sharp as a dotted quarter note.
It can be used for a pause as well.
MB MF Stand for Music Background and Music Foreground. MB places a maximum of 32 notes in the music buffer
and plays them while executing other statements. Works very well for games.
MF switches the PLAY mode back to normal. Default is MF.
PRINT [Argument] [,or;] [Argument]...
將文字顯示到螢幕上。引數可以是字串字面量、字串變數、數字字面量或數字變數。所有引數都是可選的。
PRINT #[n] [,or;] [Argument]...
將資料儲存到“OPEN FOR OUTPUT AS #[n]”開啟的檔案中,或者我們可以使用“?”符號來表示列印命令
PSET ([X coordinate],[Y coordinate]), [Pixel Colour]
此命令顯示畫素,可以一次顯示一個畫素,也可以一次顯示一組畫素。要使該命令正常工作,程式中必須包含 SCREEN 命令。
SCREEN [Screen Mode Number]
此命令用於在螢幕上顯示圖形。QBasic 中有十種主要的螢幕模式型別,具體取決於您想要的螢幕解析度。以下是您可以選擇的螢幕模式列表
SCREEN 0:文字模式,不能用於圖形。這是基於文字的程式執行的螢幕模式。
SCREEN 1:320 x 200 解析度。四種顏色
SCREEN 2:640 x 200 解析度。兩種顏色(黑色和白色)
SCREEN 7:320 x 200 解析度。十六種顏色
SCREEN 8:640 x 200 解析度。十六種顏色
SCREEN 9:640 x 350 解析度。十六種顏色
SCREEN 10:640 x 350 解析度。兩種顏色(黑色和白色)
SCREEN 11:640 x 480 解析度。兩種顏色
SCREEN 12:640 x 480 解析度。十六種顏色
SCREEN 13:320 x 200 解析度。256 種顏色。(推薦)
注意:在 SCREEN 13 中,您擁有 256 種顏色的調色盤。該調色盤由 Windows 預設,但是您可以使用 PALETTE 命令更改 RGB 值。
SEEK #[file number], 1
將“input #”指標重新定位到檔案開頭。
SGN(expression yielding a numeric value)
產生值的“符號”,如果 < 0 則為 -1,如果為 0 則為 0,如果 > 0 則為 1
“SHELL”命令用於在 Qbasic 中向命令提示符/Windows Shell 發出命令。 “Shell”命令與包含命令的字串一起使用,這些命令會被上述任何軟體識別。字串中包含的命令類似於 MS-DOS 的命令
示例:SHELL 可與“DIR”命令一起使用,以建立特定資料夾或路徑中檔案的目錄。
SLEEP [n]
執行暫停 n 秒
SOUND [frequency], [duration]
與 BEEP 命令不同,它從 PC 揚聲器發出可變頻率和持續時間的音訊。頻率以赫茲測量,範圍為 37 到 32767。在頻率部分輸入這些數字之一。持續時間是時鐘滴答聲,預設值為每秒 18.2 個滴答聲。
將數值轉換為文字(字串)字元
A$ = STR$(expression yielding a numeric value)
數值將被轉換為文字字元,並放置到 A$ 中。用於將數字轉換為文字字串。
警告。
1) 如果結果為正數,將在前面新增一個“空格”(STR$(123) = " 123" 而不是 "123",這可能與預期不符)。如果結果為負數,則不會使用空格,而是使用“-”(減號),即 STR$(-123) = "-123" 而不是 " -123",這可能與正數的行為預期不符。
2) 當將小於 0.1 的浮點數(mumb!、numb#)轉換為字串值時,該字串值可能會以“科學計數法”呈現,使用“D”而不是“*10^”(例如 "5.nnnnnnD-02" 而不是 " .05nnnnnn" 或 "5.nnnnnn*10^-02")。這僅在需要保留有效數字時才會發生(因此 .03000000 被呈現為 " .03",而 .030000001 被呈現為 " 3.0000001D-02"),這可能與您的預期不符。
另請參閱 CHR$,用於將 ASCII 值轉換為字串字元。
另請參閱 LEFT$、MID$、RIGHT$,用於從一行文字中提取子字串。
SYSTEM
.bas 退出,QBasic.exe 直譯器關閉,並將“控制權”傳遞給命令視窗 c:\ 提示符(或呼叫 .cmd 指令碼的下一行等)。
注意!:這僅在您使用“/run”引數在命令提示符下啟動程式時才有效!(例如:“Qbasic /run MyProg.bas”)否則,Qbasic 會假設您開啟程式是為了進行更改,因此“SYSTEM”會將您帶回到編輯器螢幕。
[Command] [variable] = [value] THEN GOTO [line command value]
與 GOTO 或 IF 條件命令結合使用。它告訴計算機在滿足特定條件時該怎麼做。
[Command] [Variable] = [Value] TO [Value]
通常用於輸入多個變數。
FOR a = 400 TO 500 PRINT a NEXT a
此示例將列印從 400 到 500 的所有數字。無需分別宣告所有值,我們可以在一次宣告中宣告它們。
USING "format";
用於格式化 PRINT 命令輸出的資料。通常,QBasic 直譯器將以 8 個字元列印一個數字,前面有儘可能多的空格。要更改此行為,可以使用 USING 命令來格式化輸出。例如..
IF n > 99 THEN PRINT #1, USING "###"; n; ELSE IF n > 9 AND n<=99
THEN PRINT #1, USING "0##"; n; ELSE PRINT #1, USING "00#"; n;
.. 將輸出從 0 到 999 的 n,並在前面新增零。請注意 n 後面的“;”。這意味著“不要換行”,這會導致下一個 PRINT #1 在逗號(“,”)之後直接新增資料(Qbasic 會自動插入逗號而不是換行符)。
name=VAL([variable$])
將 [變數字串] 的內容轉換為數值,以便在計算中使用。如果 (name) 是 INTEGER 型別,則 VAL 會向下取整。另請參閱 STR$。
A$ = "2"
B$ = "3"
X = VAL(A$) + VAL(B$)
PRINT A$; " + "; B$; " ="; X
WHILE {NOT} [test condition is true]
[program code to execute]
WEND
測試條件,如果為真(或不為真),則執行 [程式] 程式碼,直到遇到 WEND,此時控制權將傳遞迴 WHILE 行。
WHILE NOT (EOF(1)) LINE INPUT #1, A$ PRINT #2, A$ WEND
在檔案 #1 的結尾未到達之前,讀取每行完整的行並將它們寫入檔案 #2。
與 FOR 和 DO 不同,無法從 WHILE 迴圈中退出。


此作品的作者是
Faraaz Damji (Frazzydee)
Adam Colton
Gareth Richardson (Grich)
Debanshu Das