跳轉至內容

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 命令。

6INPUT.BAS

[編輯 | 編輯原始碼]
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 # 和 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.

警告:如果輸入超過檔案末尾,將發出錯誤: "輸入超過檔案末尾 "。可以使用 LOFEOF 函式來防止錯誤。(LOF 代表檔案長度,而 EOF 代表檔案結尾)

文字輸出

[編輯 | 編輯原始碼]

你的第一個 QBasic 程式: 1HELLO.BAS

[編輯 | 編輯原始碼]

以下段落需要安裝了 QBasic 的計算機

首先,將以下程式中的所有內容(“PRINT "Hello World"”)寫入文字編輯器或 QBasic IDE(整合開發環境)本身,並將其儲存為“1HELLO.BAS”。接下來,在 QBasic 中開啟該檔案(除非你使用的是 QBasic IDE,在這種情況下它已經開啟),然後按 F5 鍵。你也可以使用 IDE 視窗頂部的選單欄上的“執行”選單。這將執行(執行)該程式。單詞“Hello World”應出現在螢幕的左上角。你剛剛執行了第一個 QBasic 程式。如果你再次按 F5,另一行文字“Hello World”將出現在螢幕的左上角,將第一行推到螢幕的第二行。你可以對本華夏公益教科書中的其他示例程式遵循相同的步驟。

1HELLO.BAS

[編輯 | 編輯原始碼]
 PRINT "Hello World"

PRINT 是 QBasic 的文字輸出函式。它是我們將透過本節探索的命令。PRINT 是 QBasic 函式,需要引數。我們剛剛執行的“Hello, World!”程式中的引數是單詞“Hello, World!”。因此,PRINT 是函式,“Hello, World!”是我們傳遞給函式的引數。

PRINT [螢幕文字]

注意:作為快捷方式,只需使用問號“?”代替命令“PRINT”。同樣,可以使用單引號“'”代替關鍵字 REM 來在程式碼中插入註釋

2HELLO.BAS

[編輯 | 編輯原始碼]
 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

PRINT、逗號、分號、製表符 (n) 和 CLS

[編輯 | 編輯原始碼]

以下是程式輸出應顯示的樣子

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”對齊。

關於此主題的最後一句話是,嘗試一下。嘗試在程式中使用逗號和分號。

3HELLO.BAS

[編輯 | 編輯原始碼]
 CLS
 hello$ = "Hello World"
 number = 12
 PRINT hello$, number

變數用於儲存資訊。它們就像容器。你可以在其中放入資訊,然後稍後將資訊更改為其他內容。在第一個示例中,它們可能看起來不太有用,但在下一節(輸入)中,它們將變得非常有用。

在本例中,我們使用兩種型別的變數:字串變數和數值變數。字串變數儲存字串,例如單詞。(字元是字母、數字或符號。)在本例中,字元是字母。字串變數用美元符號表示變數名稱的結尾。本程式中的字串變數是 hello$。你為 hello$ 分配的任何值都將在 PRINT 語句中顯示。數值變數是 number。數值變數沒有像字串變數那樣的特殊結尾。

4FACE.BAS

