6.Object Pascal 语句
语句由语句定义符和表示操作内容的表达式构成。语句的功能是控制程序的执行或控制编译系统的工作。
复合语句是由begin和end括起来的若干个简单语句、结构语句和复合语句;
复合语句允许多层嵌套;
空复合语句是在begin和end之间没有其他语句的语句;
6.1声明语句
常量与变量的声明语句在前面已经介绍,这里就其他声明语句进行介绍。
1.标号声明语句
标号声明语句就是用来表示程序的某个执行语句,程序中可以用goto语句跳转到标号语句。
一行标号声明语句可以同时声明多个标号。标号声明语法:
label <标号1>, <标号2>, ......;
代码示例:
program d0201; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; label loop, last; Var i, s: integer; begin s := 0; i := 1; loop: s := s + i; i := i + 1; if i > 100 then goto last else goto loop; last: write(s); sleep(3000); end.
在示例代码中,通过goto语句和label结合实现了一个从1加到100的功能。
2.类型声明语句
在Object Pascal中,变量必须具有数据类型,虽然Object Pascal中已经预先定义了丰富的数据类型,但它允许定义新的数据类型,类型声明语句格式:
Type <类型1> = ......; <类型2> = ......; ......; <类型n> = ......;
如:
type MyArr = Array[1..10] of Integer;
上面的语句定义了一个新的数据类型MyArr。
3.过程声明语句
过程也称为子程序,是一段相对独立的代码,其整体上实现某一特定的功能,在完整的程序中它被当作一条语句来执行。过程声明的语法格式:
Procedure <过程名>([参数列表]);
其中:参数列表格式为:
<参数名1>: <参数类型>, <参数名1>: <参数类型>, ......, <参数名n>: <参数类型>
4.函数声明语句
函数与过程类型,主要区别在于函数具有返回值。函数声明的语法格式:
Fuunction <函数名>([参数列表]);
6.2赋值语句
变量在使用之前必须赋值,赋值语句的格式:
<变量名> := <表达式>;
赋值号 ':=' 将右端的表达式的计算结果赋值给指定的变量名。注意:表达式结果与变量类型的兼容性。
类型兼容是指数据类型不完全相同的量之间能进行的运算和赋值操作,对于不符合赋值兼容的语句则不能通过编译。
6.3顺序结构程序
顺序结构是程序设计中最简单、最常用的结构。在顺序结构中语句按照出现的先后顺序依次执行。顺序结构程序通常由若干个赋值语句或其他简单语句构成。
示例:给定三角形的三条边长,计算三角形的面积。
代码如下:
program d0202; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var a, b, c, d, s: Real; begin a := 2; b := 3; c := 4; d := (a + b + c) / 2; s := sqrt(d * (d - a) * (d - b) * (d - c)); writeln(s); sleep(3000); end.
6.4条件语句与选择结构
条件语句是根据表达式的值有选择地执行其中一组语句,在Object Pascal中有 if 语句和 case 语句两种。
1. if 语句
语法格式:
if <条件> then <语句1> [else <语句2>];
其中:
-
<条件> 是 关系表达式或布尔表达式;如果条件为真,则执行语句1,否则执行语句2;
-
else保留字之前没有分号,因为if ... then ... else是一个完整的语句
-
<语句>可以是简单语句也可以是复合语句
-
if 语句可以嵌套
示例:货物征税:价格在10000元以上征税5%;价格在5000以上10000以下征税3%;5000以下1000以上征税2%,1000元以下免税,输入价格输出应征税金。
代码如下:
program d0203; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; Var p, s: real; begin write('Please input price:'); read(p); if p >= 10000 then s := p * 0.05 else if (p >= 5000) and (p < 10000) then s := p * 0.03 else if (p >= 1000) and (p < 5000) then s := p * 0.02 else s := 0; writeln(s:0:2); sleep(3000); end.
2. case 语句
在Object Pascal中,case语句专门用来处理多分支选择结构,case语句可以清晰直观地描述多路选择功能,其语法格式:
case <选择表达式> of <常量列表1>: <语句1>; <常量列表2>: <语句2>; ...... <常量列表n>: <语句n>; [else <语句n+1>] end;
其中:
-
<选择表达式>的类型必须是顺序类型;
-
<常量列表>是选择表达式可能的值,常量之间用逗号分隔,所有常量必须互不相同;
-
<语句>可以是简单语句也可以是复合语句
case语句首先计算<选择表达式>的值,然后判断与<常量列表>中哪一个常量相等,若相等则执行常量对应的语句,执行完后跳转到end后面继续执行。若与所有常量都不相等,则执行else后的语句。
示例:将上面的货物征税程序采用case语句来实现。
program d0204; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var p, s: real; begin write('Please input price:'); read(p); case trunc(p/1000.0) of 0: s:=0; 1,2,3,4: s:= p*0.02; 5,6,7,8,9: s:= p*0.03; else s:=p*0.05; end; writeln(s:0:2); sleep(3000); end.
6.5循环语句与循环结构
Object Pascal提供了三种循环语句:while、repeat和for语句。
1.while语句(前测型循环结构)
while语句的语法格式:
while <条件> do [<循环体>];
其中:循环体可以是简单语句,也可以是复合语句。
while循环先计算条件的值,如果条件为真,则执行do后面的循环体,执行完后再次计算条件;如果条件为假,则终止循环。执行循环的最少次数是0。
示例:计算从1~100的累加和
program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var i, sum: Integer; begin i := 1; sum := 0; while i<=100 do begin sum := sum + i; i := i + 1; end; write(sum); sleep(3000); end.
2.repeat 语句(后测型循环结构)
repeat语句语法格式:
repeat [<循环体>] until <条件>
其中:循环体可以是一条语句,也可以是多条语句,多条语句的情况下不需要使用begin...end括起来,而由保留字repeat和until将其括起来。
repeat循环首先执行循环体,然后判断条件,如果条件为假,则继续执行循环体,如果条件为真,则终止循环。循环执行的最少次数为1。
示例:计算两个数的最大公约数。
program d0206; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var m, n, t, r: integer; begin m := 120; n := 9; repeat r := m mod n; m := n; n := r; until r = 0; write(m); sleep(3000); end.
3.for语句(计数循环结构)
for语句语法格式:
for <循环变量> = <初值> {to|downto} <终值> do [<循环体>];
其中:
-
循环变量也称为循环计数器,只能是顺序类型;
-
初值和终值表示循环变量的初值和终值,可以是表达式,但应与循环变量的类型相同,若为表达式,在进入循环之前应具有确定的值。
-
在循环体中改变初值或终值表达式中变量的值,并不影响循环的次数。
-
to是递增,downto是递减
-
循环体可以是简单语句,也可以是复合语句。
for循环首先判断循环变量的值是否超过终值,若已经超过则跳出循环,若未超过则执行循环体,然后循环变量自动增量。这里的超过是指在递增的情况下大于,在递减的情况下小于。
示例:计算从1~100的累加和
program d0207; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var i, sum: integer; begin sum := 0; for i := 1 to 100 do sum := sum + i; write(sum); sleep(3000); end.
4.循环嵌套
循环语句的循环体中如果没有其他循环语句称为单重循环;如果在循环体中包含另一个循环,则称为多重循环。
示例:”百钱买百鸡“
每只公鸡值5元,每只母鸡值3元,三只小鸡值1元,现有100元买100只鸡,问公鸡、母鸡、小鸡各买几只?
程序运行效果如下:
属性设置:
对象 | 属性 | 属性值 |
---|---|---|
Form1 | Caption | 百钱买百鸡 |
Lable1 | Caption | 每只公鸡值5元,每只母鸡值3元,三只小鸡值1元,现有100元买100只鸡,问公鸡、母鸡、小鸡各买几只? |
WordWrap | True | |
Label2 | Caption | 公鸡 |
Label3 | Caption | 母鸡 |
Label4 | Caption | 小鸡 |
Memo1 | Name | Memo1 |
Button1 | Caption | 计算 |
Button2 | Caption | 清除 |
代码如下:
// 计算按钮事件处理 procedure TForm1.Button1Click(Sender: TObject); var x, y, z: integer; p: string; begin memo1.Clear; for x := 0 to 19 do for y := 0 to 33 do begin z := 100 - x - y; if 5*x + 3*y + z/3 = 100 then begin p := format('%3d %3d %3d', [x, y, z]); memo1.Lines.Add(p); end; end; end; // 清除按钮事件处理 procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Text := ''; end;
5.中断循环
在某些情况下,需要中断循环,可以使用break或continue语句。
-
break 语句,退出整个循环,执行循环体之外的语句;
-
continue语句,退出本次循环,然后判断条件决定是否进行下一次循环
通常情况下,break和continue放在if语句中使用。
示例:计算并输出从1开始不能被3整除的正整数,并对这些正整数求和,要求和不能大于32767。
program d0209; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var i, sum: integer; begin i := 0; sum := 0; while True do begin i := i + 1; if i mod 3 = 0 then continue; writeln(i); sum := sum + i; if sum > 32767 then break; end; writeln(sum); sleep(3000); end.