BASIC 程式設計/規範 BASIC
BASIC 程式語言已經標準化,首先是在美國(美國)由美國國家標準協會(ANSI)標準化,後來在歐洲由歐洲計算機制造商協會(ECMA)標準化,從而產生了美國國家標準 (ANS) X3.60-1978 用於最小 BASIC 和 X3.113-1987 用於完整 BASIC(由前者制定),以及歐洲計算機制造商協會 標準 55 用於最小 BASIC(1978 年制定)和 標準 116 用於完整 BASIC(1986 年制定)。
標準的目標是促進 BASIC 程式在各種系統之間的可互換性,並且透過這兩個組織之間的嚴格合作,能夠在相應的 ANSI 和 ECMA 標準之間保持完全相容性。
標準建立了,除其他外
- 用 BASIC 編寫的程式的語法,以及
- 解釋用 BASIC 編寫的程式含義的語義規則。
如今,只有 ECMA 標準公開可用。
允許的字元集由以下內容給出:
- 從 A 到 Z 的大寫字母集,
- 從 0 到 9 的數字集,
- 符號集 !, #, $, %, &, (, ), +, -, *, /, ^, ., ,, ;, :, <, =, >, _, ?, ', "
- 空格字元
最小 BASIC 中的保留關鍵字為(總共 26 個):
- BASE
- DATA
- DEF
- DIM
- END
- FOR
- GO
- GOSUB
- GOTO
- IF
- INPUT
- LET
- NEXT
- ON
- OPTION
- RANDOMIZE
- READ
- REM
- RESTORE
- RETURN
- STEP
- STOP
- SUB
- THEN
- TO
其含義將在接下來的部分中解釋。
變數在 BASIC 中用於儲存字元字串或數值,後者可以是標量或向量性質。
對於字元字串的變數,每個變數名由 A - Z 之間的單個字母和美元符號 $ 組成。因此,A$、B$、...、Z$ 都是字元字串的有效變數名,而 A# 或 Z% 則不是。
對於數值標量變數,每個變數名由 A - Z 之間的單個字母和一個可選數字組成。因此,A、B、C1、D2 等是標量值的有效變數名,而 A11、B22 等則不是。
對於數值向量變數,每個變數名由 A - Z 之間的單個字母和一個或兩個數字組成,數字之間用逗號分隔,並用括號括起來以表示一維或二維陣列。因此,A(1)、B(2)、C(1,1)、D(2,2) 等是向量值的有效變數名。
這種約定使得 BASIC 中不需要顯式宣告變數,因為美元符號用於區分字元字串和數值,而下標的存在則用於區分向量變數和標量變數。
字元字串由允許的字元集中任何字元的組合定義,這些字元組合用雙引號括起來,任何字元字串的長度限制為 18 個字元(在列印或備註語句中的字元字串除外,將在後面看到,它們可以與行號和行長限制一樣長)。因此,""、" "、"1 2 3 4 5 6 7 8 9"、"A B C D E F G H I"、"! # $ % & ... ' " 等都是允許的字元字串,而 "1 2 3 4 5 6 7 8 9 0"、"A B C D E F G H I J"、"! # $ % & ( ) + - * / ^ . , ; : < = > _ ? ' " 等則不是,因為它們超過了 18 個字元的限制。
數值常量以十進位制表示法的位置表示法表示標量數值。可選符號數值常量有四種一般語法形式:
- 隱式點表示 (sd...d),例如 1、2、+1、-2 等,
- 顯式點未縮放表示 (sd...drd...d),例如 1.0、2.0、+1.0、-2.0 等,
- 顯式點縮放表示 (sd...drd...dEsd...d),例如 1.0E1、2.0E-1、+1.0E+1.0、-2.0E-2.0 等,
- 隱式點縮放表示 (sd...dEsd...d),例如 1.0E1、2.0E-1、+1.0E+1、-2.0E-2 等,
其中
- s 是一個可選符號 (+ 或 -) ,
- d 是一個十進位制數字 (0 - 9) ,
- r 是一個句點 (.) ,以及
- E 表示 10 的冪。
數值常量可以有任意數量的數字,但內部至少要有六位有效數字,範圍在 1E-38 和 1E+38 之間。
大小小於機器無窮小的數值常量將被替換為零,而大小大於機器無窮大的常量將被替換為具有相應符號的機器無窮大。
BASIC 是一種面向行的語言,從某種意義上說,BASIC 程式可以看作是一系列行,最後一行是結束行,每一行都包含一個關鍵字。此外,每一行都以一個唯一的行號開頭,作為該行中包含的語句的標籤。
因此,在 BASIC 中,每個程式都可以用以下 巴科斯-諾爾正規化 (BNF) 表示
- program = block end-line
- block = line / for-block
- line = line-number statement
- line-number = digit digit? digit? digit?
- end-line = line-number end-statement
- end-statement = END
- statement = data-statement / def-statement / dimension-statement / gosub-statement / goto-statement / if-then-statement / input-statement / let-statement / on-goto-statement / option-statement / print-statement / randomize-statement / read-statement / remark-statement / restore-statement / return-statement / stop-statement
因此,以下簡單的示例是 BASIC 程式的有效示例:
- 一個兩行程式(只有一個註釋語句,用於記錄程式,不產生輸出,和一個結束語句,用於終止程式)
10 REM "REMARK STATEMENT" 20 END
- 一個三行程式(只有一個註釋語句,一個列印語句,用於列印一個字串,和一個結束語句)
10 REM "HELLO WORLD PROGRAM" 20 PRINT "HELLO, WORLD!" 30 END
程式行按順序執行,從第一行開始,直到
- 控制語句指示其他操作,或
- 發生異常情況,導致程式異常終止,或
- 執行停止語句或結束語句。
因此,在第一個示例中,第一行,10 REM "REMARK STATEMENT",由一個非控制語句組成,該語句不產生輸出或內部活動,然後傳遞到第二行,20 END,該行由一個控制語句組成,即結束語句,該語句結束程式。
在第二個示例中,在註釋語句行和結束語句行之間存在一個額外的行,該行由一個列印語句組成,也是一個非控制語句,用於列印一個字串。
行號的值是正整數,前導零沒有影響。因此,1、01、10、010 等都是有效的行號。通常,行號以 5 或 10 的倍數給出,例如 10、20、30、40 等,這在需要在現有行之間插入額外行的情況下留出空間。
此外,行可以長達 72 個字元,因此為行號保留 4 個字元,並在行號和關鍵字之間用空格作為分隔符,則一行中可列印的字元還剩下 67 個。
空格可以在 BASIC 程式中的任何位置出現,不會影響程式的執行,並且可以用來提高程式的可讀性。
程式中的所有關鍵字可以至少由一個空格字首,如果不在行尾,也可以至少由一個空格字尾。
空格不應出現在
- 行的開頭
- 行號中
- 關鍵字中
- 數值常量中
- 函式或變數名中
- 雙字元關係符號中
程式變數
[edit | edit source]BASIC 中的變數與數值或字串值相關聯,在數值的情況下,可以是簡單變數,也可以是對一維或二維陣列元素的引用,然後被稱為下標變數或複合變數。
如前所述,簡單數值變數由一個大寫字母后跟一個可選的單個數字命名,而下標變數由一個大寫字母后跟一個或兩個數字命名,在最後一種情況下,數字之間用逗號分隔,並用括號括起來。
字串變數也由一個大寫字母后跟一個美元符號命名。
在程式執行的任何時刻,一個數值變數與一個單一數值相關聯,而一個字串變數與一個單一字串值相關聯,與變數相關聯的值可能會在程式執行過程中被程式語句更改。
與字串變數相關聯的字串的長度可以在程式執行期間更改,從空字串的長度 0 變化到 18 個字元。
簡單數值變數和字串變數透過它們在程式中的出現隱式宣告(由於給定的命名約定,也不需要型別定義),雖然在程式開始時將它們初始化或設定為有意義的值,然後在任何語句中使用它們是一種良好的程式設計實踐。
另一方面,下標變數引用一維或二維陣列中由下標值或值選擇的元素,下標是整數值。
除非在維度語句(稍後將看到)中明確宣告,否則下標變數會透過它們在程式中的首次出現隱式宣告,在這種情況下,每個下標的範圍應理解為從零到十,包括零和十,除非存在一個選項語句,表示該範圍從一到十,包括一和十。
必須注意的是,同一個字母不能同時用作簡單變數名和複合變數名,也不能同時用作一維陣列名和二維陣列名。
相反,這種限制不適用於簡單變數和字串變數,它們的名字除了美元符號外可以相同。
因此,以下簡單的示例是 BASIC 程式的有效示例:
- 前面的三行程式,帶有一個稍微不同的註釋行和一個新的字串,用於指示要列印的 pi 值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 PRINT "PI = 3.14159265" 30 END
- 一個修改後的四行程式,它使用 let 語句在第二行將數值常量 3.14159265 賦值給數值變數 P,以及一個包含字串常量和數值變數的列印語句,作為一個逗號分隔的引數列表,位於第三行
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET P = 3.14159265 30 PRINT "PI = ", P 40 END
- 一個修改後的五行程式,仍然使用 let 語句在第二行將數值常量 3.14159265 賦值給數值變數 P,現在還使用 let 語句在第三行將字元常量 "PI = " 賦值給字串變數 P$ - 第四行的列印語句現在由字串變數和數值變數組成的逗號分隔的引數列表組成
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET P = 3.14159265 30 LET P$ = "PI = " 40 PRINT P$, P 50 END
語句
[edit | edit source]到目前為止,我們已經瞭解瞭如何透過 let 語句在程式中宣告/初始化簡單數值變數和字串變數,以及如何使用列印語句列印它們。
有時,不僅需要列印變數的值,無論是數值還是字元,還需要將該值作為輸入引入程式,以便計算數值或根據條件的值列印訊息。對於這些情況,需要使用表示式、數學函式和控制語句,我們將在本節中介紹。
輸入/輸出、數學運算子、表示式
[edit | edit source]表示式通常分為數值表示式和字串表示式。
在數值表示式的例子中,這些表示式是由變數、常量、數學函式以及加法、減法、乘法、除法和乘方運算構成的。
數值表示式的形成和計算遵循正常的代數規則,上標符號、星號、斜槓、加號和減號分別用於表示乘方運算、乘法運算、除法運算、加法運算和減法運算。
除非括號另有規定,否則首先執行乘方運算,然後執行乘法和除法,最後執行加法和減法,其中優先順序相同的運算從左到右關聯。因此,A - B - C 被解釋為 (A - B) - C,A / B / C 被解釋為 (A / B) / C,A - B / C 被解釋為 A - (B / C),因為在前兩個表示式中,所有數學運算子的優先順序都相同,因此從左到右計算,而在最後一個表示式中,運算子之間存在不同的優先順序,因此除法在減法之前計算。
以下例子以簡單的方式說明了到目前為止看到的概念
- 一個程式,它列印數值常量 1.4142 的乘方 2 的值(也計算 1.4142 的平方),以及一些文字
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 PRINT "THE SQUARE OF 1.4142 IS ", 1.4142^2 30 END
- 一個程式,它定義一個數值變數 S,其值為 1.4142,並列印該數值變數的乘方 2 的值(也計算 1.4142 的平方),以及一些文字
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S = 1.4142 30 PRINT "THE SQUARE OF ", S, " IS ", S^2 40 END
- 一個程式,它定義一個數值變數 S,其值為 1.4142,計算 S 乘以 S 的積(也計算 1.4142 的平方),將該值賦值給一個數值變數 S2,並列印 S 和 S2 的值,以及一些文字作為字串常量
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S = 1.4142 30 LET S2 = S * S 40 PRINT "THE SQUARE OF ", S, " IS ", S2 50 END
- 一個程式,它定義一個數值變數 S,其值為 1.4142,另一個變數 S2 為 2.0000,並列印 S2 除以 S 的運算結果,以及一些文字作為字串常量
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S = 1.4142 30 LET S2 = 2.0000 40 PRINT "THE SQUARE ROOT OF ", S2, " IS APPROXIMATELY ", (S2 / S) 50 END
- 一個與前面程式類似的程式,它定義一個數值變數 S,其值為 1.4142,另一個變數 S2 為 2.0000,但列印 S 減去 S2 除以 S 的結果的運算結果(從而給出近似值的精度度量 - 這是我們稍後將要看到的用於計算數字平方根的數值方法的核心),以及一些文字作為字串常量
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S = 1.4142 30 LET S2 = 2.0000 40 PRINT S, " AND THE QUOTIENT OF ", S2, " BY ", S, " DIFFER BY ", (S - S2 / S) 50 END
- 一個與前面程式略有不同的程式,它要求使用者輸入一個數字,用於計算該數字的平方
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S = 0.0 30 PRINT "THIS PROGRAM CALCULATES THE SQUARE OF A NUMBER" 40 INPUT "PLEASE ENTER THE NUMBER WHOSE SQUARE IS TO BE CALCULATED: ", S 50 PRINT "THE SQUARE OF ", S, " IS ", S^2 60 END
數學函式
[edit | edit source]到目前為止,我們已經瞭解瞭如何定義數值變數和字元變數、編寫行的規則、基本輸入和輸出以及簡單算術的規則。
但如果需要計算一個數字的平方根,該怎麼辦?為此,預設情況下提供了基本的數學函式。這些函式是
- 一個數字的絕對值,ABS(X)
- 一個數字的反正切值,ATN(X)
- 一個以弧度表示的數字的餘弦值,COS(X)
- 一個數字的指數值,EXP(X)
- 一個數字的整數部分,INT(X)
- 一個數字的自然對數值,LOG(X)
- 一個數字的符號,SGN(X)
- 一個以弧度表示的數字的正弦值,SIN(X)
- 一個正數的平方根,SQR(X)
- 一個在區間 (0,1) 中均勻分佈的偽隨機數,RND()
- 一個以弧度表示的數字的正切值,TAN(X)
讓我們看一些例子
- 一個程式,它使用提供的 SQR 數學函式計算 2 的平方根
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET S2 = 2.0 30 LET S = SQR(S2) 40 PRINT "THE SQUARE ROOT OF ", S2, " IS ", S 50 END
- 一個程式,它要求使用者輸入一個數字,用於計算該數字的餘弦值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET X = 0.0 30 INPUT "PLEASE ENTER THE NUMBER WHOSE COSINE IS TO BE CALCULATED: ", X 40 PRINT "THE COSINE OF ", X, " IS ", COS(X) 50 END
- 一個程式,它要求使用者輸入一個數字,用於計算該數字的正弦值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET X = 0.0 30 INPUT "PLEASE ENTER THE NUMBER WHOSE SINE IS TO BE CALCULATED: ", X 40 PRINT "THE SINE OF ", X, " IS ", SIN(X) 50 END
- 一個程式,它要求使用者輸入一個數字,用於計算該數字的正切值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET X = 0.0 30 INPUT "PLEASE ENTER THE NUMBER WHOSE TAN IS TO BE CALCULATED: ", X 40 PRINT "THE TAN OF ", X, " IS ", TAN(X) 50 END
- 一個程式,它要求使用者輸入一個數字,用於計算該數字的指數值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET X = 0.0 30 INPUT "PLEASE ENTER THE NUMBER WHOSE EXP IS TO BE CALCULATED: ", X 40 PRINT "THE EXP OF ", X, " IS ", EXP(X) 50 END
- 一個程式,它要求使用者輸入一個數字,用於計算該數字的自然對數值
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 LET X = 0.0 30 INPUT "PLEASE ENTER THE NUMBER WHOSE LOG IS TO BE CALCULATED: ", X 40 PRINT "THE LOG OF ", X, " IS ", LOG(X) 50 END
- 一個程式,用於列印一個在區間 (0,1) 中均勻分佈的偽隨機數
10 REM "SIMPLE PROGRAM FOR DEMONSTRATION PURPOSES" 20 PRINT "PSEUDO-RANDOM NUMBER UNIFORMLY DISTRIBUTED IN (0,1): ", RND() 30 END
最小 BASIC 示例程式可在相應頁面找到。