第二章:PowerBASIC的基本语法
1. PowerBASIC中的基本数据类型
2. PowerBASIC中的变量和常量
a) PowerBASIC的变量
b) PowerBASIC的常量
3. 变量和常量的作用域
a) 定义全局变量和常量
b) 定义函数和过程的变量和常量
c) 使用不同作用域的变量和常量
4. PowerBASIC中的操作符和表达式
a) 算术操作符和表达式
b) 字符串操作符
c) 关系操作符
d) 逻辑操作符
e) 操作符的优先级
5. PowerBASIC中的控制结构
a) 条件语句
b) 分支语句
c) 跳转语句
d) 循环语句
6. PowerBASIC的示例代码
PowerBASIC中的基本数据类型
指针类型 指针类型 PTR,POINTER
整型 整型 INTEGER
长整型 LONG
四倍字长整型 QUAD
无符号整型 字节类型 BYTE
字节型 WORD
双字节型 DWORD
浮点类型 单精度类型 SINGLE
双精度类型 DOUBLE
扩展精度类型 EXT,EXTENDED
货币类型 货币类型 CUR,CURRENCY
扩展货币类型 CUX,CURRENCYX
字符串类型 字符串类型 STRING
定长字符串 STRING * X
ASCIIZ字符串类型 ASCIIZ,ASCIZ
字段类型 FIELD
COM变量 变体类型 VARIANT
GUID类型 GUID
对象类型 DISPATCH
PowerBASIC中的变量和常量
a) PowerBASIC的变量
在程序执行过程中,需要将数据存储在内存中,以便进行计算,这些存储数据的内存位置称为变量,每个变量都有一个:
1. 名称 – 变量包含的用于引用值的单词
2. 数据类型 – 确定变量可以存储的数据类型
变量可以不断地创建和清除,在定义它们的程序结束后,它们便不再包含任何值,并且可以在不同的时期保持不同的值。
在PB中,使用DIM语句声明变量,同时要提供一个变量名:
DIM Variablename AS TYPE
例如,要将变量num1声明为Integer,PowerBASIC中的声明应如下所示:
Dim num1 AS Intger
要给变量赋值,可以使用赋值操作符“=”,例如,要给变量strVB赋值PowerBASIC,可以编写以下语句:
Dim strVB AS STRING
strVB = “PowerBASIC”
b) PowerBASIC的常量
常量也可以用于存储值,在程序执行过程中,这些值恒定不变。PowerBASIC中许多内置常量,也可以创建自己的常量,在程序中定义了常量之后,便不能使用赋值语句更改或修改常量的值,如果试图这样做,运行程序时将出现错误。
通常,常量用于代替一些经常被使用的常数,常量常被用作转换因子。由于常量不允许用户在执行程序时更改值,因此对于希望保持不变的数据,是最安全的存储之处,使用常量的另一个好处在于长来年感的处理速度比变量快。
例如,如果应用程序执行算术计算,pi(3.1459)值可能会在计算中多次出现,pi值最好使用一个常量来表示,如果不愿意一次又一次输入3.14159这个值,可以定义一个名为pi的常量并使用pi值初始化它。
在PowerBASIC中,使用以%开头的关键符号来声明变量,声明时,需要提供常量的名称和值。声明常量的语句示例如下所示:
%CONST = 100
除用户定义的常量外,PowerBASIC还支持预定义的常量值,这些常量值称为“系统常量”,这些常量的常见示例有使用MSGBOX函数时出现在消息框中的按钮,例如,%MB_OK表示“确定”按钮,%MB_CANCEL表示“取消”按钮,%MB_RETRY表示“重试”按钮等等。
变量和常量的作用域
a) 定义全局变量和常量
全局变量是使用关键字Global在函数或过程外的通用声明部分创建的,赋给全局变量的值可在程序生命周期内供整个代码区域内的任何过程或函数使用,使用Global声明的变量在应用程序的任一部分都可见,分配给全局变量的内存在程序结束后才会被释放。
例如,要声明数据类型为INTEGER的全局变量COUNTER,可以在函数声明部分前编写以下语句:
Global Counter AS Integer
这样就将变量Counter声明为了全局变量。
b) 定义函数和过程的变量和常量
函数和过程级变量是使用LOCAL或DIM语句在实际要使用该变量的过程中创建的,在过程和函数级变量仅可用于定义它们的过程或函数,其他过程或函数不能访问这些变量的值,在该过程或函数结束后,变量将被清除,并释放分配给该变量的内存。下面给2个例子:
LOCAL Counter AS INTEGER
DIM Counter AS INTEGER
c) 使用不同作用域的变量和常量
理想的状态是,一个应用程序中的任意两个变量或常量都能不具有相同的名称,但是,如果需要使用2个同名的变量或常量,则需要注册不要在同一级或同一作用域内声明同名的2个变量。
PowerBASIC中的操作符和表达式
1. 算术操作符和表达式
算术运算进行普通的数学运算。有几个操作符值得一说。斜线表示整除。整除将操作数四舍五入为整数,结果为没有余数的商。
例如,5\2的值为2,9\10的值为0。当使用整数类型的变量或表达式时,整除比浮点除的速度要快得多。
整除的余数可用取模操作 MOD(取模操作对所有的数字类型都有效)得到。取模操作与整除相似,不同的是返回值为余数,而不是商。
例如:5 MOD 2 返回值1,9 MOD 10 返回值9。
ISTRUE 操作只有在操作数为真(非零值)时返回真值。如果ISTRUE的值为零,保证返回 -1 ,但是运算可以返回任意非零值。ISFALSE 操作只有在操作数为假(零)的情况下返回真值。如果ISFALSE的值为零,ISFALSE保证返回值为 -1 ,但是运算可以返回任意非零值。
在进行运算和赋值的时候,PowerBASIC不检测数字溢出或溢出错误,请参阅错误和错误捕获的相关章节以获得更多信息。
操作符 说明 示例
^ 求幂 10^4
- 求反 -16
* 乘 45 * 19
/ 浮点除 45 / 19
\ 整除 45 \ 19
MOD 求模 45 MOD 19
+ 加 45 + 19
- 减 45 - 19
2. 字符串操作符
串 字符 VB表示语法 含义
--------------------------------------------------------------------
$NUL CHR$(0) vbNullChar Null
$BEL CHR$(7) Bell BEEP
$BS CHR$(8) vbBack 退格符
$TAB CHR$(9) vbTab 水平Tab符
$LF CHR$(10) vbLf 换行符(无回车);
$VT CHR$(11) vbVerticalTab 垂直Tab 符
$FF CHR$(12) vbFormFeed 换页符
$CR CHR$(13) vbCr 回车符(无换行)
$CRLF CHR$(13,10) vbCrLf 回车/换行符组合
$EOF CHR$(26) End-of-File
$ESC CHR$(27) Escape
$SPC CHR$(32) 空格
$DQ CHR$(34) 双引号
STRREVERSE$ function - STRREVERSE$ 函数
用途: 颠倒字符串表达式中的内容。
语法:s$ = STRREVERSE$ (sMain$)
示例:a$ = STRREVERSE$ ("powerbasic ")
返回:cisabrewop
STRINSERT$ function - STRINSERT$ 函数
用途:将一个字符串插入到另一个字符串中的指定位置。
语法:a$ = STRINSERT$ (sMain$, sNew$, position&)
备注:返回一个包含 sMain$ 的字符串,并且 sNew$ 插入到新字符串中 position$ 指定的位置。如果 position& 大于 sMain&的长度,sNew& 将附加到 sMain$ 的尾部。字符串中第一个字符的位置为1。
示例:a$ = STRINSERT$ ("PowerBASIC", "ful", 6)
返回:PowerfulBASIC
STRDELETE$ function - STRDELETE$ 语句
用途: 从字符串表达式中删除指定数量的字符。
语法:s$ = STRDELETE$ (string_expression, start&, count&)
备注:返回字符串表达式 string_expression 的一份拷贝,但是从 start& 位置开始的 count& 个字符已被删除。字符串表达式中的第一个字符的位置为1。
参见:STRINSERT$, STRREVERSE$
示例:a$ = STRDELETE$ ("PowerBASIC", 4, 2)
此时,变量a$中包含的字符为 PowBASIC。
MID$ 函数
用途:返回文本的某个部分。
语法:s$ = MID$ (string_expression, start& [, length&])
备注:
a$ = MID$ ("PowerBASIC", 4, 2) ' returns "er"
a$ = MID$ ("PowerBASIC", 4) ' returns "erBASIC"
a$ = MID$ ("PowerBASIC", 4, 20) ' returns "erBASIC"
a$ = MID$ ("PowerBASIC", 20) ' returns a null string
a$ = MID$ ("1234567890",3,-4) ' returns "345678"
UCASE$ 函数
用途:返回文本的大写字母。
语法:s$ = UCASE$ (string_expression)
备注:
x$ = UCASE$ ("Beware of cats!")
Result BEWARE OF CATS!
FORMAT$ 函数
用途: 返回格式化文本。
语法: x$ = FORMAT$ (num_expression [, [digits& | fmt$]])
备注:
A$ = FORMAT$< /FONT > (123456, "00\:00\:00") ' 12:34:56
USING$ 函数
用途:返回格式化文本。
语法:sResult$ = USING$(fmtmask$掩码, expr表达式 [, expr [, ...]])
备注:a$ = USING$ ("!", "abc") ' returns "a"
a$ = USING$ ("You owe $$#,.##", 12345.67@)' returns "You owe $12,345.67
DIM p AS BYTE PTR
HOST ADDR "localhost" TO ip&
p = VARPTR(ip&)
a$ = USING$ ("#_.#_.#_.#", @p, @p[1], @p[2], @p[3])' returns "127.0.0.1"
a$ = USING$ ("&=#.##############", "Pi", ATN(1)*4)' returns "Pi=3.14159265358979"
a$ = USING$ ("!", "AX", "BX", "CX")' returns "ABC"
a$ = USING$ ("$#.##_,", 1,20,300,4)' returns "$1.00,$20.00,$300.00,$4.00,"
a$ = USING$ ("$*=#####.##_,",1,20)' returns "$======1.00,$=====20.00,"
BIN$ 函数
用途:返回一个整数的二进制文本。
语法: s$ = BIN$ (numeric_expression [, digits])
备注: a$ = BIN$ (65535) ' = "1111111111111111"
STR$ function - STR$ 函数
用途:将数字转换成可以用来显示的字符串形式。
语法:s$ = STR$ (数字表达式,[,位数])
注释:STR$ 函数返回数字变量或表达式的字符串表现形式。"位数"是个可选的整型表达式,用来指示出现在结果中的数字的最大数。
如果"数字表达式"大于等于0,STR$ 将添加空格前导符;如果"数字表达式"小于0,STR$ 将添加"-"前导符。句个例子,STR$(14)返
回包含三个字符的字符串,第一个字符是空格,第二个是"1",第三个是"4"。可以使用 LTRIM$ 去掉字符串前边的空格。"位数"指
定结果中数字的最大位数(1-18)。
示例: 如下代码可以显示变量 a& 的值,直接使用 MSGBOX a& 则在编译时会提示错误。
FUNCTION PBMAIN () AS LONG
a& = 2
MSGBOX STR$ (a&)
END FUNCTION
OCT$ 函数
用途:返回一个数值的八进制文本。
语法:s$ = OCT$ (numeric_expression [, digits])
备注:
a$ = OCT$ (65535) ' a$ contains "177777"
x& = VAL("&Q" + a$) ' Signed result (-1)
y& = VAL("&Q0" + a$) ' Unsigned result (65535)
ACODE$ function -ACODE$ 函数
用途:将一个 Unicode 字符串转换为 ANSI 字符串。
语法:a$ = ACODE$ (UnicodeStrExpression)
备注:Unicode 字符串中一个字符占用两个字节,而 ANSI 字符串(本地 PowerBASIC 字符串格式)中一个字符占用一个字节。
可见,ACODE$ 返回的字符串占用的字节数为 Unicode字符串的一半,但仍提供相同数量的字符。要将 ANSI 字符串转换为
Unicode 字符串,请使用 UCODE$ 函数。
HEX$ 函数
用途:返回一个数值的十六进制文本。
语法:
a$ = HEX$ (65535) ' a$ will contain "FFFF"
x& = VAL("&H" + a$) ' Signed result (-1)
y& = VAL("&H0" + a$) ' Unsigned result (65535)
备注:
DIM a AS DWORD, b AS STRING, c AS QUAD
a = &H0FFFFFFFF ' Unsigned literal
b = HEX$ (a) ' "FFFFFFFF"
c = a ' 4294967295
b = HEX$ © ' "FFFFFFFF"
c = VAL("&H" + b) ' -1&& (signed conversion)
b = HEX$ © ' "FFFFFFFF"
c = VAL("&H0" + b) ' 4294967295&&
b = HEX$ © ' "FFFFFFFF"
VAL 函数
用途:从文本返回十进制数值。
语法:y = VAL (string_expression)
备注:
i& = VAL ("10.101e3") ' 10101 ~ 10.101*(10^3)
j& = VAL ("2D4") ' 20000 ~ 2 * (10 ^ 4)
i& = VAL ("&HF5F3") ' Hex, returns -2573 (signed)
j& = VAL ("&H0F5F3") ' Hex, returns 62963 (unsigned)
x& = VAL ("&B0100101101") ' Binary, returns 301 (unsigned)
y& = VAL ("&O4574514") ' Octal, returns 1243468 (signed)
Price$ = "$ 15,345.92"
Cost@@ = VAL(REMOVE$(Price$, ANY "$, "))
Result 15345.92
3. 关系操作符
操作符 说明 示例
< 小于 If num1 < num2 then …
> 大于 If num1 > num2 then …
= 等于 If num1 = num2 then …
>= 大于等于 If num1 >= num2 then …
<= 小于等于 If num1 <= num2 then …
<> 不等于 If num1 <> num2 then …
4. 逻辑操作符
操作符 说明 示例
ISFALSE Boolean False ISFALSE 45
ISTRUE Boolean True ISTRUE 19
NOT, AND 二进制处理运算 NOT 0, 45 AND 19
OR, XOR 45 OR 19, 45 XOR 19
EQV, IMP 45 EQV 19, 45 IMP 19
5. 操作符的优先级
算术 比较 逻辑
指数运算(^) 相等(=) Not
负数(-) 不相等(<>) And
乘法和除法(*,/) 小于(<) Or
整数除法(\) 大于(>) Xor
求模运算(Mod) 小于等于(<=) Eqv
加法和减法(+,-) 大于等于(>=) Imp
字符串连接(&) IS
PowerBASIC中的控制结构
1. 条件语句
IF语句
测试一个条件,仅在条件为真时执行一条或多条语句。
语法:
IF integer_expression THEN {sub | label | statements} [ELSE {sub | label | statements}]
注释:
如果integer_expression(整数表达式)为真(计算结果为非0值),在THEN后的语句被执行,在ELSE后的语句不被执行。
如果 integer_expression为假(0),在THEN后的语句不被执行,在ELSE后的语句被执行。倘若ELSE子句被忽略,并且
integer_expression的值为假,就跳转到程序的下一行执行。
integer_expression常常会是一个关系操作的结果,如下所示:
IF Income > Expenses THEN x$ = "OK!" ELSE x$ = "Uh-oh"
integer_expression 也可以是一个布尔值(boolean)。举个例子:
IF BeepOn THEN BEEP
等效于:
IF BeepOn <> 0 THEN BEEP
integer_expression 能够包含逻辑运算符AND 和 OR:
IF (a = b) AND (c = d) THEN x$ = "They are equal label"
如果标签(label)被指定,那么标签就必须出现在和IF语句所在的同一子程序(Sub)或函数(Function)内部。
GOTO关键字是THEN的含蓄的意思,能够替换THEN:
IF EOF(1) THEN GotFile
IF EOF(1) GOTO GotFile
proc
如果proc被指定,它必须是子程序或函数。
IF语句和他所有的关联语句包括后面的ELSE,必须出现在同一个逻辑程序行。下边的语句是不合法的:
IF a < b THEN t = 15 : u = 16 : v = 17
ELSE t = 17 : u = 16 : v = 15
因为编译器将ELSE语句视为一个崭新的语句,与上边的任何语句都没有关系。如果你需要在同一行安排更多语句,
你可允褂眯醒有禄摺癬”,将一个逻辑行展开跨越到几个物理行。举例,下边是个合法的途径来重新描述上边的例子:
IF a < b THEN t = 15 : u = 16 : v = 17 _
ELSE t = 17 : u = 16 : v = 15
编写长和复杂IF/THEN结构的更好的方法是使用IF块
示例:
1. IF x > 100 THEN y = 3 ELSE y = 4
2. IF x = 0 then
Msgbox “x为0正确!”
Else
Msgbox “x不为0!”
End if
2. 分支语句
下面是SELECT CASE语句的语法结构:
SELECT CASE [AS] [LONG | CONST | CONST$] expression
CASE [IS] testlist
{statements}
[CASE [IS] testlist
{statements}]
[CASE ELSE
{statements}]
END SELECT
示例代码:
DIM Dwrd AS DWORD
DIM Lint AS LONG
Dwrd = &H0FFFFFFFF???
Lint = -1&
SELECT CASE Lint
CASE Dwrd
a$ = "A Match!"
CASE ELSE
a$ = "*No Match"
END SELECT
SELECT CASE AS LONG Lint
CASE Dwrd
a$ = "*A Match!"
CASE ELSE
a$ = "No Match"
END SELECT
SELECT CASE AS CONST Dwrd
CASE -1&
a$ = "*A Match!"
CASE 0
a$ = "No Match"
END SELECT
3. 跳转语句
使用跳转语句可以将程序的控制转移到过程中的其他点,与循环结构不同,跳转就像单程票。
这是因为它可以将控制转移到过程中的一个点,但不能使其返回到起始点。
下面是ON GOTO语句的原型:
ON n GOTO {label | line_number} [, {label | line_number}] ...
示例:
SUB Main
FOR I& = 1 TO 3
ON I& GOTO OneHandler, TwoHandler, ThreeHandler
Back:
NEXT I&
EXIT SUB
OneHandler:
Message$ = "Handler number" + STR$(I&)
GOTO Back
TwoHandler:
Message$ = "Handler number" + STR$(I&)
GOTO Back
ThreeHandler:
Message$ = "Handler number" + STR$(I&)
GOTO Back
END SUB
下面是ON ERROR …GOTO语句的原型:
ON ERROR GOTO {label | line_number}
ON ERROR RESUME NEXT
ON ERROR GOTO 0
示例就不写了。。。这个好理解
4. 循环语句
循环结构使得能够重复执行一行或多行代码,PowerBASIC支持以下几种循环结构
1. FOR…NEXT
原型:
FOR Counter = start TO stop [STEP increment]
. {statements}
NEXT [Counter [, [Counter]] ...]
示例:
FOR n# = 1.0 TO 1.5 STEP 0.1
x$ = STR$(n#)
NEXT n#
2. WHILE…WEND
原型:
WHILE integer_expression
{statements}
[EXIT LOOP]
{statements}
WEND
示例:
i& = 0
WHILE ISFALSE EOF(1)
INCR i&
LINE INPUT #1, FileTxt$(i&)
WEND
3. DO…LOOP
原型:
DO [{WHILE | UNTIL} expression]
{statements}
…
[EXIT LOOP]
[ITERATE LOOP]
...
LOOP {{WHILE | UNTIL} expression}
示例:
Count1 = 0
DO WHILE Count1 < 10
FOR Count2 = 0 TO 1
x = arry(Count1,Count2)
Count1 = Count1 + 1
NEXT Count2
LOOP
PowerBASIC的示例代码
我们根据这期所学的知识来做个示例:
问题:百元买鸡问题,假设小鸡每只五角,公鸡每只三元,现在有一百元买一百只鸡,编写程序列出所有的购买方案
我们做了如下回答:
#COMPILE EXE
#DIM ALL
#include "Win32api.inc"
function Calculate() as long
Dim x as INTEGER
dim y as INTEGER
dim z as INTEGER
for x = 0 to 100
for y = 0 to 100
for z = 0 to 100
if (x + y + z = 100) and ((3*x + 2*y + 0.5*z) = 100) THEN
msgbox "母鸡:" + str$(x) + " 公鸡:" + str$(y) + " 小鸡:" + str$(z) , 32,"可能的购买方案"
END IF
NEXT
NEXT
NEXT
END FUNCTION
FUNCTION PBMAIN () AS LONG
Call Calculate()
END FUNCTION