一、子程序
计算机程序设计和问题求解的基本思想是将一个大的复杂问题分解成更小、更简单和容易处理的子问题。为此提出了结构化程序设计思想,其基本要点是:1、自顶向下,逐步求精的设计方法;2、程序的模块化。
在FreePascal程序设计中,子程序是实现结构化程序设计的主要手段之一。
在程序设计中,我们经常会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相互独立的整体,用一个标识符给它起一个名字,凡是程序中出现该程序段的地方,只要简单地写上其标识符即可,这样的程序段称为子程序。
所谓子程序,是指本身不能单独执行,需要其他程序调用才能执行的程序。比如我们熟悉的标准函数(abs、sqr)以及输入输出标准过程(read、readln、write、writeln)等,这些标准函数和标准过程都是Pascal系统提供的,我们可以在程序中直接使用它们,而不必知道它们是如何进行计算或如何实现输入输出操作的。与子程序相对应的,前面我们所设计的程序可以称为主程序,程序是从主程序开始执行的,通过主程序去调用子程序。因此,一个完整的Pascal程序可以包含一个主程序(这是必须的)和若干个子程序。
子程序有两种形式:函数和过程。
二、函数
如果我们设计一个子程序,每调用一次产生一个结果,那么可以把这个子程序设计成函数形式,使用起来比较方便。
在数学上,如果y的值随x的变化而变化,那么称y是x的函数,x是自变量。例如函数y=5*x+8,当x=2时y=18;当x=3时y=23。Pascal语言借用数学上的“函数”术语,把完成某种计算的子程序定义为函数。
函数有标准函数和用户自定义函数之分,用户程序可以使用标准函数,也可以根据需要自己定义函数。
Pascal语言允许用户根据需要自定义函数,但需要注意的是,用户自定义函数与标准函数使用方式不同,标准函数的调用可用在不同程序中,而自定义函数只能在定义它的程序中被调用。
函数定义的一般格式:
function 函数名(形式参数表):函数类型;
局部变量说明
begin
语句1;
语句2;
……
语句n;
函数名:=表达式;
end;
函数定义一般由函数首部和函数体两部分组成:
1、函数首部以保留字function开头
2、函数名是用户自定义的标识符,在同一程序中函数名不能与其他变量名重名,也不能再用作数组名或过程名等
3、括号内的形式参数表,简称形参表,形式参数即函数的自变量,其值来源于主程序的调用;当主程序调用函数时,形参才能得到具体的值并参与运算,求得函数值。
4、函数的类型就是函数值的类型
5、函数体与程序体基本相似,由说明部分和执行部分组成
6、函数体中的说明部分,用来对本函数使用的常量、变量和类型加以说明,这些量只在本函数内使用,称为局部变量,与函数体外的同名变量无关
7、函数的执行部分由begin开头,以end结束,中间有若干用分号隔开的语句,只是end后应加分号,不能像主程序末尾那样用句号
8、在函数体的执行部分,至少应该给函数名赋一次值,以便在函数执行结束后把函数值带回调用该函数的程序中,脱离函数体前最后一次向函数名的赋值决定了该函数的结果值
用户自定义函数的调用与标准函数一样,不同的是标准函数可以用在不同的程序中,自己定义函数只限于定义它的程序中使用。
函数调用的一般形式为:函数名(实在参数表);
1、函数调用必须出现在表达式中
2、实在参数简称实参,在调用函数时,实参将值赋给相应的形参,因此实参的个数、类型应与形参一一对应,并且要有确定的值
3、调用函数的步骤是:首先在主程序中计算实参的值,传递给所调用函数中对应该的形参,然后执行函数体,最后将函数值返回给主程序。
注意:自定义函数中的形参,因不是实际存在的变量,它不占用内存单元。
例1:求长方形的面积。
var
a,b:real;
function s(x,y:real):real;
begin
s:=x*y;
end;
begin
readln(a,b);
writeln(s(a,b));
end.
三、过程
在Pascal语言中,过程分标准过程和自定义过程,如前面学过的读语句read(x);写语句write(x);实际上都是过程语句,由于它们是Pascal系统预先声明的,所以称为标准过程。如果我们将完成某种操作,进行某种运算的程序定义为过程,叫做用户自定义过程。
过程定义的一般格式:
procedure 过程名(形式参数表);
局部变量说明
begin
语句1;
语句2;
……
语句n;
end;
所谓定义过程,就是在程序的说明部分对过程加以描述。过程定义部分一般由过程首部和过程体两部分组成:
1、过程首部以保留字procedure开头
2、procedure后面的过程名是用户为自已的过程起的名字,过程名应是一个合法的标识符,因此应遵守标识符的各种规定。过程名只用来标识一个过程,不代表任何数据,所以它没有类型
3、形式参数表部分可以包含一个或多个参数,多个参数之间用分号分隔。过程也可以没有参数,没有参数的过程叫无参过程
4、过程说明部分用来说明过程体中所用的常量、变量等,这些量只在本过程中使用,称为局部变量,与过程体外的所用同名变量无关自定义过程与自定义函数一样,都需要先定义后调用。在主程序中调用过程,要通过过程语句来实现。
过程语句的一般形式:过程名(实在参数表);
实在参数表列出实在参数(简称实参)序列,各实参之间用逗号分开。实参表中的实在参数必须与形参表中的形式参数在个数、类型、顺序上一一对应(调用无参过程的过程语句没有实参表)。即一个实参对应一个形参,次序不能颠倒。
在调用过程时,通过给出的过程名,首先要完成实、形参结合,即用形式参数去代替实在参数,然后再去执行过程体。过程体执行完毕后,形参及局部量消失,返回主程序的调用处继续向下执行。
例2:定义一个打印由"*"号组成的三角形的过程,然后在主程序中输入行数,并调用该过程输出三角形。
var
a:integer;
procedure sjx(x:integer);
var
i,j:integer;
begin
for i:=1 to x do begin
for j:=1 to i do write('*');
writeln;
end;
end;
begin
readln(a);
sjx(a);
end.
四、函数与过程的区别
1、过程首部与函数首部不同
2、函数在参数表后要说明函数类型,在函数体中应对函数名赋值,而过程在参数表后无类型说明,不能给过程名赋值
3、函数通常是为了求一个函数值,并在函数执行结束后将函数值带回主程序。而过程可通过一系列的数据处理,得到若干个计算结果,或用来完成与计算无关的任何各种操作
4、调用方式不同:函数的调用出现在表达式中,而过程的调用是一个独立的语句
作业
1、zerojudge:c002、d255、a695、c015
2、如果a和a+2同为质数,那么a与a+2是一对孪生质数。请编程找出两位数中所有的孪生质数。