本章所述的语句使你能把数据从键盘送入计算机 ,或从计算机送到显示器,它们在程序中主要用
于输入数据,输出结果和信息。
本章涉及的语句有:
1、 PRINT 项目清单
注: ?号是PRINT的简写形式
在显示器上打印了一个项目或许多项目。项目既可以是串常数(信息放在引号里),串变量,数字常数
(数目),数字变量,也可以是包含有上述项目的表达式。要打印的项目可以用逗号(,)或分号(;)
把它们隔开。如果使用逗号,则在打印下一个项目以前,光标自动地进到下一个打印区。如果使用分号
则在显示器上两条打印项目之间插入空格。
例如:
10 X=5
20 PRINT 25;"IS_EQUAL_TO";XX^2'其中项目25为数字常数,"IS_EQUAL_TO"为串常数,XX^2为表达式
RUN
25ΔIS_EQUAL_TOΔ25 '注:Δ符号代表空格
10 A =1
20 PRINT A;A+1,A+2;A+3'项目为数字变量和表达式
21 RUN
1Δ2ΔΔΔΔ3Δ4
2、 PRINT @位置行,列,项目表
精确地按规定坐标位置开始打印信息。修饰项@必须紧随PRINT ,规定的位置 行=0至7,列=0至29
例如:
X100
PRINT @2,6,XX '在第2行第6列打印 X轴的变量XX
PRINT @M,N,XX '在第M行第N列打印 X轴的变量XX
3、 PRINT TAB(表达式)
将光标移到本行的指定位置(指定的TAB位置要小于30列)。
例如:
X100
Y=200
N=10
PRINT TAB(9) XX '在当前行的第9列打印 X轴的变量XX
PRINT TAB(N) YY '在当前行的第N列打印 Y轴的变量YY
4、INPUT 项目清单
使计算机暂停执行,等待你通过键盘输入规定的数值。INPUT语句可以规定一列字符串变量或数字变量
清单作为输入,清单中的每一项之间必须用逗号隔开。
100 INPUT A$,B 这语句要求你的输入次序为:一串文字,一个数值。
200 PRINT A$;B
RUN
当计算机遇到INPUT语句时就显示:
?请输入参数,然后按Enter键
"ABC" 注:(你打入"ABC"然后按Enter键)文字串必须加引号
A$=ABC 注:显示A$的结果
?请输入参数,然后按Enter键
100 注:(你打入100然后按Enter键)数值不许加引号
B=100 注:显示B的结果
ABC 100 注:PRINT A$;B 语句执行后显示它们的结果
程序语句
LEVEL Ⅱ BASIC 作了一些有关程序运行的假设,如:
* 没有类型说明的变量都假设为单精度变量。
* 为字符串和数组自动地开辟了一部分内存一而不论你是否全部使用它们。
* 程序按顺序执行,从程序的第一条语句开始到最后一条为止。
本章介绍的语句,使你能越过这些假设,给了程序更大的灵活性,以便适应各种情况。注意:所
有的LEVEL Ⅱ语句,除INIPUT以外,都能够在命令方式及执行方式下使用。
本章介绍的语句有:
类型定义 赋值或分配 执行次序 试验(条件语句)
DEFINT CLEAR n END IF
DEFSNG LET STOP THEN
DEFDBL GOTO ELSE
DEFSTR GOSUB
ON……GOTO
ON……GOSUB
FOR…NEXT…STEP
ERROR
REM
本章还包括LEVEL Ⅱ BASIC中的数据转换的讨论,这使你能预测和控制表达式,常数等产生的
结果,这些结果将作为整数、单精度和双精度存储起来。
☆ DEFINT 字母范围
用它指定范围内的任何字母开头的变量,都将作为整型变量存储和处理,除非在变量名后附加上
别的类型说明符,按说明符处理。使用整型变量可节省内存,因为整型值占有的内存比其他数字
类型省,整型运算比单精度和双精度型运算要更快,
但是,定义为整型的变量只能在-2147483648与+2147483647范围内取值。
例如:
10 DEFINT A,I,N
在行10以后,所有以A,I或N开头的变量都作为整型处理,如A1,AA,I3和NN就都是整变量。而A1#,
AA#,I3#,仍然作为双精度变量,因为类型说明符总是不受DEF语句的限止。
10 DEFINT I-N
使得以I,J,K,L,M和N开头的变量都作为整型变量处理。
DEFINT可以放在程序中任何地方。由于它会改变那些没有类型说明符的变量的类型属性,因此,
通常把它入在程序的开头。
参阅<DEFSNG>,<DEFDBL>的“变量类型”。
☆ DEFSNG 字母范围
指定某个范围内的字母开头的变量作为单精度变量存储和处理,除非变量名后加有其他类型的说
明。单精度变量和常数以7位精度存储而以6位精度印出,由于所有的数字变量,除了定义为其它
类型的以外,都被假设为单精度变量,因此,DEFSNG语句主要用于新定义那些前面已被定义或双
精度型成整型的变量。
例:
100 DEFSNG I,W-Z
使得字母I或任何W至Z之间的字母开头的变量都作为单精度变量处理。但是I%仍是整变量,I#是双
精度变量,因为它们使用了类型说明符。
参阅<DEFINT>,<DEFDBL>和第一节的“变量类型”。
☆ DEFDBL 字母范围
指定某个范围内的任何字母开头的变量作为双精度变量存储和处理,除非加有其它类型的说明符。
双精度型允许17位精度,但双精度变量被输出时只显示出16位。
例如:
100 DEFDBL S-Z,A-E
使得以字母S至Z或A至E之一开头的变量作为双精度变量。
DEFDBL语句一般用在程序的开头,因为它会改变没有类型说明符的变量的类型属性。
参阅<DEFINT>,<DEFSNG>和第一节“变量类型”。
☆ DEFSTR 字母范围
指定某个范围内的字母开头的变量作为串变量作为变量存储和处理,除非变量名后加有其他类型
的说明符,如果你已经CLEAR(开辟了)足够的串存储空间,那末每一字符最多能存储255个字符。
例如:
10 DEFSTR L-Z
使得以字母L到Z之间的任何字母开头的变量为串变量,除非加有其他类型的说明符。在行10执行
后,赋值L1=“WASHINGTON”是有效的。
参阅<CLEAR n>,第一节“变量类型”和第五节。
☆ CLEAR n
当使用一个自变量n时(n可以是常数或表达式),这一语句使计算机开辟了n字节的内存作字符串
存储用,另外使所有变量清零。在控制器打开电源时,自动地为字符串开辟了1024字节的内存。
用CLEAR开辟的字符串存储的数量必须等于或大于字符串变量在执行过程中需要存储字符的最大数
目,否则将产生字符空间出界(OS)错误。
例如:
10 CLEAR 1000
为字符串存储开辟了1000字节的内存空间。
实际上需要多少字符串存储量,便按这个数量去开辟内存,这样使你的程序能更有效地使用内存。
例如,对一个不应用串变量的程序,应包含有CLEAR 0语句。CLEAR 的自变量必须是非负数,
否则将产生错误。
☆ LET 变量=表达式
可以用来给一个变量赋值。Radio Shacek LEVEL Ⅱ BASIC可以不用LET作赋值语句,但是也可
以使用它,以保证与那些需要有此语句的一类BASIC版本相兼容。
例如:
100 LET A$="A ROSE IS A ROSE"
110 LET B1=1.23
120 LET X=X-Z1
在这种情况下,等号右边的表达式或常数值赋给了等号左边的变量。
☆ END
正常地结束程序的执行(不给出BREAK信息)。有些类型的BASIC版本需用END作为程序的最后一条
语句,在LEVEL Ⅱ 中并没有这样的要求。END主要用于强迫执行在某点终止,而不是在程序的逻
辑结尾。
例如:
10 INPUT S1,S2
20 GOSUB 100
……
99 END
100 H=SQR(S1*S1+S2*S2)
110 RETURN
语句99的END防止了程序控制“擅自闯入“子程序,这样,语句100只用作调用子程序的语句,
如20 GOSUB 100,才能入口。
☆ STOP
中断程序的执行,并打印出信息:BREAK IN语句标号。STOP主要是一个调试手段。在执行中强
迫程序在某处中断,你可以检查或修改变量的数值,然后使用命令CONT,使执行从刚才停止的地
方重新开始往下执行。(如果程序本身在中断过程中被修改了,那末用CONT不可以继续执行)
例如:
10 X=RND(10)
15 STOP
20 GOSUB 1000
RUN
BREAK IN 15
READY
┃
假设我们想检查一下传送到以语句标号1000开头的子程序中去变量X是什么值,在这中断过程中,
我们能用PRINT X 来检查X值(在程序调试完以后可以删去语句15)。
☆ GOTO 语句标号 注:单独使用 GOTO语句时,标号可以用变量.例 A=100:GOTO A
把程序控制转移到指定的语句标号上去执行。单独使用时,GOTO语句标号是一个无条件转移,但
是,试验条件语句可以放在GOTO前边,作为一个条件转移。
例如: 200 GOTO 10
当执行语句200时,控制就无条件地跳到语句10
可以在命令状态应用GOTO作为RUN的另一种命令。GOTO语句标号,使得计算机从指定的语句标号开
始执行,并且不自动执行CLEAR,这使你能把命令方式中赋给的值在执行方式传送到变量中去。
参阅<IF>,<THEN>,<ELSE>,<ON……GOTO>。
☆ GOSUB 语句标号 注:单独使用 GOSUB语句时,标号可以用变量。例 A=100:GOSUB A
把程序控制转移到以指定语句标号开头的子程序中去执行。当计算机遇到子程序中的RETURN 语
句时,它就使控制回到GOSUB下边的一条语句上去执行。GOSUB和GOTO一样,在它的前边可以放试
验条件语句。
参阅<IF>,<THEN>,<ELSE>,<ON……GOSUB>
例如程序:
101 GOSUB 200
110 PRINT "1111":END
200 PRINT "2222"
210 RETURN'子程序返回语句
RUN
2222
1111
控制从语句100转移到语句标号200开头的子程序,语句210使计算机回到GOSUB紧下边的语句即标
号为110的语句上去执行。
☆ RETURN “简写 RET”
子程序的结束语句,使控制回到这一次调用它的GOSUB紧下边的语句,如果机器遇到了RETURN而
找不到调用它的GOSUB语句,则产生错误。
☆ On n GOTO 语句标号,……,语句标号
这是一个多分支的转移语句,它受一个试验变量或表达式控制。其一般的格式为:
ON 表达式 GOTO 第1语句标号,第2语句标号,……,第K语句标号
表达式结果必须是0和255之间的数。
当ON……GOTO执行时,首先计算表达式,然后取其整数部分INT(表达式)。若整数部分为J,
计算机就在语句标号清单上数到第J项,然后转移到第J项规定的语句标号。如果没有第J项
(即J>K见上述一般格式),那末控制就执行程序中的下一条语句。(若表达式等于0,也执
行下一条语句-译注)
如果试验表达式或数小于0,则产生错误在清单中语句标号的数目不受限制。
例如:
100 ON MI GOTO 150,160,170,150,180
计算变量MI
若其整数部分等于1,则转移到语句150
若其整数部分等于2,则转移到语句160
若其整数部分等于3,则转移到语句170
若其整数部分等于4,则转移到语句150
若其整数部分等于5,则转移到语句180
若其整数部分不等于1至5的任何数,则程序就执行下一条语句。
应用ON n GOTO 的一个程序例子:
100 INPUT X
200 ON SGN (X)+2 GOTO 220,230,240
220 PRINT "NEGATIVE":END
230 PRINT "ZERO":END
240 PRINT "POSITIVE":END
SGN(X)对于X小于0 得-1,对于X等于0得0,对于X得+1,再加上2以后,表达式就根据X为负数,
零或正数分别得到1、2、3,于是控制就转移到相应的语句上去。
☆ ON n GOSUB 语句标号,……,语句标号
功能与 ON n GOTO 一样,只是控制转移到一个由语句标号清单中规定中某个子程序上去。
例如:
100 INPUT I
110 ON I GOSUB 200,300,400
120 END
200 PRINT "SUBROUTINE #1":RETURN
300 PRINT "SUBROUTINE #2":RETURN
400 PRINT "SUBROUTINE #2":RETURN
试验项 n 可以是数字常数,变量或表达式。它必须是非负数值,否则会出错。见(ON n GOTO)。
☆ FOR 变量名称=表达式 TO 表达式 [STEP 表达式] NEXT 变量名称
程序进入一个循环圈,使得一段程序语句重复执行规定的次数。循环语句的一般形式是(括号中
的内容是可有可无的):
语句标号 FOR 计数变量=初值 TO 终值 [STEP 增量]
……
[程序语句]
语句标号 NEXT [计数变量]
在FOR语句中,初值、终值和增量可以是常数,变量或表达式。第一次执行FOR语句时,先求得这
三个量的值并把它们存储起来,如果这三个变量被循环改变了(这里的三个变量是指FOR语句中代
表初值、终值和增量的那三个变量,它们在循环中可以改变而不影响循环的执行,可参阅本节举
例-译者注),并不影响循环的执行。但是,计数变量不得改变,否则会使循环不能正常进行。
FOR-NEXT-STEP循环语句是这样工作的:第一次执行FOR语句时,计数变量等于初值,执行继续
进行到遇到NEXT语句,这时计数变量就加上STEP规定的增量(如果增量是个负数值,那末计数变
量实际上是减小)。如果不用STEP增量,那末增量假设为1。接着计数变量与FOR语句中规定的终
值进行比较,如果计数变量大于终值,那末循环结束,继续执行NEXT语句下边的语句(如果增量
是个负数那末当计数变量小于终值时,循环结束)。如果计数变量的值还没有超过终值,那末程
序又执行FOR语句后的第一条语句。
程序举例:
10 FOR I=10 TO 1 STEP –1
20 PRINT I;
30 NEXT
RUN
10 9 8 7 6 5 4 3 2 1
READY
>-
10 FOR K=0 TO 1 STEP .3
20 PRINT K;
30 NEXT
RUN
0 0.3 0.6 0.9
READY
>-
在K=0.9以后再加上0.3,K=1.2,这时就大于终值 1,因此,循环结束,不再打印出该值。
10 FOR K=4 TO 0
20 PRINT K;
30 NEXT
RUN
4
READY
>-
没有规定STEP,因为假设STEP为1,在K第一次增加以后,K的值为5,由于5比终值0大,所以循环结束 。
10 J=3:K=8:L=2
20 FOR I=J TO K+1 STEP L
25 J=0:K=0:L=0
30 PRINT I,
40 NEXT
RUN
3 5 7 9
READY
>-
在语句20中对变量和表达式作了一次计算,于是对于FOR-NEXT-STEP循环,这些值变成了常数,所以
后边改变了三个变量的值并不影响循环。
FOR –NEXT 循环可以“嵌套起来”:
10 FOR I=1 TO 3
20 PRINT "OUTER LOOP"
30 FOR J=1 TO 2
40 PRINT "INNER LOOP"
50 NEXT J
60 NEXT I
RUN
OUTER LOOP
INNER LOOP
INNER LOOP
OUTER LOOP
INNER LOOP
INNER LOOP
OUTER LOOP
INEER LOOP
INEER LOOP
注意,每个NEXT语句规定了各自的计数变量,这恰好有助于程序编制者留意嵌套次序。计数变量可以
从NEXT语句中省略。但是,如果你使用了计数变量,那末你必须按正确次序使用它们,也就是最内层
循环的计数变量必须首先出现在NEXT语句中。
当你的程序允许转移到FOR-NEXT 循环外边的程序语句去执行时,用NEXT语句规定计数变量也是合
理的。
循环还可以嵌3层,4层等等,能嵌套多少层是取决于内存数量的大小。
☆ ERROR 代码
让你在程序执行中“模拟”一个指定的错误信息。
当碰到ERROR代码语句时,计算机将显示错误信息。参考错误代码表:错误代码及其意义。
程序举例:
例1:
100 ERROR 0
RUN
传送结束
READY
┃
例2:
100 ERROR 3
RUN
开始加工
┃
READY
例3:
100 ERROR 10
RUN
NF (有NEXT没有FOR)
┃
READY
错误代码10是“没有匹配的FOR语句,试图执行NEXT语句”。
☆ REM 注:'单引号是REM的缩写形式
通知计算机忽略该程序行的其它部分,它允许你在程序中插入注释作为对程序的说明。于是,当你(
或别人)看你的程序清单时,能够很容易了解它。如果REM用在多语句程序行中时,它必须是该行的最
后一条语句。
程序举例:
10 REM ..THIS REMARK INTRODUCES THE PROGRAM ..
20 REM ..AND POSSIBLY THE PROGRAMMER,TOO… ..
30 REM .. ..
40 ' ..THIS REMARK EXPLAINS WHAT THE ..
50 ' ..VARIOUS VARIABLES REPRESENT: ..
60 ' ..C=CIRCUMFERENCE R=RADIUS ..
70 ' ..D=DIAMETER ..
80 ' ..
90 INPUT "RADIUS”;R:REM THIS IS FIRST EXECUTABLE LINE
上面的程序显示了REM语句的一些概貌,在REM语句中可以包含字符符号,它的最大的长度和其他语句
一样:不超过250个字符。
在LEVEL Ⅱ BASIC 中,可以使用一个省字符号 '作为REM 的缩写,如:
100 'THIS TOO IS A REMARK
☆IF (真/假)表达式 动作条款
命令计算机对跟随着的逻辑或关系表达式进行试验,如果表达式为“真”,控制将处理紧随表达式后
“动作”;如果表达式为“假”,控制将转移到对应的ELSE语句(如果有的话)或者转移到下一条程
序上去执行。
在数值项中,如果表达式具有非零值,它总是等价于逻辑“真”。
例如:
100 IF X>127 PRINT "OUT OF RAMGE";END
如果X大于127,控制就传送到PRINT语句,然后到END语句。但是,如果X不大于127,控制转移到程序的
下一行中去执行,跳开了PRINT 和 END 。
100 IF 0<=X AND X<=90 THEN Y=X+180
如果两个表达式都是真的,那末Y被赋值为X+180,否则控制转移到下一条程序行,跳过了THEN 后的
赋值语句。
注意:在上例或相似的语句中,THEN 是可有可无的,但是,有时必须用THEN来消除意义不明 ,
例如:400 IF Y=M THEN M=0,如果没有THEN 就不能工作。
500 INPUT A$:IF A$="YES" THEN 100
600 INPUT A$:IF A$="YES" GOTO 100
这两条语句有相同的作用。在语句500和其它IF表达式THEN语句标号的语句中,THEN 是必须有的。
100 IF A>0 AND B>0 PRINT “BOTH POSITIVE”
试验表达式可以由逻辑算子如AND 和OR 连接一些关系表达式所组成。
参阅<THEN >,<ELSE>
☆THEN 语句标号
在IF-THEN 类型的语句中引入一个“动作条款”。THEN是可有可无的,除非要利用它转移到规定的某
条语句标号上去,如IF A<0 THEN 100 。在IF-ELSE语句中也必须用THEN。
☆ELSE 语句或语句标号
用在IF的后边,以便在IF试验失败的情况下,指定一个替换动作(在不用ELSE语句时,控制在试验失败
后将转移到下一条程序上去执行)。
例如:
100 INPUT A:IF A=2 THEN 300 ELSE END
在语句100,如果A等于 2,那末程序转移到语句300,但是,如果A不等于2,程序就跳到ELSE语句,使计
算机执行结束。
200 IF A<B PRINT "A<B" ELSE PRINT "B<=A"
如果 A 小于 B,那么计算机打印出这个结果 ,然后处理下一个程序行,跳过了ELSE 。A不小于B,
计算机直接跳到 ELSE 语句并打印出指定信息,然后控制转到程序的下一条语句上去执行。
200 IF A>0.001 THEN B=1/A:A=A/5:ELSE 260
如果A>0.001是“真”,那末执行后面的语句,赋新值给 B 和 A,然后程序转移到下一行去,跳过
了ELSE语句,但是如果 A>0.001是“假”,程序直接跳到ELSE 语句,它使得转移到语句260上去。
注意,在 ELSE 后边不需要 GOTO。
IF-THEN-ELSE 语句可以嵌套,但是 必须小心地配对IF-ELSE
10 INPUT A,B
20 IF A<B THEN IF A<B PRINT A;:ELSE PRINT "NEITHER";:ELSE
PRINT B;
30 PRINT "IS SMALLER"
运行这个程序,输入一对不同的数,程序将把你输入的任何两数中的较小的一个检出并打印出来。
注意,在语句20中可省略去THEN 语句及冒号。
☆数据转换
在执行过程中,使用的每个数都必须属于某种类型:整型、单精度型或双精度型 。这种分类常常包
含着数从一种类型到另一种类型的转换。它可能产生意外的混乱的结果─除非你了解这种自动分类
和类型转换所遵循的规则。
☆类型转换
常数是LEVEL ⅡBASIC 执行过程中实际使用的数字(不是变量名称)。它们可以出现在你的程序中
(如X=1/3的等式右边),或者它们可能是在计算同一个表达式过程中产生的临时的(中间的)常数,
下面的规则决定了怎样确定一个常数的类型:
1) 如果一个常数包含8位以上数字,或者用D表示成指数形式,那末此数作为双精度型存储。加有一个
说明符#的常数也按双精度存储。
2) 如果一个数不是双精度型,但是它超过了-32768到32767的范围,或者它包含有小数点,那末此数
作为单精度存储。如果一个数用指数符号E来表示,此数也为单精度数。
3) 如果常数既不是Ⅰ也不是Ⅱ的情况,那末它作为整型存储。
例如:
10 PRINT 1.234567,1.2345678
RUN
1.23457 1.2345678
READY
┃
第一个常数含有7位,因此根据规则Ⅰ和Ⅱ,它成为单精度数,其最小有效位四舍五入。但第二个常数
有8位,因此根据规则Ⅰ,它成为双精度数,内部存储为1.2345678000000000,打印出的数字为8位有
效数,后边的零不打印出来。
☆常数的分类
当用一个或两个数进行运算时,其结果必然被分为整型,双精度型或单精度型。
在进行+、-或*运算时,其结果的精度与最高精度运算量的精度相同。例如,如果一个运算量是单
精度的,另一个是双精度的,其结果也是双精度的。只有两个运算都是整型时,其结果才是整型。如
果一个整型数经*,-或+运算后其结果超出了整型的范围,那末运算将以单精进行,其结果也以单
精度结果。
在比较运算中(<,>,=等等),运算量在比较以前都转换成相同类型,低精度类型总是转换成高
精度类型
如果你应用逻辑算符作按位(bit)运算或布尔(boolean)运算(见第八节逻辑运算符),请阅读下一
节,否则就跳过去,不去读它。
逻辑算符AND,OR和NOT ,首先将它们的运算量转换成整数形式。如果有一个运算量超出了整数的允许范
围(-32768到+32767),就产生溢了错误。逻辑运算的结果总是整数。
☆类型转换对精度的影响
当一个数转换成整型时,它是被“舍入”,就是取不大于此数的最大整数(这与求该数的INT函数获得
的结果一样)。
当一个数从双精度转换成单精度时,它四舍五入(当最低有效位后的尾数大于等于5时,最低有效位加1,
否则不变)。
在下述举例中,请记住:单精度变量是以7位精度存储的,但只印出6位(作适当的四舍五入)。同样,
双精度变量以17位存储,但只印出16位。
程序举例:
10 A#=1.666666666666667
20 B!=A#
30 C%=A#
40 PRINT B!,C%
RUN
Δ1.66667
READY
┃
………………………………………………………………………………
当一个单精度数转换成双精度数时,只有7个有效位是精确的。如果单精度数没有7位有效数,要警惕!
(会引入一定的误差,见下例-译者注)
例:
10 A!=1.3
20 A#=A!
30 PRINT A#
RUN
Δ1.29999952316284
RDADY
┃
………………………………………………………………………………
10 A#=2/3
20 PRINT A#
RUN
Δ.6666666865348816
READY
┃
2/3被转换成单精度常数(整数的除法以单精度进行-译者注),因此A#只有前边的7位是精确的。
………………………………………………………………………………
10 A#=2/3#
20 PRINT A#
RUN
Δ.6666666666666667
READY
┃
由于表达式2/3#是按双精度常数计算的,所以A#的所有16位都是精确的,最低有效位已正确地作了
四舍五入。
当给一个双精度变量赋予常数时,一定要包括尽可能多的有效位(直到17位),如果常数低于7位有效
数,最好使用单精度。
例如:
10 PI#=3.1415926535897932
20 E#=2.7182818284590452
|