[編輯 | 編輯原始碼]
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()` 函式或任何您打算使用的其他舍入方法。

10OROP.BAS

[編輯 | 編輯原始碼]
 '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)'

11RND.BAS

[編輯 | 編輯原始碼]
 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

關於 RND 的更多資訊

[編輯 | 編輯原始碼]

關於 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...THEN...ELSE

[編輯 | 編輯原始碼]
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

13 ELSEIF

[編輯 | 編輯原始碼]

作為從頭開始一個全新的 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...NEXT

[編輯 | 編輯原始碼]
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 迴圈。

14FOR.BAS

[編輯 | 編輯原始碼]
 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...WEND

[編輯 | 編輯原始碼]
 WHILE <condition is true>
   [do this]
   ..
   [and this]
 WEND

如果條件為真,則執行 WHILE 語句後的程式碼。當執行 WEND 命令時,它將控制權返回給 WHILE 語句(在那裡再次測試條件)。當條件計算為 FALSE 時,控制權將傳遞到 WEND 語句後的語句。

15WHILE.BAS

[編輯 | 編輯原始碼]
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 迴圈的更高階形式 - 與其他流程控制塊一樣,它由 DOLOOP 標記以表示邊界。

它依賴於放置在 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$ 的結果來確定掃描碼。

注意
某些鍵無法透過 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 中,錯誤處理程式不能位於任何子程式中。因此,任何錯誤檢查或標誌都必須透過使用與主模組共享的變數來處理。

注意
雖然 QBasic 文件指出 ON ERROR RESUME NEXT 是一個有效的語句,但這不正確。

注意:如果您的錯誤處理例程中沒有“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 語句遵循以下模式

OPEN file$ FOR INPUT AS 1
OPEN file$ FOR OUTPUT AS 2

檔案$確定要使用的檔名。該FOR部分指示如何訪問或操作檔案 - 它可以是 APPEND、BINARY、INPUT、OUTPUT 和 RANDOM。該AS #是用於該檔案控制代碼的識別符號 - 如果需要,它可以是一個變數。

注意
如果你允許使用者輸入磁碟上不存在的檔名,你需要使用ON ERROR來處理這種情況。

輸入和輸出

[編輯 | 編輯原始碼]

當你需要訪問或寫入檔案控制代碼的內容時,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

為了建立一個新檔案,你必須以 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

Qbasic 中的簡單音樂鍵盤

[編輯 | 編輯原始碼]
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 在圖形方面能做什麼

[編輯 | 編輯原始碼]

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 
Simple Line
簡單的線
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 命令來建立。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

解釋

  1. 我們已從預設的 Qbasic 僅文字螢幕切換到啟用圖形的螢幕。
  2. 我們已呼叫建立動畫的子程式。
  3. 我們已開始 do-loop 直到。這使動畫能夠執行,直到使用者按下一個鍵結束它。
  4. 我們已設定座標的增量。這使得方框可以在新的位置而不是同一個位置繪製。如果希望它只在一個方向上移動,我們只需要在一個變數中設定增量。
  5. 我們已從每個座標繪製到另一個座標的線條。請注意,每次一個座標保持固定,而其他座標會改變。(這裡我指的是兩個座標集,第一個是起始座標,第二個是結束座標)
  6. 我們已發出一個 sleep 命令。這會停止執行 2 秒。如果沒有它,do-loop 會比我們想要的更快執行,動畫會很短暫。
  7. 透過對變數使用 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$ <> ""
  1. 這裡第一個函式 "_mousehide" 阻止預設的指標滑鼠格式顯示在螢幕上
  2. Mouseinput 函式檢索滑鼠資訊。
  3. 接下來的函式 "_mousex" 和 "_mousey" 包含滑鼠的當前 x 和 y 座標。
  4. 這些行繪製了一個基本的觸發器。
  5. "_mousebutton" 函式返回所按滑鼠按鈕的值,“1” 表示按下了左鍵。
  6. 如果滑鼠按鈕事件發生在某個封閉區域內,則會發出“message$”形式的訊息。這可以稍後使用。
  7. 如果滿足了前面的條件,則過程會轉到行標籤“action”,這裡可能包含要執行的任何命令。
  8. 否則,該過程會迴圈,直到滿足“迴圈直到”條件。它也可以是除上面給出的條件以外的其他條件。

這些圖形和動畫可用於建立一個完整的遊戲。你可以使用“Inkey$”命令而不是“滑鼠”函式來發出各種場景和情況,每種情況都有一個完整的程式碼來決定接下來發生什麼。

你可以使用“.txt”檔案來儲存資訊,而不是製作不包含任何使用者資訊的遊戲。這些資訊可以稍後檢索,用於建立具有完整“職業”選項的遊戲。

3D 圖形

[編輯 | 編輯原始碼]

簡單的 3D 盒子

[編輯 | 編輯原始碼]

在 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 中顯示影像的所有內容!

那麼,這令人驚歎的簡單程式碼究竟做了什麼?

逐步解釋

  1. 我們已將變數 Image 定義為一個長整型值。這是因為 _loadimage 函式返回的影像控制代碼是一個長整型值。
  2. x 和 y 是我們的變數。它們儲存我們需要設定為解析度的值。因此,對於 8n00 x 900 的影像,x = 800,y = 900。
  3. 影像變數 Image 接下來被賦予影像“TEST.jpg”的控制代碼值。一條健康的警告:將影像儲存在 QB64 IDE 資料夾中。否則,該函式將無法工作!
  4. 接下來,我們將螢幕調整為適合影像。newimage 函式需要三個引數:解析度引數和顏色模式引數。這裡我們使用 32 位顏色模式,您也可以使用 256 位調色盤顏色模式。
  5. 最後,我們使用 _putimage 放置影像,它將 Image 變數(我們的影像控制代碼)作為其引數。

an example of images in qbasic

_newimage 的輔助用途,用於設定螢幕細節

[編輯 | 編輯原始碼]

好吧,您一定在想,所有這些命令都必須以完全相同的順序使用。不,事實並非如此。您可以單獨使用 _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

[編輯 | 編輯原始碼]
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(僅限 QB64!)

[編輯 | 編輯原始碼]

_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 .. LOOP

[編輯 | 編輯原始碼]
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 / END DEF / END SUB / END FUNCTION / END IF / END SELECT

[編輯 | 編輯原始碼]
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 [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 [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 ([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

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
 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(僅 QB64!)

[編輯 | 編輯原始碼]

_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

[編輯 | 編輯原始碼]
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 或 '

[編輯 | 編輯原始碼]
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 ... WEND

[編輯 | 編輯原始碼]
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 迴圈中退出。

ASCII 表

[編輯 | 編輯原始碼]
ASCII Character Codes 0-127
ASCII 字元程式碼 0-127
ASCII Character Codes 128-255
ASCII 字元程式碼 128-255

此作品的作者是

Faraaz Damji (Frazzydee)
Adam Colton
Gareth Richardson (Grich)
Debanshu Das

華夏公益教科書