PASCAL程序基础课件.ppt
PASCAL程序设计基础,柴沟中学 鹿咏梅,一、PASCAL语言基础知识,二、结构化程序设计,三、数组与字符串,四、函数与过程,五、递归,一、PASCAL程序的基本结构,Program area;Const pi=3.1416;Var r:integer;s:real;Begin writeln(enter r=);readln(r);s:=pi*r*r;write(s=,s)End.,程序首部,说明部分,执行部分,Program 程序名;,Const 常量说明;Type 类型说明;Var 变量说明;Function 函数说明;Procedure 过程说明;,Begin 语句1;语句2;End.,例:已知圆的半径r,编程求圆的面积s.,Program,Const,Var,Begin,End.,第一节 PASCAL语言基础知识,二、PASCAL字符与符号,1标识符(1)标识符的定义:标识符就是以字母开头的字母数字序列,有效长度为63个字符,并且大小写等效。可以用来标示常量、变量、程序、函数等。,二、PASCAL字符与符号,(2)标识符的分类:a.保留字(关键字)所谓保留字是指在Pascal语言中具有特定的含义,标准Pascal语言中的保留字一共有35个.PROGRAM,BEGIN,END,CASE,FUNTION,PROCEDURE,ARRAY,AND,CONST,DIV,DO,DOWNTO,ELSE,FILE,FOR,GOTO,IF,IN,LABEL,MOD,NIL,NOT,OF,OR,PACKED,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH,二、PASCAL字符与符号,b.标准标识符:指Pascal语言预先定义的标识符,具有特殊含义。标准常量FalseMaxintTrue标准类型BooleanCharReal Integer标准函数AbsArctanChrCosEofEoln Exp Ln OddOrd PredRoundSinSqr Sqrt SuccTrunc标准过程DisposeGetNewPackPage PutReadReadlnReset RewriteUnpack WriteWriteln标准文件InputOutput,二、PASCAL字符与符号,c用户自定义标识符:由你自己根据需要来定义。选用的标识符不能与保留字和标准标识符相同。在定义标识符时可以用的字符:AZ;az;09;+,-,*,/,=,=,(,),:=,;,.,:,.,注:Pasca语言除了能使用以上规定的基本符号外,不得使用任何其它符号。,三、PASCAL数据类型,数据的一个重要特征就是它的类型,数据类型确定了数据的构成和可进行的运算。Pascal语言是一种强类型语言,不同类型间不能任意转换,不同类型的变量一般不允许作混合运算。程序中出现的所有常量、变量和用户自定义的数据必须预先说明后才能使用。,三、PASCAL数据类型,Pascal数据类型,简单类型,构造类型,指针类型,三、PASCAL数据类型,1.整型,类型 数值范围shortint(短整型)-128.128integer(整型)-32768.32767 longint(长整型)-2147483648.2147483647 byte(字节型)0.255 word(字类型)0.65535,三、PASCAL数据类型,2.实型,类型 数值范围real(基本实型)2.9e-39.1.7e38single(单精度实型)1.5e-45.3.4e38double(双精度实型)5.0e-324.1.7e308,三、PASCAL数据类型,3.布尔型,boolean,false,true,0,1,逻辑真,逻辑假,三、PASCAL数据类型,4.字符型,char,字符型的值必须用单引号括起来,字母作为字符型的值时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。,例:var c:char;c:=a,四、常量与变量,1.常量(1)常量:在某个程序的整个过程中其值不变的量。(2)常量定义:常量定义出现在说明部分。语法格式:const常量标识符1=常量值1;.常量标识符n=常量值n;常量标识符的类型由定义它的常量的类型决定。,Const pi=3.1416;a=10;c=c;t=true;,四、常量与变量,2.变量(1)变量:在某个程序的运行过程中其值可以发生改变的量(2)变量说明:变量说明出现在说明部分。语法格式:var变量标识符列表:类型;.变量标识符列表:类型;,vara,b,c:integer;m,n:real;,五、运算符和表达式,1.运算符a.算术运算符运算符运算运算对象结果类型+加 整型、实型只要有一个运算对象是实型,结果就-减 整型、实型是实型,如果全部的运算对象都是整*乘 整型、实型型并且运算不是除法,则结果为整型,/除 整型、实型若运算是除法,则结果是实型。div 整除 整型整型mod 取余 整型整型,5 div 3=15 mod 3=2,五、运算符和表达式,b.逻辑运算符 运算符运算运算对象结果类型not 逻辑非布尔型布尔型and逻辑与布尔型布尔型or 逻辑或布尔型布尔型 xor 逻辑异或 布尔型 布尔型,not(非)条件为True时,其结果值为False;否则为True;(取反)not(34)and(与)两条件都为True时,其结果值为True;否则为False;or(或)两条件中只要有一个为True;其结果值为True;否则为False;xor(异或)两条件的逻辑值不相同时,其结果值为True;否则为False;,五、运算符和表达式,c.关系运算符运算符运算运算对象结果类型=等于简单类型布尔型 不等于 简单类型布尔型大于简单类型布尔型=大于等于 简单类型布尔型,运算符优先级:not*,/,div,mod,and xor,+,-,or in,=,=,=,五、运算符和表达式,2.表达式,(1)通过运算符把常量、变量、函数调用结合起来组成的式子。,pi*r*rSum+2(xy)and(z=y),五、运算符和表达式,(2)数学上的表达式与pascal语言表达式的区别数学表达式 PASCAL表达式 注意 2a 2*a*号不能省略 ab a/b除号的写法 ab ab 不等号的写法 ab a=b 小于等于号的写法,五、运算符和表达式,Pascal中的逻辑运算:,五、运算符和表达式,第二节 结构化程序设计,pascal程序的三种基本结构,顺序结构,分支结构,循环结构,(一)、什么是顺序结构:【例1】:键盘输入两个变量的值,交换值后输出。方法:间接交换法算法分析:(“自顶向下,逐步求精”的编程思想)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;writeln(a=,a,b=,b)end.,一.顺序结构程序设计,Pascal 语言的语句分为简单语句(也称基本语句)和复合语句(也称构造语句),(二):几个简单语句:1赋值语句:格式:变量标识符:=表达式;功能:计算和赋值双重功能:【例2】写出程序执行后,变量的值。程序代码:program ex2;vara,b:integer;c:real;ch:char;bool:boolean;begin a:=3;b:=a;b:=a+1;a:=a+1;c:=a+b;ch:=h;bool:=true;bool:=not bool;end.说明:1)“:=”赋值号不同于“=”号,具有方向性,具有计算功能。2)赋值号两边的类型应该相同。3)一个赋值语句只能给一个变量赋值,变量可以进行多次赋值。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;功能:通过键盘,给指定的变量赋值。【例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后多余的数据将被忽略;执行read后多余的数据要么被忽略,要么被下一个read或readln语句所读入。,3输出语句(write,writeln):格式:write(输出项);writeln;功能:按指定的格式将输出项的内容输出。【例4】:写出程序运行后的结果。程序代码:program ex4;consta=10;b=20;begin writeln(50);writeln(a);writeln(a+b);writeln(a+b=,a+b)end.说明:1)输出项的内容可以是一项,也可以是若干项,各项之间用逗号分隔。2)当输出项为常量,直接输出常量的值;当输出项为变量时,输出该变量存储单元内的内容,变量允许属于任何一种标准数据类型;当输出项为表达式时,先计算后输出;当输出项为字符串时,原样输出单引号括起来的内容。,501030a+b=30,1、定义:复合语句是由若干条语句组成的语句序列。形式:begin 语句1;语句2;语句nend;用保留字begin和end括起来,构成一条逻辑上的语句,语法上充当一条语句。,(三):复合语句:,二.选择结构程序设计,1if 语句:格式:(1)if 条件 then 语句(2)if 条件 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;功能:先计算表达式的值,然后将表达式的值依次与各常数表进行对照,当找到一个与表达式的值相匹配的常数表时,就去执行该CASE常数表后面的语句。说明:1)end 与case 对应 2)表达式的类型通常是整型、字符型 3)常量表是常量,其类型与表达式的类型要一致。常量表中的常量不能重复。,通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。,FOR循环,当循环while,直到repeat循环,一、循环结构的三种形式:,三.循环结构程序设计,(一)for循环语句,1for语句:(“计数循环”):就是将规定循环体重复执行的次数。格式:for 控制变量:=初值 to 终值 do 循环体语句;for 控制变量:=初值 downto 终值 do 循环体语句;2、for语句执行过程 先将初值赋给左边的变量(称为循环控制变量);判断循环控制变量的值是否已“超过”终值,如已超过,则跳到步骤;如果末超过终值,则执行do后面的那个语句(称为循环体);循环变量递增(对to)或递减(对downt o);返回步骤;循环结束,执行循环下面的一个语句。3、说明:1)初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、布尔型和字符型等顺序类型,不能为实型。2)递增按succ函数规律变化,递减按pred函数规律变化,整型按数值大小变化,如果为字符型量,按ASCII码表的顺序计算。3)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对控制变量进行赋值。4)当初值超过终值,不执行循环,循环次数为零。,例:计算1+2+3+100之和,var i,s:integer;begins:=0;for i:=1 to 100 do s:=s+i;writeln(s);end.,循环体:重复执行,初值,i:循环控制变量,终值,(二)while语句:对于for循环有时也称为计数循环。适合用于事先知道循环次数.当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句实现循环要更方便。(“当型循环”):当条件满足时反复执行循环体。格式:while 布尔表达式 do 语句;执行过程:while语句的执行过程为:判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;执行循环体语句(do后面的语句);返回步骤1;结束循环,执行while的下一个语句。说明:1)为了使while循环能正常终止,布尔表达式中的变量必须在循环体中的某语句中有所改变,即有可能使布尔表达式的值为假,使循环结束,否则将出现死循环。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语句:(“直到型循环”):反复执行循环体直到条件满足为止。格式: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.,三种循环语句的相同点与不同点,数 组,一、为什么要使用数组:,例1输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩。分析:在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把50个学生的成绩都保留下来,然后逐个和平均分比较,把高于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存放这些数据,可想而知程序要很长且繁。要想如数学中使用下标变量ai形式表示这50个数,则可以引入下标变量ai。这样问题的程序可写为:,第三节 数组与字符串,tot:=0;tot表示总分for i:=1 to 50 do 循环读入每一个学生的成绩,并累加它到总分beginread(ai);tot:=tot+ai;end;ave:=tot/50;计算平均分for i:=1 to 50 doif aiave then writeln(No.,i,ai);如果第i个同学成绩小于平均分,则将输出而要在程序中使用下标变量,则必须先说明这些下标变量的整体数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合。,二、一维数组当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组。1、一维数组类型的定义,一维数组类型的一般格式:array下标1.下标2 of;我们可以说,数组是由固定数量的相同类型的元素组成的。如: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:integer;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.,二维数组,数组类型的定义中有两个下标类型,二维数组类型的定义:,type intarr=array 1.4 of integer;arr=array 1.5 of intarr;var a:arr;变量a是一个二维的数组变量,它有5个分量,分别用a1,a2,a3,a4,a5表示,每个分量相当于一个一维的数组变量(有4个整型分量),通过下标区分: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,4,type arr=array 1.5 of array 1.4 of integer;var a:arr;等价的定义方式:type arr=array 1.5,1.4 of integer;var a:arr;或var a:array 1.5,1.4 of integer,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,4,二维数组应用举例:,例:输入4名学生数学、物理、英语、化学、pascal五门课的考试成绩,求出每名学生的平均分,打印出表格。分析:用二维数组a存放所给数据,第一下标表示学生的学号,第二个下标表示该学生某科成绩,如ai,1、ai,2、ai,3、ai,4、ai,5分别存放第i号学生数学、物理、英语、化学、pascal 五门课的考试成绩,由于要求每个学生的总分和平均分,所以第二下标可多出两列,分别存放每个学生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科成绩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.,字符串,字符串有常量形式和变量形式。把按一定顺序排列的字符数据叫做字符串,表示方法是将字符放入单引号中,字符串个数叫做字符串的长度。字符串变量可以用串类型标识符 stringn来表示。N取值在1255之间。省略为255。定义格式:type 字符串类型名=string 最大长度;定义字符串变量格式是:Var 字符串变量名:字符串类型名;也可以直接定义字符串变量,其格式为:Var 变量名:string最大长度;或 变量名:string;,字符串之间的运算:对字符串可以整体输入或输出,如:read(x);write(y);允许对串变量进行赋值,如:X:=abc;y:=x。可以对字符串进行连接运算,使用+进行连接。如:ho+me结果是:home。字符串之间可以进行关系运算:、=、。比较方法按ASCII码一个字符一个字符比较。,字符串函数,(1)字符串测长函数格式:length(s)功能:求字符串S的长度,结果为整型。(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)删除过程格式:delete(s,I,n);功能:删除s中第i个字符位置开始的n 个字符。(6)数值转换为字符串过程格式:str(v,s);功能:将数值V转换成字符串,存放在字符串变量s中。(7)字符串转换为数值过程格式:val(s,v,c);功能:将数字串s转换成数值v,变量C记录检测出错的第一个字符的位置,当未出错时,C为0。,一、过程和函数统称子程序。,子程序的执行过程,第四节 函数与过程,函数,(1)标准函数:我们已经接触过一些Free Pascal提供一些内部标准函数,供编程时调用,象求|X|可调用ABS(X),求可调用SQRT(49)等等。实际上,这些函数是一些包含在Free Pascal系统中供用户调用的程序模块,分别命名为:ABS,SQRT等。因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。如:ABS(X)SQRT(12+X)等等。(2)自定义函数 系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要。在实际问题中,经常会遇到诸如求N!这一类的运算,系统中则没有提供相应的函数可供调用。为此,Free Pascal允许用户自行定义一些函数,我们称之为自定义函数。这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它。但要注意:这些函数必须在程序中定义,也只能在本程序中使用。,函数定义及调用一、Pascal标准函数:abs(x)、sqr(x)、等二、用户自定义函数:函数定义的格式:function():;函数首部begin;:=;end;,函数体,函数说明,注:1)函数首部以关键字function开头。2)括号内为形式参数表,即形参表。3)函数的类型也就是函数值的类型。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;begin 主程序调用 s:=fac(3)+fac(5)+fac(7);writeln(s=,s)end.,函数的调用:可以在任何与函数值类型兼容的表达式中调用函数,或者说,函数调用只能出现在允许表达式出现的地方,或作为表达式的一个因子。函数调用方式与标准函数的调用方式相同。,函数调用的一般格式:函数名(实在参数表),说明:实在参数简称实参。实参的个数必须与函数说明中形参的个数一致,实参的类型与形参的类型应当一一对应。调用函数时,一般的,实参必须有确定的值。函数调用的步骤为:计算实参的值,“赋给”对应的形参;函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。调用的自定义函数应在调用之前已定义过。自定义函数中的形参,因不是实际存在的变量,故又称为虚拟变量,它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。实在参数表是一些由逗号分隔的参数,它们是在调用函数时所用的自变量。只有在调用函数时,才将实在参数的值传送到形参的临时内存单元中去。可见,形参实质上是实参的一个“替身”。,【例】:计算右图五边形的面积。program ex3;var 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.,b7,b4,b3,b2,b1,b5,b6,过程定义及调用,一、标准过程:read、readln、write、writeln等二、用户自定义过程:过程定义的格式:procedure();过程首部begin;过程体;end;,说明:过程首部以关键字procedure开头。过程名是用户自定义的标识符,只用来标识一个过程,不能代表任何数据,因此不能说明“过程的类型”。形参表的一般格式形式如下:var 变量名表:类型;var 变量名表:类型。其中带var的称为变量形参,不带var的称为值形参。在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义。与函数体不同的是:函数体的执行部分至少有一个语句给函数名赋值,而过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据。,三、过程调用:【例】:计算五边形的面积。program ex3_1;var b1,b2,b3,b4,b5,b6,b7,s,sum:real;procedure area(a,b,c:real;var s: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.,过程,主程序,过程调用,形式参数表,过程的调用 过程调用是通过一条独立的过程调用语句来实现的,它与函数调用完全不同。过程调用与调与标准过程(如write,read等)的方式相同。调用的一般格式为:过程名 或 过程名(实在参数表),说明:实参的个数、类型必须与形参一一对应。对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量。过程调用的步骤为:计算实参的值;将值或变量的“地址”传送给对应的形参;执行过程体;返回调用处。,1函数往往只为求一个函数值;过程一般会被设计成求若干个运算结果,完成一系 列的数据处理,或与计算无关的各种操作。2函数有类型,最终要将函数值传送给函数名;过程无类型,不能给过程名赋值。3调用方式不同。函数的调用出现在表达式中;过程的调用是由独立的过程调用语句实现的。4返回值的方法不同。函数值是通过函数名传回调用程序;过程则是通过参数将运算的结果传给调用程序。,四、过程与函数的主要区别:,变量及其作用域一、变量的类型:全程变量和局部变量,1)、全程变量和它的作用域全程变量是指在程序开头的说明部分定义和说明的量。全程变量的作用域分为两种情况:(1)在全程变量和局部变量不同名时,其作用域是整个程序。(2)在全程变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。2)、局部变量和它的作用域凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效,因此也属于局部变量。局部变量的作用域分为两种情况:(1)当外层过程的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过程。(2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层过程的局部变量作用域不包含此过程。,【例5】:全程变量的作用域。program ex5;var m:integer;procedure test1;begin m:=100;end;begin m:=5;writeln(before the test1 call,m is:,m);test1;writeln(after the test1 call,m is:,m);end.运行结果:before the test1 call,m is:5after the test1 call,m is:100,【例6】:比较全程变量与局部变量的作用域。program ex6;var m:integer;procedure test2;var m:integer;begin m:=100;end;beginm:=5;writeln(before the test2 call,m is:,m);test2;writeln(after the test2 call,m is:,m);end.运行结果:before the test1 call,m is:5after the test1 call,m is:5,参数的传递,一、参数的类型:1形参和实参:函数调用和过程调用的一般步骤:注意:由于形参类型不同,其在函数和过程调用中所起的作用也不同。形参的类型可分为:值形参、变量形参、函数形参、过程形参。实参也对应分为:值实参、变量实参、函数实参、过程实参。,2、值参和变参,(1)值参:在函数或过程定义中,没有加VAR 说明的参数,在调用函数或过程时,调用程序将实在参数的值直接传递给形参,起着赋值作用。(2)变参:在函数或过程定义中,加有VAR 说明的参数,在调用函数或过程时,调用程序将实在参数的变量地址传递给形变参,因此当过程或函数处理中,改变形参变量的值,则实在参数的变量值也随之改变。(共享同一个存储单元)例:procedure area(a,b,c:real;var s:real);,3值参和变参例题:值形参:function fac(x:integer):integer;【例7】:值参数分析program ex7;vara:integer;procedure sum(b:integer);begin b:=b+10;writeln(b=,b);end;begina:=10;sum(a);writeln(a=,a);end.运行结果:b=20a=10,变量形参:procedure area(a,b,c:real;var s:real;)几点说明:1.函数不允许用变量形参;过程如需向调用程序返回值时,应采用变量形参。2.变量形参要求它的实参和它是同一类型的变量,而不能是表达式。3.在过程执行时,遇到对变量形参的引用或赋值,就是对相应参数的引用或赋值。4.对变量形参的任何操作就是对实参本身的操作。,【例8】:变量参数分析program ex8;var a:integer;procedure sum(var b:integer);begin b:=b+10;writeln(b=,b);end;begina:=10;sum(a);writeln(a=,a);end.运行结果:b=20a=20,小结:值参和变参值形参传值:调用时可用表达式代替形参,不改变实在参数的值。变量形参传地址:调用时必须用变量代替形参变量,改变实在参数的值。,例:请看下列程序的运行结果。program li3_10;var a,b,c:integer;procedure sub(x,y:integer;var z:integer);begin x:=x+1;y:=y+1;z:=x+y;writeln(sub:x=,x:2,y=,y:2,z=,z:2);end;begin a:=1;b:=4;c:=9;writeln(main:a=,a:2,b=,b:2,c=,c);sub(a,b,c);,writeln(main:a=,a:2,b=,b:2,c=,c);sub(c+5,b*b,a);writeln(main:a=,a:2,b=,b:2,c=,c);readln;end.运行结果:main:a1 b4 c9 sub:x2 y5 z7 main:a1 b4 c7 sub:x13 y17 z30 main:a30 b4 c7,1递归的定义:Pascal语言中,如果在一个函数、过程等的定义或说明内部又直接或间接地出现有对自身的引用,则称它们是递归的或者是递归定义的。例如:在数学上,所有偶数的集合可递归地定义为:0是一个偶数;一个偶数和2的和是一个偶数。可见,仅需两句话就能定义一个由无穷多个元素组成的集合。2递归的实现:通过函数或过程的调用来实现。函数或过程直接调用其自身,称为直接递归;函数或过程间接调用其自身,称为间接递归。,第五节 程序的递归调用,3例题:【例】:用递归计算n!n!可以由下列公式表示:program ex15;var n:integer;s:integer;function fac(a:integer):integer;begin if a=0 then fac:=1 else fac:=a*fac(a-1);end;beginreadln(n);s:=fac(n);writeln(n,!=,s)end.输入:5输出:,n!,1 n=0,n(n-1)!n0,递归结构的优点:结构清晰、容易阅读和理解,递归结构的缺点:需要保留每次递归调用时的参数,和局部变量,占用内存大,耗费机时多,程序运行的效率较低,递归算法的实用情况:符合递归的描述:1.需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少。2.递归调用的次数是有限的。3.必须有递归结束的条件。,分析以下程序写出运行结果(循环结构练习)1、Var y,m,d:integer:BeginReadln(y,m);Case m of1,3,5,7,8,10,12:d:=31;4,6,9,11:d:=302:if(y mod 4)=0 and(y mod 100=10)or(y mod 400=0)then d:=29 else d:=28;end;writeln(y,d):end.input:2000 2output:2、VarS,I:ingeger;BeginS:=0;For I:=1 to 100 doIf(I mod 3=0)and(I mod 4=0)Then s:=s+i;Writeln(s=,s)End.output:3、Var i:integer;Beginfor i:=1 to 100 doif i mod 2=0 thenBeginwrite(i:4);if i mod 5=0 then writeln;End;End.output:,作 业,4、VAR i,j:integer;BEGINFoR i:1 TO 5