1、一、一、PASCAL语言基础知识语言基础知识二、二、结构化程序设计结构化程序设计三、三、数组与字符串数组与字符串四、四、函数与过程函数与过程五、五、递归递归三、三、PASCAL数据类型数据类型PascalPascal数据类型数据类型 简单类型简单类型构造类型构造类型指针类型指针类型 三、三、PASCAL数据类型数据类型1.1.整型整型 类型类型 数值范围数值范围shortint(短整型)-128.128integer(整型)-32768.32767 longint(长整型)-2147483648.2147483647 byte(字节型)0.255 word(字类型)0.65535 三、三、PA
2、SCAL数据类型数据类型2.实型实型 类型类型 数值范围数值范围real (基本实型)2.9e-39.1.7e38single(单精度实型)1.5e-45.3.4e38double(双精度实型)5.0e-324.1.7e308三、三、PASCAL数据类型数据类型3.3.布尔型布尔型 boolean false true01逻辑真逻辑真逻辑假逻辑假三、三、PASCAL数据类型数据类型4.字符型字符型 char 字符型的值必须用字符型的值必须用单引号括起来单引号括起来,字字母作为字符型的值时,大小写是不等母作为字符型的值时,大小写是不等价的,价的,并且字符型只允许单引号中有并且字符型只允许单引号中
3、有一个字符,否则就是字符串。一个字符,否则就是字符串。例:例:var var c:char;c:char;c:=a c:=a四、常量与变量四、常量与变量1.1.常量常量(1)(1)常量:在某个程序的整个过程中其值不变的量。常量:在某个程序的整个过程中其值不变的量。(2)(2)常量定义:常量定义出现在说明部分。语法格式:常量定义:常量定义出现在说明部分。语法格式:constconst常量标识符常量标识符1=1=常量值常量值1;1;.常量标识符常量标识符n=n=常量值常量值n;n;常量标识符的类型由定义它的常量的类型决定。常量标识符的类型由定义它的常量的类型决定。ConstConst pi=3.1
4、416;pi=3.1416;a=10;a=10;c=c;c=c;t=true;t=true;四、常量与变量四、常量与变量2.2.变量变量(1)(1)变量:在某个程序的运行过程中变量:在某个程序的运行过程中其值可以发生改变的量其值可以发生改变的量(2)(2)变量说明:变量说明出现在说明部分。语法格式:变量说明:变量说明出现在说明部分。语法格式:varvar变量标识符列表变量标识符列表:类型类型;.变量标识符列表变量标识符列表:类型类型;varvara,b,c:integera,b,c:integer;m,n:real m,n:real;五、运算符和表达式五、运算符和表达式1.运算符运算符a.算术
5、运算符算术运算符运算符运算运算对象结果类型运算符运算运算对象结果类型+加加 整型、实型只要有一个运算对象是实型,结果就整型、实型只要有一个运算对象是实型,结果就-减减 整型、实型是实型,如果全部的运算对象都是整整型、实型是实型,如果全部的运算对象都是整*乘乘 整型、实型型并且运算不是除法,则结果为整型,整型、实型型并且运算不是除法,则结果为整型,/除除 整型、实型若运算是除法,则结果是实型。整型、实型若运算是除法,则结果是实型。div 整除整除 整型整型整型整型mod 取余取余 整型整型整型整型 5 div 3=15 mod 3=2 五、运算符和表达式五、运算符和表达式b.逻辑运算符逻辑运算符
6、 运算符运算符运算运算运算对象运算对象结果类型结果类型not 逻辑非布尔型布尔型逻辑非布尔型布尔型and逻辑与布尔型布尔型逻辑与布尔型布尔型or 逻辑或布尔型布尔型逻辑或布尔型布尔型 xor 逻辑异或逻辑异或 布尔型布尔型 布尔型布尔型 not(非)条件为True时,其结果值为False;否则为True;(取反)not(34)and(与)两条件都为True时,其结果值为True;否则为False;or(或)两条件中只要有一个为True;其结果值为True;否则为False;xor(异或)两条件的逻辑值不相同时,其结果值为True;否则为False;五、运算符和表达式五、运算符和表达式 c.关系
7、运算符关系运算符运算符运算符运算运算运算对象运算对象结果类型结果类型=等于简单类型布尔型等于简单类型布尔型 不等于不等于 简单类型布尔型简单类型布尔型大于简单类型布尔型大于简单类型布尔型=大于等于大于等于 简单类型布尔型简单类型布尔型 运算符优先级运算符优先级:not*,/,div,mod,and xor,+,-,or in,=,=,=五、运算符和表达式五、运算符和表达式2.表达式表达式(1)通过运算符把常量、变量、函数调用)通过运算符把常量、变量、函数调用结合起来组成的式子。结合起来组成的式子。pipi*r r*r rSum+2Sum+2(xy)and(z=y)(xy)and(z=y)五、运
8、算符和表达式五、运算符和表达式(2)数学上的表达式与)数学上的表达式与pascal语言表达式的区别语言表达式的区别数学表达式数学表达式 PASCAL表达式表达式 注意注意 2a 2*a *号不能省略号不能省略 ab a/b 除号的写法除号的写法 ab ab 不等号的写法不等号的写法 ab a=b 小于等于号的写法小于等于号的写法 五、运算符和表达式五、运算符和表达式TrueTrueandandTrueTrue=TrueTrueTrueTrueFalsFalse eFalseFalseFalsFalse eTrueTrueFalseFalseFalsFalse eFalsFalse eFalse
9、FalsePascal中的逻辑运算:中的逻辑运算:五、运算符和表达式五、运算符和表达式TrueTrueororTrueTrue=TrueTrueTrueTrueFalseFalseTrueTrueFalseFalseTrueTrueTrueTrueFalseFalseFalseFalseFalseFalse第二节 结构化程序设计pascal程序的三种基本结构顺序结构顺序结构分支结构分支结构循环结构循环结构 (一一)、什么是顺序结构:、什么是顺序结构:【例【例1】:键盘输入两个变量的值,交换值后输出。】:键盘输入两个变量的值,交换值后输出。方法:间接交换法方法:间接交换法算法分析:(算法分析:(
10、“自顶向下,逐步求精自顶向下,逐步求精”的编程思想)的编程思想)s1:通过键盘给通过键盘给a,b两个变量赋值;两个变量赋值;s2:交换交换a,b的值;的值;s2-1:引入中间变量引入中间变量c;s2-2:在在c中存放的中存放的a值;值;s2-3:在在a中存放的中存放的b值;值;s2-4:在在b中存放的中存放的c值;值;s3:输出变量输出变量a,b的值。的值。程序代码:程序代码:program ex1;var a,b,c:integer;beginwrite(please input a,b:);read(a,b);writeln(a=,a,b=,b);c:=a;a:=b;b:=c;writel
11、n(a=,a,b=,b)end.一一 .顺顺序序结结构构程程序序设设计计Pascal 语言的语句分为简单语句(也称基本语句)和复合语句(也称构造语句)o(二二):几个简单语句:几个简单语句:o1赋值语句:赋值语句:o格式:变量标识符:格式:变量标识符:=表达式;表达式;o功能:计算和赋值双重功能:功能:计算和赋值双重功能:o【例2】写出程序执行后,变量的值。o程序代码:oprogram ex2;o varoa,b:integer;oc:real;och:char;obool:boolean;obegino a:=3;o b:=a;o b:=a+1;o a:=a+1;o c:=a+b;o ch:
12、=h;o bool:=true;o bool:=not bool;o end.o说明:1)“:=”赋值号不同于“=”号,具有方向性,具有计算功能。o 2)赋值号两边的类型应该相同。o 3)一个赋值语句只能给一个变量赋值,变量可以进行多次赋值。o 4)被赋值的变量可以作为因子参与运算。2输入语句(输入语句(read,readln):格式:格式:read(变量名表变量名表);readln read(a1,a2,a3);等价于等价于 read(a1);read(a2);read(a3);readln(a1,a2,a3);等价于等价于 read(a1);read(a2);read(a3);readln
13、;功能:通过键盘,给指定的变量赋值。功能:通过键盘,给指定的变量赋值。【例3】:写出程序运行后,变量的值。程序代码:program ex3;var a,b,c:integer;i,j,k:real;ch1,ch2,ch3:char;begin read(a,b,c);readln(i,j,k);read(ch1,ch2,ch3);writeln(a=,a,b=,b,c=,c);writeln(i=,i,j=,j,k=,k);writeln(ch1=,ch1,ch2=,ch2,ch3=,ch3);end.程序运行后,输入数据:1 2 3 4 56.1 7 8 9 0dos执行readln后多余的
14、数据将被忽略;执行read后多余的数据要么被忽略,要么被下一个read或readln语句所读入。o3输出语句(输出语句(write,writeln):):o格式:格式:write(输出项);(输出项);o writeln;o功能:按指定的格式将输出项的内容输出。功能:按指定的格式将输出项的内容输出。o【例【例4】:写出程序运行后的结果。】:写出程序运行后的结果。o程序代码:oprogram ex4;o constoa=10;ob=20;obegino writeln(50);o writeln(a);o writeln(a+b);o writeln(a+b=,a+b)oend.o说明:1)输出
15、项的内容可以是一项,也可以是若干项,各项之间用逗号分隔。o 2)当输出项为常量,直接输出常量的值;当输出项为变量时,输出该变量存储单元内的内容,变量允许属于任何一种标准数据类型;当输出项为表达式时,先计算后输出;当输出项为字符串时,原样输出单引号括起来的内容。501030a+b=301、定义:复合语句是由若干条语句组成的语句序列。形式:begin 语句1;语句2;语句nend;用保留字begin和end括起来,构成一条逻辑上的语句,语法上充当一条语句。(三三):复合语句:复合语句:二二.选择结构程序设计选择结构程序设计1if 语句:语句:格式:(1)if 条件 then 语句(2)if 条件
16、then 语句1 else 语句2 (3)if 语句嵌套if 条件1 then 语句11 else if 条件2 then 语句21 else 语句22;例:计算下列函数 y=Program p;Var x,y:real;begin read(x);if x0 then y=1 else y=0;writeln(y=,y);end.输入:5 输出:0 (x=0)1 (x0)-1 (x0)2case 语句:分情况语句(多分支语句)格式:case 表达式 of 常数表1:语句1;常数表2:语句2;常数表n:语句n;else 语句n+1 end;功能:先计算表达式的值,然后将表达式的值依次与各常数表
17、进行对照,当找到一个与表达式的值相匹配的常数表时,就去执行该CASE常数表后面的语句。说明:1)end 与case 对应 2)表达式的类型通常是整型、字符型 3)常量表是常量,其类型与表达式的类型要一致。常量表中的常量不能重复。通常将一组重复执行的语句称为循环体,而控通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部因此,重复语句是由循环体及重复终止条件两部分组成。分组成。FOR循环循环当循环当循环while直到直到repeat循环循环一、循环结构的三种形式:三三.循环结构程序设计循
18、环结构程序设计(一)for循环语句1 1forfor语句:(语句:(“计数循环计数循环”):就是将规定循环体重复执行的次数。):就是将规定循环体重复执行的次数。格式:格式:for for 控制变量:控制变量:=初值初值 to to 终值终值 dodo 循环体语句;循环体语句;for for 控制变量:控制变量:=初值初值 downto downto 终值终值 dodo 循环体语句;循环体语句;2、for语句执行过程语句执行过程 先将初值赋给左边的变量(称为循环控制变量);先将初值赋给左边的变量(称为循环控制变量);判断循环控制变量的值是否已判断循环控制变量的值是否已“超过超过”终值,如已超过,
19、则跳到步骤终值,如已超过,则跳到步骤;如果末超过终值,则执行如果末超过终值,则执行dodo后面的那个语句(称为循环体);后面的那个语句(称为循环体);循环变量递增(对循环变量递增(对toto)或递减(对)或递减(对downt o)downt o);返回步骤返回步骤;循环结束,执行循环下面的一个语句。循环结束,执行循环下面的一个语句。3 3、说明:、说明:1)1)初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、布尔型和字符型等顺序类型,不能为实型。布尔型和字符型等顺序类型,不能为实型。2 2)递增按)递增
20、按succsucc函数规律变化,递减按函数规律变化,递减按predpred函数规律变化,整型按数值大小变化,如函数规律变化,整型按数值大小变化,如果为字符型量,按果为字符型量,按ASCIIASCII码表的顺序计算。码表的顺序计算。3 3)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对控制变量进行赋值。控制变量进行赋值。4 4)当初值超过终值,不执行循环,循环次数为零。)当初值超过终值,不执行循环,循环次数为零。例:计算1+2+3+100之和var i,s:integer;begins:=0;for
21、i:=1 to 100 do s:=s+i;writeln(s);end.循环体:重复执行循环体:重复执行初值初值i:循环控制变量循环控制变量终值终值 (二)(二)while语句:语句:对于对于for循环有时也称为计数循环。循环有时也称为计数循环。适合用于事先知道循环次数适合用于事先知道循环次数.当循环次数未知,只能根据某一条件来决定是否进行循环时,用当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句实现循环要更方便。语句实现循环要更方便。(“当型循环当型循环”):当条件满足时反复执行循环体。):当条件满足时反复执行循环体。格式:格式:while 布尔表达式布尔表达式 d
22、o 语句语句;执行过程:执行过程:while语句的执行过程为:语句的执行过程为:判断布尔表达式的值判断布尔表达式的值,如果其值为真如果其值为真,执行步骤执行步骤2,否则执行步骤否则执行步骤4;执行循环体语句执行循环体语句(do后面的语句后面的语句);返回步骤返回步骤1;结束循环结束循环,执行执行while的下一个语句。的下一个语句。说明:说明:1)为了使)为了使while循环能正常终止,循环能正常终止,布尔表达式中的变量必须在循环体中的某布尔表达式中的变量必须在循环体中的某语句中有所改变,即有可能使布尔表达式的值为假,语句中有所改变,即有可能使布尔表达式的值为假,使循环结束,否则将使循环结束,
23、否则将出现死循环。出现死循环。2)循环体中的语句一般是多条语句,用)循环体中的语句一般是多条语句,用begin和和end使其成为一条复合语句。使其成为一条复合语句。引例:引例:求恰好使求恰好使s=1+1/2+1/3+1/n的值大于的值大于10时时n的值。的值。var s :real;n :integer;n分母分母begin s:=0;n:=0;while s=10 do当当s的值还未超过的值还未超过10时时 begin n:=n+1;分母分母1 s:=s+1/n;将下一项值累加到将下一项值累加到s end;writeln(n);输出结果输出结果end.repeat语句:(“直到型循环”):反
24、复执行循环体直到条件满足为止。格式:repeat 语句1;语句2;语句3;语句n until 布尔表达式;执行过程:先执行指定的语句序列,然后判断表达式。(三)repeat语句:(“直到型循环”)例】:输入若干个字符,它的终止符是#,计算输入的字符中a(A)出现的次数。program ex7;var ch:char;i:integer;begin i:=0;repeat read(ch);if(ch=a)or(ch=A)then i:=i+1;until ch=#;writeln(i=,i)end.三种循环语句的相同点与不同点FORFORWHILEWHILEREPEATREPEAT语句格式语句
25、格式FOR FOR :=TO TO DO DO WHILE WHILE DO DO REPEATREPEAT UNTIL UNTIL 循环变量循环变量赋值赋值布尔表达式布尔表达式无循环变量无循环变量循环次数循环次数确定,由初值和终值决定确定,由初值和终值决定不确定,由循环体前的布尔表不确定,由循环体前的布尔表达式决定,当值为达式决定,当值为“假假”时,结束循环。时,结束循环。可能一次循环也没有可能一次循环也没有不确定,由循环体后的布不确定,由循环体后的布尔表达式决定,当值尔表达式决定,当值为为“真真”时结束循环。时结束循环。至少有一次循环至少有一次循环循环体循环体多语句时,需用多语句时,需用B
26、EGINBEGIN和和ENDEND多语句时,需用多语句时,需用BEGINBEGIN和和ENDEND多语句时,不需用多语句时,不需用BEGINBEGIN和和ENDEND数 组一、为什么要使用数组:例例1输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩。分析:在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把50个学生的成绩都保留下来,然后逐个和平均分比较,把高于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存放这些数据,可想而知程序要很长且繁
27、。要想如数学中使用下标变量ai形式表示这50个数,则可以引入下标变量ai。这样问题的程序可写为:第三节 数组与字符串tot:=0;tottot:=0;tot表示总分表示总分 for i:=1 to 50 do for i:=1 to 50 do 循环读入每一个学生的成循环读入每一个学生的成绩,并累加它到总分绩,并累加它到总分beginbeginread(ai);read(ai);tot:=tot+ai;tot:=tot+ai;end;end;ave:=tot/50;ave:=tot/50;计算平均分计算平均分for i:=1 to 50 dofor i:=1 to 50 doif aiave
28、then writeln(No.,i,if aiave then writeln(No.,i,ai);,ai);如果第如果第i i个同学成绩小于平均分,则将输出个同学成绩小于平均分,则将输出而要在程序中使用下标变量,则必须先说明这些而要在程序中使用下标变量,则必须先说明这些下标变量的整体下标变量的整体数组,即数组,即数组是若干个同名数组是若干个同名(如上(如上面的下标变量的名字都为面的下标变量的名字都为a a)下标变量的集合下标变量的集合。二、一维数组二、一维数组当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。1、一维数组类型的定义、一维数组类型的定义 一维数组类型的一般格式:a
29、rray下标1.下标2 of;o我们可以说,数组是由固定数量的相同类型的元素组成的。如:type arraytype=array1.8of integer;var a1,a2:arraytype;或var a1,a2:array1.8of integer;一维数组应用示例例例 输入50个数,要求程序按输入时的逆序把这50个数打印出来。也就是说,请你按输入相反顺序打印这50个数。分析:我们可定义一个数组a用以存放输入的50个数,然后将数组a内容逆序输出。源程序如下:program ex5_1;type arr=array1.50of integer;说明一数组类型arrvar a:arr;i:i
30、nteger;beginwriteln(Enter 50 integer:);for i:=1 to 50 do read(ai);从键盘上输入50个整数readln;for i:=50 downto 1 do 逆序输出这50个数write(ai:10);end.二维数组o数组类型的定义中有两个下标类型二维数组类型的定义:ntype intarr=array 1.4 of integer;arr=array 1.5 of intarr;nvar a:arr;n变量a是一个二维的数组变量,它有5个分量,分别用a1,a2,a3,a4,a5表示,每个分量相当于一个一维的数组变量(有4个整型分量),通
31、过下标区分:a1,1,a1,2,a1,3,a1,4 a2,1,a2,2,a2,3,a2,4a3,1,a3,2,a3,3,a3,4 a4,1,a4,2,a4,3,a4,4a5,1,a5,2,a5,3,a5,4otype arr=array 1.5 of array 1.4 of integer;var a:arr;等价的定义方式:otype arr=array 1.5,1.4 of integer;var a:arr;或var a:array 1.5,1.4 of integera1,1 a1,2 a1,3 a1,4 a2,1 a2,2 a2,3 a2,4a3,1 a3,2 a3,3 a3,4
32、a4,1 a4,2 a4,3 a4,4a5,1 a5,2 a5,3 a5,4二维数组应用举例:例:例:输入输入4名学生数学、物理、英语、化学、名学生数学、物理、英语、化学、pascal五门课五门课的考试成绩,求出每名学生的平均分,打印出表格。的考试成绩,求出每名学生的平均分,打印出表格。分析:用二维数组分析:用二维数组a存放所给数据存放所给数据,第一下标表示学生第一下标表示学生的学号的学号,第二个下标表示该学生某科成绩,如第二个下标表示该学生某科成绩,如ai,1、ai,2、ai,3、ai,4、ai,5分别存放第分别存放第i号学生数学、物号学生数学、物理、英语、化学、理、英语、化学、pascal
33、 五门课的考试成绩五门课的考试成绩,由于要求每由于要求每个学生的总分和平均分,个学生的总分和平均分,所以第二下标可多出两列,分所以第二下标可多出两列,分别存放每个学生别存放每个学生5门成绩和总分、平均分。门成绩和总分、平均分。源程序如下:program ex5_4;var a:array1.4,1.7of real;i,j:integer;beginfillchar(a,sizeof(a),0);函数fillchar用以将a中所有元素置为0writeln(Enter 4 students score);for i:=1 to 4 do beginfor j:=1 to 5 do 读入每个人5科
34、成绩begin read(ai,j);读每科成绩时同时统计总分 ai,6:=ai,6+ai,j;end;readln;ai,7:=ai,6/5;求平均分 end;输出成绩表 writeln(No.Mat.Phy.Eng.Che.Pas.Tot.Ave.);for i:=1 to 4 do beginwrite(i:2,);for j:=1 to 7 do write(ai,j:9:2);writeln;end;end.字符串 字符串有常量形式和变量形式。字符串有常量形式和变量形式。把按一定顺序排列的字符数据叫做字符串,把按一定顺序排列的字符数据叫做字符串,表示方法是将字符放入单引号中表示方法是
35、将字符放入单引号中,字符,字符串个数叫做字符串的长度。串个数叫做字符串的长度。字符串变量可以用串类型标识符字符串变量可以用串类型标识符 stringn来表示。来表示。N取值在取值在1255之间。省略为之间。省略为255。定义格式定义格式:type 字符串类型名字符串类型名=string 最大长度最大长度;定义字符串变量格式是:定义字符串变量格式是:Var 字符串变量名:字符串类型名;字符串变量名:字符串类型名;也可以直接定义字符串变量,其格式为:也可以直接定义字符串变量,其格式为:Var 变量名:变量名:string最大长度最大长度;或或 变量名:变量名:string;字符串之间的运算:字符串
36、之间的运算:对字符串可以整体输入或输出,如:对字符串可以整体输入或输出,如:read(x);write(y);允许对串变量进行赋值,如:允许对串变量进行赋值,如:X:=abc;y:=x。可以对字符串进行连接运算,使用可以对字符串进行连接运算,使用+进行连接。如:进行连接。如:ho+me结果结果是:是:home。字符串之间可以进行关系运算:字符串之间可以进行关系运算:、=、=、=、。比较方法按比较方法按ASCII码一个字符一个字码一个字符一个字符比较。符比较。字符串函数(1)字符串测长函数)字符串测长函数格式:格式:length(s)功能:求字符串功能:求字符串S的长度,结果为整型。的长度,结果
37、为整型。(2)求子串函数)求子串函数格式:格式:copy(s,n,1);功能:在功能:在S串的第串的第N位开始截取位开始截取1位字符串。位字符串。(3)查找子串函数查找子串函数格式:格式:pos(b,s);功能:求子串功能:求子串b在在s中出现的起始位置,结果为整型,若未找到显示中出现的起始位置,结果为整型,若未找到显示0。(4)插入过程)插入过程格式:格式:insert(s1,s2,i);功能:将功能:将s1插入插入 s2中的第中的第i个字符位置,若结果超出个字符位置,若结果超出s2的最大长度,则超出的部分被截的最大长度,则超出的部分被截掉。掉。(5)删除过程)删除过程格式:格式:delet
38、e(s,I,n);功能:删除功能:删除s中第中第i个字符位置开始的个字符位置开始的n 个字符。个字符。(6)数值转换为字符串过程)数值转换为字符串过程格式:格式:str(v,s);功能:将数值功能:将数值V转换成字符串,存放在字符串变量转换成字符串,存放在字符串变量s中。中。(7)字符串转换为数值过程)字符串转换为数值过程格式:格式:val(s,v,c);功能:将数字串功能:将数字串s转换成数值转换成数值v,变量变量C记录检测出错的第一个字符的位置,当未出错时,记录检测出错的第一个字符的位置,当未出错时,C为为0。一、过程和函数统称子程序。子程序的执行过程第四节第四节 函数与过程函数与过程函数
39、(1)标准函数:)标准函数:我们已经接触过一些我们已经接触过一些Free Pascal提供一些内部标准函数,供编程时调用,提供一些内部标准函数,供编程时调用,象求象求|X|可调用可调用ABS(X),求可调用),求可调用SQRT(49)等等。实际上,这些函数是等等。实际上,这些函数是一些包含在一些包含在Free Pascal系统中供用户调用的程序模块,分别命名为:系统中供用户调用的程序模块,分别命名为:ABS,SQRT等。因而,只要在程序中遵照一定的调用规则,写出某一函数等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。名以及
40、此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如:如:ABS(X)SQRT(12+X)等等。等等。(2)自定义函数)自定义函数 系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸如求如求N!这一类的运算,系统中则没有提供相应的函数可供调用。为此,!这一类的运算,系统中则没有提供相应的函数可供调用。为此,Free Pascal允许用户自行定义一些函数,我们称之为自定义函数。这种自
41、允许用户自行定义一些函数,我们称之为自定义函数。这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:定义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:这些函数必须在程序中定义,也只能在本程序中使用。这些函数必须在程序中定义,也只能在本程序中使用。函数定义及调用函数定义及调用一、Pascal标准函数:abs(x)、sqr(x)、等二、用户自定义函数:函数定义的格式:function():;函数首部函数首部begin;:=;end;函数体函数体函数说明函数说明注:1)函数首部以关键字function开头。2)括号内为形式参数表,即形参表。3)函数的类型也就是函数
42、值的类型。4)函数的执行部分以begin开头,以end结束(end后有一个分号)。在执行部分,至少要有一条将函数值传给函数名的赋值语句,即::=;这样就由函数名将求得的函数值带回调用该函数的程序中。【例】求3!+5!+7!的值分析:可以先编写一个求n!的函数fac。Program exp7_1;程序首部 Var s,:real;x:integer;function fac(n:integer):real;函数首部函数值的类型是实型 var 局部变量说明 k,t:integer;begin t:=1;for k:=2 to n do t:=t*k;fac:=t;将结果赋值给函数 end;begi
43、n 主程序调用 s:=fac(3)+fac(5)+fac(7);writeln(s=,s)end.函数的调用函数的调用:可以在任何与函数值类型兼容的表达式中调可以在任何与函数值类型兼容的表达式中调用函数,或者说,函数调用只能出现在允许表达用函数,或者说,函数调用只能出现在允许表达式出现的地方,或作为表达式的一个因子。式出现的地方,或作为表达式的一个因子。函数函数调用方式与标准函数的调用方式相同。调用方式与标准函数的调用方式相同。函数调用的一般格式:函数调用的一般格式:函数名(实在参数表)函数名(实在参数表)说明:说明:实在参数简称实在参数简称实参实参。实参的个数必须与函数说明中形参的个数一致,
44、实。实参的个数必须与函数说明中形参的个数一致,实参的类型与形参的类型应当一一对应。参的类型与形参的类型应当一一对应。调用函数时,一般的,实参必须有确定的值。调用函数时,一般的,实参必须有确定的值。函数调用的步骤为:函数调用的步骤为:计算实参的值,计算实参的值,“赋给赋给”对应的形参对应的形参;函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。调用的自定义函数应在调用之前已定义过。调用的自定义函数应在调用之前已定义过。自定义函数中的形参,因不是实际存在的变量,故又称为虚拟变量,它自定义函数中的形参,因不是实际存在的变量,故
45、又称为虚拟变量,它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。实在参数表是一些由逗号分隔的参数,它们是在存放实在参数的值。实在参数表是一些由逗号分隔的参数,它们是在调用函数时所用的自变量。只有在调用函数时,才将实在参数的值传送到调用函数时所用的自变量。只有在调用函数时,才将实在参数的值传送到形参的临时内存单元中去。可见,形参实质上是实参的一个形参的临时内存单元中去。可见,形参实质上是实参的一个“替身替身”。【例】:计算右图五边形的面积。【例】:计算右图五边形的面积。program ex3;va
46、r b1,b2,b3,b4,b5,b6,b7,s:real;function area(a,b,c:real):real;varp:real;beginp:=(a+b+c)/2;area:=sqrt(p*(p-a)*(p-b)*(p-c);end;beginwriteln(input b1-b7:);readln(b1,b2,b3,b4,b5,b6,b7);s:=area(b1,b5,b6)+area(b2,b6,b7)+area(b3,b4,b7);writeln(s=,s:10:3);end.b7b4b3b2b1b5b6过程定义及调用 一、标准过程:read、readln、write、wr
47、iteln等二、用户自定义过程:过程定义的格式:procedure();过程首部begin;过程体;end;说明说明:过程首部以关键字过程首部以关键字procedure开头。开头。过程名是用户自定义的标识符,只用来标识一个过程,不过程名是用户自定义的标识符,只用来标识一个过程,不能代表任何数据,因此不能说明能代表任何数据,因此不能说明“过程的类型过程的类型”。形参表的一般格式形式如下:形参表的一般格式形式如下:var 变量名表:类型;变量名表:类型;var 变量名表:类型。其中带变量名表:类型。其中带var的称为变量形参,不带的称为变量形参,不带var的称为值形参。的称为值形参。在过程体内使用
48、的有关常量、变量等必须在过程体的说明在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义。部分内加以说明或定义。与函数体不同的是:函数体的执行部分至少有一个语句给与函数体不同的是:函数体的执行部分至少有一个语句给函数名赋值,而过程体的执行部分不能给过程名赋值,因为函数名赋值,而过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据。过程名不能代表任何数据。三、过程调用:三、过程调用:【例】:计算五边形的面积。program ex3_1;var b1,b2,b3,b4,b5,b6,b7,s,sum:real;procedure area(a,b,c:real;var s:
49、real);var p:real;begin p:=(a+b+c)/2;s:=sqrt(p*(p-a)*(p-b)*(p-c);end;beginwriteln(input b1-b7:);readln(b1,b2,b3,b4,b5,b6,b7);sum:=0;area(b1,b5,b6,s);sum:=sum+s;area(b2,b6,b7,s);sum:=sum+s;area(b3,b4,b7,s);sum:=sum+s;writeln(s=,s:10:3);end.过程过程主程序主程序过程过程调用调用形式参数表形式参数表 过程的调用过程的调用 过程调用是通过一条过程调用是通过一条独立的过
50、程调用语句独立的过程调用语句来实现的,它与函数调来实现的,它与函数调用完全不同。过程调用与调与标准过程(如用完全不同。过程调用与调与标准过程(如write,read等)的方式相等)的方式相同。调用的一般格式为:同。调用的一般格式为:过程名过程名 或或 过程名(实在参数表)过程名(实在参数表)说明说明:实参的实参的个数、类型个数、类型必须与形参一一必须与形参一一对应对应。对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量。对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量。过程调用的步骤为:计算实参的值;将值或变量的过程调用的步骤为:计算实参的值;将值或变量的“地址地址”