资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,2010,年冬令营,过程与函数,盐城市初级中学 谷爱清,宿舍纪律和卫生情况,文件操作,1,、建立关联,assign(input,文件名,;,assign(output,文件名,);,2,、打开读文件,reset(input,);,打开写文件,rewrite(output,);,3,、关闭文件,close(input,);,close(output,);,eoln,行结束函数,eof,文件结束函数,1,、一般用数组实现线性表的顺序存储,2,、顺序表的基本运算,(,1,)建立线性表,(,2,)求线性表的长度,(,3,)查找一个元素,(,4,)删除一个元素,(,5,)插入一个元素,过程和函数,程 序 的基本结构,顺序结构,选择结构,循环结构,过程和函数,说明:,程序中可以只有主程序而没有子程序,但不能没有主程序,也就是说不能单独执行子程序。,程序设计的基本思想:,自顶,向下、逐步求精,程序的模块化,一、函数定义及调用,Pascal,标准函数,绝对值函数,abs(x),如:,y,:,=abs(-9),求平方函数,sqr(x,),如:,y,:,=sqr(5),求平方根函数,sqrt,(x),如:,y,:,=sqrt(100),函数的一般格式是:,函数名(参数,1,,参数,2,,,),函数的调用形式是:,y :=,函数名(实在参数表),Program sum(input,output);,var,i:integer;,s:longint,;,begin,例,1,:编程求,1,2,2,2,10,2,的和。,s:=0;,for i:=1 to 10 do,s:=,s+sqr(i,) ;,writeln(s,=,s);,end.,Program sum(input,output);,var,i:integer;,s:longint,;,begin,例,1,:编程求,1,2,2,2,10,2,的和。,s:=0;,for i:=1 to 10 do,s:=,s+sqr(i,) ;,writeln(s,=,s);,end.,例,2,:编程求,1,!,2,!,10,!的和。,fac(i,),编写一个求,n!,的函数,fac,。,(,注意,n,的范围,),function,fac(n:integer):longint,;,var,k:integer;,t:longint,;,begin,t:=1;,for k:=2 to n do,t:=t*k;,fac,:=t;,end;,函数体,函数首部,形式参数,将函数值传递到函数名中,函数的结果类型,函数的格式,function,函数名,(,形参表):函数类型;,局部变量说明;,begin,语句,1,;,;,函数名:,=,表达式;,end;,函数首部,函数体,将函数值传递给函数名,在表达式中调用:函数名(实在参数表),如:,y=,fac(n,),fac,为函数名,,n,为实参,函数类型为,longint,函数值通过函数名传送回调用程序。,函数的调用,Program sum(input,output);,var,i:integer;,s:longint,;,function,fac(n:integer):longint,;,var,k:integer;,t:longint,;,begin,t:=1;,for k:=2 to n do,t:=t*k;,fac,:=t;,end;,例,2,:编程求,1,!,2,!,10,!的和。,注意:,自定义函数要,先定义,后使用,begin,s:=0;,for i:=1 to 10 do,s:=,s+,fac(i,),;,writeln(s,=,s);,end.,函数名将求得的函数值带回调用该函数的程序中,例,3,编写一个求三个数最大值的函数。,function max(a,b,c:real):,real,;,var,p:real;,begin,if ab then p:=a else p:=b;,if cp then max:=c else max:=p;,end;,例,4,计算如图所示的多边形面积。,function area(,a,b,c,:real):,real,;,var,p:real;,begin,p:=(a+b+c)/2;,area:=,sqrt(p,*(p-a)*(p-b)*(p-c);,end;,a,b,c,为三角形的边长,p,为半周长,即,p=(a+b+c)/2,Program ex4(input,output);,var,b1,b2,b3,b4,b5,b6,b7,s:real;,begin,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.,分析:,b1,b5,b6,b2,b3,b4,b7,用海伦,公式求三角形的面积:,s= p(p-a)(p-b)(p-c),a,b,c:real):real,;,area:=,sqrt(p,*(p-a)*(p-b)*(,p-c,);,函数定义时注意:,2,、形参值来源于主程序的调用,只有在执行过程中调用了函数,形参才得到具体值并参与运算,得到,函数值,。,3,、,在函数体中至少有一条将,函数值,传给函数名的赋值语句。,函数的类型就是函数值的类型,函数值通过函数名传送回调用程序。,4,、函数体内定义的类型、常量、变量等只在本函数内有效,退出函数体后,分配的存储单元被释放。这些量与函数体外的同名变量无关。,1,、使用函数前应先说明。函数以,function,开头,函数名由用户自定义一个标识符,用于存放最终函数值。,function area(a,b,c:real):,real,;,s:=area(3,4,5),调用函数时注意:,1,、自定义函数中的形参,不是实际存在的变量,不占用内存单元,只在调用函数时,才临时开辟相应的内存单元,存放实在参数的值,形参实质上是实参的一个,“,替身,”,。在调用函数时,实参将值赋给形参,因此实参的个数、类型应与形参一一对应,并且要有确定的值。,2,、函数调用步骤是:首先在调用程序中计算实参的值,传送给对应的形参,接着执行函数体,最后将函数值返回给调用程序。,3,、函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行。,例,5,自定义一个专门求两个自然数的最大公约数的函数,GCD;,function GCD(x,y: integer): integer;,var,n:integer;,begin,while x mod y,0 do,begin,n:=x; x:=y; y:=n mod y;,end;,GCD:=y;,end;,Greatest common divisor,最大公约数,作业,1:,试定义一个函数,dax(ch,),能将小写字母转换为大写字母。,例如:,dax(a,)=A,dax(b,)=B,function,dax(ch,: char): char;,begin,if (,ch,=a and,ch,=z),then,dax,:=chr(ord(ch)-32);,end;,ASCII,码:,A 65 a 97,作业,2,:,定义一个函数,digit(n,k),它能将整数,N,从右边数第,k,位上的数字取出来。,例如:,digit(12568,4)=2,digit(1436,6)=0,。,拓展:,1,、从左边开始的第,k,位上的数字如何取出?,2,、从指定的第,k,位开始取,m,个数字如何取出?,在屏幕上输出如图所示的图形。,program exam;,var,i,j:integer;,begin,for i:=1 to 3 do,begin,write(, ,:(39-i);,for j:=1 to 2*i-1 do write(*);,writeln,;,end;,End.,*,*,*,39,列,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,三、过程定义及调用,标准过程有:,标准过程调用:,read/,readln/write/writeln,read(a,b,c);,自定义过程的格式:,procedure,过程名,(,形参表);,局部变量说明;,begin,语句,1,;,语句,2,;,end;,过程首部,过程体,过程的作用:, 可以得到,若干个,运算结果;(返回值), 执行一系列的数据处理;, 完成其它与计算无关的操作;,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,在屏幕上输出如图所示的图形。,procedure draw (n:integer);,var,i,j:integer;,begin,for i:=1 to n do,begin,write,(, ,:(,39-i);,for j:=1 to 2*i-1 do write(*);,writeln,;,end;,end;,begin main,draw(3);draw(6);draw(9);,for k:=1 to 5 do,writeln,(,*,:39);,end.,例,6,:定义一个求三角形面积的过程,area,。,procedure area(a,b,c:real;,var,m:real);,var,p:real;,begin,p:=(a+b+c)/2;,m:=,sqrt(p,*(p-a)*(p-b)*(p-c);,end;,a,、,b,、,c,、,m,四个形式参数,其中,a,、,b,、,c,为值形参,参数,m,前面有,var,,,是变量形参。该过程被调用后,由,变参,m,将结果传回调用程序,。,过程定义和调用的注意点:,1,、使用,过程前应先定义。以,procedure,开头,,过程名和函数名一样,由用户自定义,所不同的是,过程没有结果类型。,2,、过程的运算结果是通过变参进行传递的。,procedure area(a,b,c:real;,var,s1:real);,var,p:real;,begin,p:=(a+b+c)/2;,s1:=,sqrt(p,*(p-a)*(p-b)*(p-c);,end;,b1,b5,b6,b2,b3,b4,b7,例,7,用过程编写程序求如图所示的五边形面积。,三角形的面积通过变参,s1,传回主程序。,begin,end.,sum:=sum+s;,readln(b1,b2,b3,b4,b5,b6,b7);,sum:=0;,area(b1,b5,b6,s);,area(b2,b6,b7,s);,sum:=sum+s;,area(b3,b4,b7,s);,sum:=sum+s;,writeln(sum,=,sum:10:3);,函数调用出现在表达式中,函数值是通过函数名传回调用程序,目的,为了求一个函数值,结果类型,无类型,不能给过程赋值,函数有类型,最终要将函数值传送给函数名。,调用方式,由独立的过程调用语句来完成,返回值的方法,通过变参将运算的结果传给调用程序,过程,函数,函数和过程的主要区别:,完成一系列的数据处理,或与计算无关的各种操作,四、变量及其作用域,例,8,看程序写结果,program ex8(input,output);,var,m:integer;,procedure test1;,begin,m:=100;,end;,begin,m:=5;,writeln(m,=,m);,test1;,writeln(m,=,m);,end.,分析:,m,为全程变量。在整个程序的执行过程中都是有意义的。,在程序开头的说明部分说明的量称为,全程变量,。,例,9,读程序写结果。,Program ex9(input,output);,var,m:integer;,procedure test2;,var,m:integer;,begin,m:=100;,end;,begin,m:=5;,writeln(m,=,m);,test2;,writeln(m,=,m);,end.,结果为:,m=5,m=5,过程中的,m,是局部变量,结果被屏蔽,它不影响到全程变量,m,的值。,全程变量和局部变量比较:,全程变量:在程序开头的说明部分被说明,作用域,:整个程序;,局部变量:在过程体和函数体内被说明,作用域,:所在子程序。,全程变量的作用域分两种情况:,当全程变量和局部,变,量不同名时,其作用域是整个程序。,当全程,变,量和局部,变,量同名时,全程,变,量的作用域不包含局部,变,量的作用域。,当局部变量所在子程序被调用时,局部变量才被分配有效的存储单元;当返回调用程序时,局部变量所占的存储单元就被释放。,作业,3:,看程序写结果,program ex10(input,output);,var,a,b,c:integer;,procedure pro;,var,c:integer;,begin,a:=1; b:=2; c:=3;,end;,begin,a:=100; b:=200; c:=300;,writeln(a,b,c,);,pro;,writeln(a,b,c,);,end.,结果:,100 200 300,1 2 300,五、参数的传递,函数调用和过程调用的一般步骤:,实参和形参集合,执行函数体和过程体,返回调用处继续执行,参数,形参,实参,值形参,变形参,function,fac(x,y:integer):real,;,procdure,fac(,var,x,y:integer);,a:=fac(5,6);,值形参,类似于局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。,需要过程向调用程序返回值时,应采用,变形参,,对变形参操作实际上就是对实参本身的操作。,Program ex11_1(input,output);,var,a:integer;,procedure sum(b:integer);,begin,b:=b+10;,writeln(b,=,b);,end;,begin,a:=10;,sum(a);,writeln(a,=,a);,end.,运行结果为:,b=20,a=10,Program ex11_2(input,output);,var,a:integer;,procedure,sum(var,b:integer);,begin,b:=b+10;,writeln(b,=,b);,end;,begin,a:=10;,sum(a);,writeln(a,=,a);,end.,运行结果为:,b=20,a=20,b,为值参,b,为变,参,a,为实参,Program ex12(input,output);,var,x,n:integer ;,procedure,chan(x:integer,;,var,y:integer);,begin,x:=x+5;,y:=y+5;,writeln(x,=,x, y=,y);,end;,begin,x:=10;,n:=10;,writeln(x,=,x, n=,n);,chan(x,n,);,writeln(x,=,x, n=,n);,end.,结果为:,x=10 n=10,x=15 y=15,x=10 n=15,作业,4:,看程序写结果,.,读,下列程序体会子程序的功能:,program ex3_1(input,output);,var,x,y:integer;,procedure swap1;,var,t:integer;,begin,t:=x;,x:=y;,y:=t;,end;,begin,x:=10;,y:=20;,writeln(x,= ,x, y=: 6,y);,swap1;,writeln(x,=,x,y=:6,y),end.,program ex3_2,(input,output);,var,x,y:integer;,procedure swap2(var x,y:integer);,var,t:integer;,begin,t:=x;,x:=y;,y:=t;,end;,begin,x:=10;,y:=20;,writeln(x,= ,x, y=: 6,y);,swap2(x,y);,writeln(x,=,x,y=:6,y),end.,值,参与变参的区别:,1,、传值:为值参分配存储单元,过程体内对值参的操作不影响实参的值。一旦过程体执行结束后,系统将收回值参所占用的存储单元,值参的值也就不再存在。,2,、变参是传地址:变参所占用的存储单元中存放的是实参的地址,因此对变参的操作就是对实参的操作。一旦过程体执行完毕,系统将收回变参所占用的存储单元,但运算结果已保留在对应的实参中。,比较:形,参,种类不同决定了实参的单、双向传递。值参实现单向传递,仅将过程外部的值传递给过程,故称为输入参数,它所对应的实在参数可以是常量、变量或表达式;变参实现的是双向传递,除了将过程外部的值传递给过程外,更重要的是它能将过程中变化的形参值带出来,故又称为输出参数,其对应的实参必须是变量。,实参,值参,过程,实参,变参,过程,Program ex14(input,output);,var,a1,a2,d1,d2:real ;,z1,z2:integer,procedure fen(x:real;,var,n:integer;var,p:real);,begin,n:=,trunc(x,);,p:=,x-n,;,end;,begin,write(input a1,a2);,readln(a1,a2);,fen(a1,z1,d1);,writeln(a1:8:3,z1:8,d1:8:3);,fen(a2,z2,d2);,writeln(a2:8:3,z2:8,d2:8:3);,end.,结果为:,作业,5:,看程序写结果,.,input a1,a2:18.56 124.78,18.56 18 0.560,124.78 124 0.780,x,为值参数,n,p,为变量参数,18.56 124.78,六、子程序的嵌套,一个函数或过程可能要求调用另一个函数或过程,这种调用称为函数或过程的嵌套。,例,14,求组合数,C +C,的和。,3,6,5,9,C =,m,n,n!,m!(n-m)!,分析:,1,、,n!=n*(n-1)*2*1,用,fac,函数实现。,2,、组合用,cnm,函数实现,在,cnm,函数中调用,fac,函数。,3,、被调用的函数写在调用它的函数前面。,program ex14-1(input,output);,var,s:real;,function,fac(k:integer):real,;,var,i,fa:integer,;,begin,fa,:=1;,for i:=2 to k do,fa,:=,fa,*i;,fac,:=,fa,;,end;,function,cnm(n,m:integer):real,;,begin,cnm,:=,fac(n)/(fac(m,)*,fac(n-m,);,end;,求,k!,函数,求,组合函数,调用,fac,函数,主程序,begin,s:=cnm(6,3)+cnm(9,5);,writeln(s,=,s:6:0);,end.,主,程,序,函数,cnm,开始,调用,cnm(6,3),函数,fac,调用,fac(6),返回,调用,fac(3),返回,调用,fac(6-3),返回,返回,继续执行主程序,调用,cnm(6,3),执行的流程,program ex14-2(input,output);,var,s:real;,function,cnm(n,m:integer):real,;,function,fac(k:integer):real,;,var,i,fa:integer,;,begin,fa,:=1;,for i:=2 to k do,fa,:=,fa,*i;,fac,:=,fa,end;,begin,cnm,:=,fac(n)/(fac(m,)*,fac(n-m,);,end;,begin,s:=cnm(6,3)+cnm(9,5);,writeln(s,=,s:6:0);,end.,主程序,注意:,函数,fac,是嵌套在函数,cnm,中的,因此主程序只能调用,cnm,函数,而不能调用函数,fac,。,七、综合应用,分析,:,完全数:因子之和,(,自身除外)等于它本身的自然数,如,6=1+2+3,;,定义一个布尔型函数判断一个数是否为完全数,若是则返回,true,,,否则返回,false,;,从,A,到,B,逐个调用该函数判断。,例,15,求正整数,A,和,B,之间的完全数(,Aa0):);,readln(a,b,);,writeln(list,of all perfect numbers:);,for i:=a to b do,if perfect(i) then writeln(i:8),end.,例,16,:凡满足,X,2,+Y,2,=Z,2,的正整数(,X,,,Y,,,Z,),称为一组勾股数。编程找出,100,以内的所有勾股数。,分析:判断,X,,,Y,,,Z,是否为一组勾股数,1,、先找一组,X,、,Y,2,、,判定,SQRT,(,X,2,+Y,2,),是否为整数,是则,X,Y,Z,为一组勾股数。,所谓勾股数,一般是指能够构成直角三角形三条边的三个正整数,(a,b,c),。,即,a2+b2=c2,a,b,cN,program ex16(input,output);,var,x,y:integer;,function,sqrtrue(k:integer):boolean,;,var,i,zs:integer,;,begin,zs,:=,trunc(sqrt(k,);,sqrtrue,:=false;,if,sqr(zs)=,k then,sqrtrue,:=true;,end;,begin,for x:=1 to 100 do,for y:=x to 100 do,if,sqrtrue(sqr(x)+sqr(y,) then,if,round(sqrt,(,sqr(x)+sqr(y,)6) and (n=0) and (,ch,=9) do,begin,k:=k+1;,intk,:=ord(ch)-ord(0),;,( ? ),read(ch,);,end;,readln,;,if kn then,( ? ),for i:=k,downto,1 do,begin,intn+i-k,:=,inti,;,inti,:=0;,end;,end;,procedure,add(var,a:arrtype,;,b:arrtype,);,var,s,k:integer;,begin,g:=0;,for k:=n,downto,1 do,begin,s:=ak+bk+g;,( ? ),ak:=s mod 10;,g:=s div 10;,end;,end;,procedure,outdata(a:arrtype,);,var,k:integer;,begin,k:=1;,while ak=0 do k:=k+1;,while k=n do,begin,write(ak);,k:=k+1;,end;,writeln,;,end;,begin,for i:=1 to n do,begin,ai:=0; bi:=0;,end;,readdata(a,);,readdata(b,);,add(a,b);,outdata(a,);,end.,思考:,高精度处理:要求处理两个高精度的减法。,说明:,函数名最好取的有意义,能“见名识意”,而且类型必须符合要求;,函数体中至少有一条语句给函数名赋值,即函数是通过函数名来传递返回值的;,形式参数相当于自变量,也是有类型的;在一个参数表中也可以有多个参数,特殊情况下也可以没有参数,称为无参函数;,function area(a,b,c:real):,real,;,函数,参数(自变量),返回值(结果),标准函数,upcase,2007,年,Noip,普及组阅读程序第四题,
展开阅读全文