信息学第九课过程与函数Word文档格式.docx
- 文档编号:16557884
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:23.66KB
信息学第九课过程与函数Word文档格式.docx
《信息学第九课过程与函数Word文档格式.docx》由会员分享,可在线阅读,更多相关《信息学第九课过程与函数Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
⑧函数体中的说明部分用来对本函数使用的标号、常量、类型、变量、子程序加以说明,这些量只在本函数内有效。
⑨函数体的执行部分由begin开头,end结束,中间有若干用分号隔开的语句,只是end后应跟分号,不能像程序那样用句号"
."
。
⑩在函数体的执行部分,至少应该给函数名赋一次值,以使在函数执行结束后把函数值带回调用程序。
(二)函数的调用
我们可以在任何与函数值类型兼容的表达式中调用函数,或者说,函数调用只能出现在允许表达式出现的地方,或作为表达式的一个因子。
函数调用方式与标准函数的调用方式相同。
函数调用的一般格式:
<函数名>
或
<函数名>(实在参数表)
说明:
①实在参数简称实参。
实参的个数必须与函数说明中形参的个数一致,实参的类型与形参的类型应当一一对应。
②调用函数时,一般的,实参必须有确定的值。
③函数调用的步骤为:
计算实参的值,"
赋给"
对应的形参;
(三)函数的应用举例
例1求正整数A和B之间的完全数(A<
B).
分析:
所谓完全数是指它的小于该数本身的因子之和等于它本身,如6=1+2+3,6即是一个完全数。
因此我们可定义一个布尔型函数perfect(x),若x是完全数,其值为TURE,否则为FALSE。
整个程序算法如下:
1fori:
=AtoBdo
2ifperfect(i)thenwriteln(i);
源程序如下:
programex7_1;
var
i,a,b:
integer;
functionperfect(x:
integer):
boolean;
k,sum:
begin
{累加x所有小于本身的因数}
sum:
=1;
fork:
=2toxdiv2do
ifxmodk=0thensum:
=sum+k;
{判断x是否是完全数}
perfect:
=x=sum;
{将结果赋值给函数名}
end;
{endofperfect}
begin{主程序开始}
write('
Inputa,b:
'
);
repeat{输入0<
a<
b}
readln(a,b);
until(a>
0)and(b>
0)and(a<
b);
writeln('
Listofallperfectnumbers:
{从a到b逐个判断,是完全数则打印出来
fori:
=atobdo
ifperfect(i)thenwriteln(i);
end.
自定义函数只是主程序的说明部分,若主程序中没有调用函数,则系统不会执行函数子程序。
当主程序调用一次函数时,则将实在参数的值传给函数的形式参数,控制转向函数子程序去执行,子程序执行完毕后自动返回调用处。
练习:
1.编写一个函数计算f(X,Y)=XY
2.已知一元二次方程的求解与值有关,输入a(a不等于0)、b、c,得出其是否有解?
3.
计算sin(x,n)其中n表示sin(x)的前n项。
输入x、n。
.
第二部分
二、过程
在pascal中,自定义过程与自定义函数一样,都需要先定义后调用。
函数一般用于求值,而过程一般实现某些操作。
(一)过程的说明
过程说明的一般格式为:
procedure<
过程名>
{过程首部}
①过程首部以关键字procedure开头。
②过程名是用户自定义的标识符,只用来标识一个过程,不能代表任何数据,因此不能说明"
过程的类型"
③形参表缺省(当然要同时省去一对括号)时,称为无参过程。
④形参表的一般格式形式如下:
[var]变量名表:
类型;
…;
[var]变量名表:
类型。
其中带var的称为变量形参,不带var的称为值形参。
在函数中,形参一般都是值形参,很少用变量形参(但可以使用)。
例如,下列形参表中:
(x,y:
real;
n:
integer;
varw:
vark:
b:
real)
x、y、n、b为值形参,而w、k为变量形参。
调用过程时,通过值形参给过程提供原始数据,通过变量形参将值带回调用程序。
因此,可以说,值形参是过程的输入参数,变量形参是过程的输出参数。
有关变参,这在后面内容具体叙述。
⑤过程体与程序、函数体类似。
与函数体不同的是:
函数体的执行部分至少有一个语句给函数名赋值,而过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据。
⑥过程体的说明部分可以定义只在本过程有效的标号、常量、类型、变量、子程序等。
(二)过程的调用
过程调用是通过一条独立的过程调用语句来实现的,它与函数调用完全不同。
过程调用与调与标准过程(如write,read等)的方式相同。
调用的一般格式为:
<过程名>
或
<过程名>(实在参数表)
①实参的个数、类型必须与形参一一对应。
②对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量。
③过程调用的步骤为:
计算实参的值;
将值或变量的"
地址"
传送给对应的形参;
执行过程体;
返回调用处。
过程与函数有下列主要区别:
①过程的首部与函数的首部不同;
②函数通常是为了求一个函数值,而过程可以得到若干个运算结果,也可用来完成一系列的数据处理,或用来完成与计算无关的各种操作;
③调用方式不同。
函数的调用出现在表达式中,而过程调用是一个独立的语句。
(三)过程的应用举例
例2输出以下一个图形:
*
**
***
****
*****
******
我们前面学习可用的二重循环打印出上图形,现我们设置一个过程打印出N个连续的"
*"
号。
programex7_2;
vari:
proceduredraw_a_line(n:
integer);
{该过程打印出连续n个星号,并换行}
varj:
begin
forj:
=1tondo
write('
*'
writeln;
end;
=1to6do
draw_a_line(i);
{调用过程,第I行打印i个连续星号}
(仔细阅读以下内容)
三、过程、函数的数据传递
在程序调用子程序时,调用程序将数据传递给被调用的过程或函数,而当子程序运行结束后,结果又可以通过函数名、变参。
当然也可以用全局变量等形式实现数据的传递。
这一节我们,就来研究参数传递与局部变量、全局变量等问题。
(一)数值参数和变量参数
前面已经讲过,pascal子程序中形式参数有数值形参(简称值参)和变量形参(变参)两种。
事实上,还有函数形参和过程形参两种,只是应用并不太多,我们不作深入地研究。
1、值形参
值参的一般格式如§
7.1.1所示。
应该强调的是:
①形参表中只能使用类型标识符,而不能使用类型。
②值形参和对应的实参必须一一对应,包括个数和类型。
③实参和值形参之间数据传递是单向的,只能由实参传送给形参,相当赋值运算。
④一个特殊情况是,当值形参是实型变量名时,对应的实参可以是整型表达式。
⑤值形参作为子程序的局部量,当控制返回程序后,值形参的存储单元释放。
2、变量形参
变量形参的一般格式如§
7.2.1所示,必须在形参前加关键字var。
应该注意的是:
①与变量形参对应的实参只能是变量名,而不能是表达式。
②与变量形参对应的实参可以根据需要决定是否事先有值。
③变量形参与对应的实参的类型必须完全相同。
④对变量形参,运行时不另外开辟存储单元,而是与对应的实参使用相同的存储单元。
也就是说,调用子程序时,是将实参的地址传送给对应的变量形参。
⑤当控制返回到调用程序后,变量形参的存储单元不释放,但变量形参本身无定义,即不得再使用。
⑥选用形式参时,到底是使用值形参还是变量形参,应慎重考虑。
值形参需要另开辟存储空间,而变量形参会带来一些副作用。
一般在函数中使用值形参,而在过程中才使用变量形参,但也有例外。
例3写出下列两个程序的运行结果。
programex1;
programex2;
vara,b:
vara,b:
procedureswap(x,y:
procedureswap(Varx,y:
integer);
vart:
vart:
begin begin
t:
=x;
x:
=y;
y:
=t;
t:
end;
begin begin
a:
=2;
a:
writeln(a:
3,b:
3);
writeln(a:
swap(a,b);
swap(a,b);
writeln(a:
end. end.
这两个程序唯一的区别是ex1中将x,y作为值形参,而ex2中将x,y作为变量形参,因此在ex2中对x,y的修改实际上是对调用该过程时与它们对应的变量a,b的修改,故最后,a,b的值为2,1。
而ex1中调用swap过程时,只是将a,b的值传递给x,y,之后在过程中的操作与a,b无关。
答:
ex1的运行结果为:
ex2的运行结果为:
12 12
12 21
(二)全程变量、局部变量及它们的作用域
在主程序的说明部分和子程序的说明部分均可以说明变量,但它们的作用范围是特定的。
1、局部量及其作用域
在介绍过程和函数的说明时,我们曾指出,凡是在子程序内部作用的变量,应该在本子程序内加以说明。
这种在子程序内部说明的变量称为局部变量。
形式参数也只是在该子程序中有效,因此也属于局部变量。
一个变量的作用域是指在程序中能对此变量进行存取的程序范围。
因此,局部变量的作用域就是其所在的子程序。
实际上,局部变量只是当其所在的子程序被调用时才具有确定的存储单元,当控制从子程序返回到调用程序后,局部变量的存储单元就被释放,从而变得无定义。
事实上,在子程序内定义的标号、符号常量、类型、子程序也与局部变量具有相同的作用域。
2、全程量及其作用域
全程量是指在主程序的说明部分中说明的量。
全程量的作用域分两种情况:
①当全程量和局部量不同名时,其作用域是整个程序范围(自定义起直到主程序结束)。
②当全程量和局部量同名时,全程量的作用域不包含局部量的作用域。
例4写出下列程序的运行结果:
programex7_4;
varx,y:
procedurea;
varx:
x:
writeln('
#'
x,'
y,'
{ofa}
begin{mainprogram}
x:
writeln('
,y);
a;
***'
y);
end.
程序中x,y是全局变量,但在过程a中也有变量x,故全程变量x的作用域为除过程a外的任何地方。
而y的作用域包含了子程序a,即整个程序。
运行结果如下:
*1*2
#2#
***1***2
评注:
变量作用域内对变量的操作都是对同一存储单元中的量进行的。
四、过程和函数的嵌套
Pascal语言中,使用过程和函数,能使程序设计简短,便于阅读,节省存贮单元和编译时间。
程序往往设计成分层结构,由一个主程序和若干个过程及函数组成。
在过程或函数中,还可以说明另一些过程或函数,即过程或函数可以分层嵌套。
在同一层中亦可说明几个并列的过程或函数。
例如:
上例过程的分层嵌套关系如下:
0层主程序sample内并列两个1层过程P1a和P1b。
过程P1a又嵌套两个2层过程p2a和p2b,2层的第二过程p2b又嵌套过程p3,p3就是第3层。
其中p1b,p2a和p3不再嵌套别的过程,称为基本过程。
这种分层结构的程序设计,特别要注意局部变量的使用范围和过程调用的要求。
在主程序sample中定义的变量,可以在所有的过程中使用,主程序可调用p1a和p1b两个过程。
过程p1a中定义的变量,只能在p2a,p2b和p3中使用。
它能调用p2a,p2b两个过程,而不能调用p3和p1b。
在过程p1b中定义的变量,只能在p1b中使用,它只能调用过程p1a。
过程p2a不能调用任何过程。
过程p2b可以调用并列过程p2a和p3,而过程p3可以调用p2a过程。
过程调用是有条件的,过程定义在先,调用在后。
同一层过程,后说明的过程可以调用先说明的过程。
如果要调用在它后面定义的过程(或函数),可使用<
向前引用>
FORWARD这个扩充标识符。
要注意的是<
过程(或函数)首部中形式参数表写一次即可,不必重复。
如:
procedureextend(vara,b:
forward;
表示过程extend<
因此,过程extend的说明部分只须如下书写:
procedureextend;
<
说明部分>
:
(今年的编程任务就是自己的程序模块化)
五、子程序(模块化)结构的程序设计
例5对6到60的偶数验证哥德巴赫猜想:
不小于6的偶数可分解成两个素数之和。
用布尔型函数prime(x)判断x是否是素数,若是,函数值为真,否则,函数值为假。
算法如下所示。
1.t:
=6
2.whilet≤60do
3.t11;
4.repeat
5.t11+2;
/*找下一个素数a*/
6.untilprime(t1)andprime(t-t1);
/*直到a,b都是素数*/
7.writeln(i,'
='
t1,'
+'
t-t1);
8.tt+2;
9.endwhile
源程序如下:
programex9_7;
vart,t1:
functionprime(x:
vari:
ifx=1
thenprime:
=false
elseifx=2
thenprime:
=true
elsebegin
prime:
=true;
i:
while(i<
=round(sqrt(x)))and(xmodi<
>
0)do
i:
=i+1;
ifi<
=round(sqrt(x))thenprime:
=false;
end;
end;
{ofprime}
=6;
whilet<
=60do
begin
t1:
repeat
t1:
=t1+2;
untilprime(t1)andprime(t-t1);
writeln(t,'
t:
=t+2;
end;
例6编写一个给一个分数约分的程序。
programex7_6;
┌──变量参数
vara,b:
↓
procedurecommon(varx,y:
vari,j,k:
begin
{求x,y的最大公约数}
i:
j:
repeat
k:
=imodj;
i:
=j;
=k;
untilk=0;
{对x,y进行约分}
x:
=xdivi;
=ydivi;
write('
Inputa,b='
readln(a,b);
common(a,b);
writeln(a,b:
5);
end.
如输入:
Inputa,b=128
则输出:
32
练习
1.输入5个正整数求它们的最大公约数。
(提示:
可用一个数组将5个数存放起来,然后求第一个数和第二个数的公约数,再求第三个数与前两个数公约数的公约数,这样求得前三个整数最大公约数……如此类推可求出5个整数的最大公约数)
2.给一维数组输入任意6个整数,假设为:
748915
请建立一个具有以下内容的方阵:
489157
891574
915748
157489
574891
(请用子程序编写)。
3.求两个正整数的最小公倍数。
4.输入一个任意位的正整数,将其反向输出。
5.有五位同学,其各科成绩如下:
学号数学语文英语总分名次
1 108 97 90
2 98 88 100
3 100 43 89
4 84 63 50
5 97 87 100
(1)编写一个过程enter,输入每个学生成绩并计算各人的总分。
(2)编写过程minci,用以排出每个人的名次。
(3)按学号顺序输出。
6.设n个围成一个圈并按顺时针方向向1—n编号。
从第S个人开始进行1到m报数,报到第m个人时,此人出圈,然后再从他下一个人重新开始1到m报数,如此下去,直到所有人都出圈,打印出出圈表,
7.1984年,已知最大的素数是286243-1,编程求出该数末四位数字。
答案(8027)
[较难习题,希望有能力的学生去做]
结构化程序设计
(1)编程计算N的K方结果,其结果不会超过200位。
(2)在n*n的正方形中放置长为2,宽为1的长条块,问放置方案有多少种?
(3)加法分式分解。
1/2=1/4+1/4.找出所有方案。
输入:
NMN为要分解的分数的分母
M为分解成多少项
(4)农夫过河。
一个农夫带着一只狼,一只羊和一些菜过河。
河边只有一条一船,由
于船太小,只能装下农夫和他的一样东西。
在无人看管的情况下,狼要吃羊,羊
要吃菜,请问农夫如何才能使三样东西平安过河。
【算法分析】
将问题数字化。
用1代表狼,2代表羊,3代表菜。
则在河某一边物体的分布有以下
8种情况。
┏━━━━┯━┯━━━━━┯━━━━━━━━┯━━━┓
┃物体个数│0│1│2│3┃
┠────┼─┼─┬─┬─┼──┬──┬──┼───┨
┃分布情况│0│1│2│3│1,2│1,3│2,3│1,2,3┃
┠────┼─┼─┼─┼─┼──┼──┼──┼───┨
┃代码之和│0│1│2│3│3│4│5│6┃
┠────┼
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 第九 过程 函数