




已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
过程和函数 过程 一 过程的定义Pascal的过程定义由过程首部与过程体组成 其形式 Procedure过程名 形式参数表 说明部分 BEGIN过程体 语句块 END 1 过程首部 1 过程首部以关键词Procedure开头 2 过程名与函数名的使用规则相同 但要注意过程名不能和同一程序中的变量 数组 函数同名 同时过程名不能代表任何数据 因此不必说明类型 3 参数表中为过程的形式参数 用逗号分隔 过程和函数一样也可以不带形参 此时 只是在主程序调用它时 执行指定的操作 4 形式参数的使用主要有值形参与变量形参 如下例 ProcedureFAC A B real C integer varx y reaL 其中 A B C称为值形参 它们与在函数中介绍的形参相同 X Y称为变量形参 在它们的前面冠有保留字Var 关于形式参数的有关内容将在后面介绍 2 过程体 过程体与函数体相同 也包括说明和执行这两个部分 1 在过程体内使用的有关常量 变量等必须在过程体的说明部分内加以说明或定义 2 在过程体说明的有关量 只有在过程体执行期间有效 当退出过程体后 为这些量分配的存储单元被释放 3 过程体的执行部分不能给过程名赋值 因为过程名不能代表任何数据 二 过程的调用主程序是通过一条独立的过程调用语句来调用过程的 调用过程必须给出一个过程名 并用实在参数代替形式参数 一般形式是 过程名 实在参数表 对于过程的调用要注意以下几点 1 调用的过程必须在调用之前进行说明 也就是说必须先说明后调用 2 调用过程时 通常是通过值形参给过程提供原始数据 通过变量形参将值带回调用程序 因此我们可以这样来理解 值形参是过程的输入参数 变量形参是过程的输出参数 3 仅当在主程序中调用过程时 过程中的语句块才被执行 调用完毕自动返回主程序的调用点 使主程序继续往下执行 因此 过程中的过程定义仅起一个说明作用 例如 执行下面程序 1 constx 100 2 Proceduresub x integer BeginX x 200 Write subx x End 3 beginWrite x x End 执行结果是 x 100为了说明问题 在程序的前面附加了 1 2 3 的标号 从程序的标号来看 虽然程序第 1 标号语句的下一语句的标号是 2 也就是过程sub的入口点 然而 由于执行该程序时并没有调用sub过程 因此执行完第 1 语句后 程序并不会自动进入从第 2 语句开始的该过程 因而打印出来的结果是x 100 过程应用举例 例1 编写程序 求 S 2 4 6 8 10 测试数据 输入 无输出 3669866分析 此题不用过程也很好求S 但经仔细研究可发现 用一个过程去完成每次求阶乘的计算 避免了同一功能程序的重复 使程序更为简洁 也更加容易阅读 程序如下 programaa vari integer b s longint procedurenjs x integer vart longint varj integer begint 1 forj 1toxdot t j end begins 0 fori 2to10doifnotodd i thenbeginnjs i b s s b end writeln s end 1 判断程序运行结果 不准用计算机算 只能用笔算 programg1 vars a b longint procedureadd x y longint varsum longint vari integer beginsum 0 fori xtoydobeginsum sum i end end begins 0 read a b add a b s writeln s end 输入 910输出 练习一 2 判断程序运行结果 不准用计算机算 只能用笔算 programg2 vark real procedurep x real vary real varz real beginz x x 3 y y z end begink 1 0 p 2 0 k writeln k 0 2 end 输出 3 判断程序运行结果 不准用计算机算 只能用笔算 programg3 vara b c integer procedurepro varc integer begina 1 b 2 c 3 end begina 100 b 200 c 300 pro writeln a 5 b 5 c 5 end 输出 4 文件名 g4 pas 将求一个数阶乘的方法设计为一个过程 利用这个过程 求输入的任意的两个数的阶乘和 N M 8 测试数据 输入 一行 两个数之间隔一空格35输出 一行 两个的阶乘和 126 例2 学校举行晚会 要M个学生中选N个学生到舞台上表演一个游戏 问有多少种选择方法 这是数学中的组合运算 可用下列公式计算 其中M N由键盘输入 分析 从上述公式我们发现 它有三个完全相同的计算阶乘的运算 若我们把计算阶乘的程序拿出来 作为一独立的过程 那么计算这道题目的程序结构就变得非常简单了 程序如下 programaa varL m n integer a b c real x longint procedurefac k integer vari integer f longint beginf 1 fori 1tokdof f i x f end 测试数据 输入 m n 107输出 120 beginwrite m n read m n ifm nthenL 1elseL m n fac m a x fac n b x fac L c x c a b c writeln c 0 0 end 例3 利用自定义过程求任意两个整数的乘积 将求两个整数乘积的程序段设为一个过程 programlkj vara b c longint proceduresum a b longint varc longint beginc a b end beginreadln a b sum a b c writeln c end 测试数据 输入 510输出 50 可以看出 Pascal的过程函数相似 都需要先定义后调用 但有以下几个主要差别 1 函数通常被设计成求一个函数值 而过程通常被设计成能得到若干个运算结果 也可以用来完成一系列的数据处理或与计算无关的各种操作 2 调用方式不同 函数的调用出现在表达式中 而过程调用 是由一个独立的语句 过程语句 来完成的 3 过程没有类型 也不能给过程名赋值 4 返回值的实现方法不同 函值返回时 只由函数名带回一个函数值 过程返回时 可由实参将运算的值带回 需要时可以带回多个值 引入函数和过程 相当于在程序中引入了可以按名引用的模块 之后 Pascal中的程序获得了简化 Pascal的过程和用户自定义函数的参数传递 局部变量等都将给程序以全新的面貌 更重要的是过程和函数还具有完全递归的功能 所谓递归就是一个函数或过程可以直接或间接地调用自己 关于这方面的知识 将在下面专门介绍 1 programg5 varx y z integer proceduresy x integer vary integer varz integer beginx 5 y 6 z 7 writeln x y z end beginx 1 y 2 z 3 sy y x writeln x y z end 输出 练习二 判断程序运行结果 2 programg6 vary t integer a b real proceduref m integer vars k real beginy 2 y s s y k s 4 k k s y end beginread y a f y a b writeln a 0 2 b 10 2 end 输入 12输出 3 文件名 g7 pas 利用自定义过程求任意两个整数的和 将求两个整数和的程序段设为一个过程 测试数据 输入 105输出 15 4 文件名 g8 pas 将求两个数的最小公倍数的程序设定为一个过程 编程求任意两个数的最小公倍数 测试数据 输入 128输出 24提示 求最小公倍数过程procedureabc m n longint vary longint beginy m whiley m ndobeginifymodn 0thenbreak y y m end end 子程序中的参数 局部量 全程量与作用域我们知道 程序有变量说明 过程与函数也有变量说明语句 凡在程序中使用到的量 均必须先说明后使用 这是Pascal语言所具有的一个特点 同样 在过程与函数内部使用的变量 也应该在本过程或函数中加以说明 这种在子程序内部说明的变量 称之为局部变量 另外 将那些在程序开头的说明部分中加以定义与说明的量 称为全程量 在不同的说明语句部分所说明的变量 在程序中对此变量进行存取的适用范围是不同的 我们将其适用的范围称之为作用域 局部变量的作用域为所在子程序 由于形式参数只在所在子程序中有效 因此也属于局部变量 programaa vara integer procedureadd x integer vara1 integer begina1 x 10 writeln a1 a1 end begina 15 add a writeln a a end 请思考 哪个是局部量 哪个是全程量 各自的作用域是什么 测试数据 输出 a1 25a 15 关于这个问题 我们来看下面的一个例子 局部变量的作用域的实质我们可以这样来理解 当其所在的子程序被调用时 局部变量才分配有确定的存储单元 而当程序的执行一旦返回到调用程序时 局部变量所占用的存储单元就被释放 至于全程变量的作用域 情况就要复杂一点 我们还是先来看以下的一个例题 programaa vara b integer proceduresub vara integer begina 0 writeln a2 a b2 b a a 10 b b 10 writeln a3 a b3 b end 测试数据 输出 a1 15b1 20a2 0b2 20a3 10b3 30a4 15b4 30 begina 15 b 20 writeln a1 a b1 b sub writeln a4 a b4 b end 值参数与变量参数 前面我们提到 Pascal语言中过程与函数的主要参数种类有值参数与变量参数 变量参数在形式上比值参数多了一个前缀VAR 但两者不仅含义不同 且相应的实在参数的个数 顺序和类型都必须与形式参数一一对应 FreePascal在处理数据传送时有三种方法 一种是传名 一种是传值 另一种方法是传地址 传名就是通过全程量传递数据 变量在主程序中定义 在子程序不被重新定义而被使用 那么它在主程序和子程序中就是同一个变量 所以在调用函数或过程时其值发生改变 返回主程序 它的值仍然是改变的 它的用法比较简单 在此就不作详细介绍了 下面主要说明传值和传地址两种传值方法的使用 在调用过程或函数时 传值就是把一个调用语句中的实在参数的值 赋给对应的形式参数 一旦过程 或函数 执行完了 相应分配给形式参数的存储单元就被释放 其值也随之消失 相应实参的值并没有发生变化 也就是说 实在参数的值仅向形式参数作单向传送 形式参数的值发生变化不会反过来影响实在参数的值 例如函数调用时就是采用了 按值传送 的方法 返回时只由函数名带回一个函数值 programaa vara integer procedureadd a1 integer begina1 a1 20 writeln a1 a1 end begina 10 add a writeln a a end 执行结果为 a1 30a 10 FreePascal的过程也可用值参数方法传递数据 请看下例 请注意两个打印结果 A1是值参数 在过程语句开始执行时 实参数A的值10传递给A1 经过过程体的运算 A1的值结果为30 此时输出A1 30 然而 当过程执行完毕返回主程序时 原实在参数A的值并未受影响 打印结果仍为10 此例体现了Pascal语言 按值传送 方法的一个规则 变量和表达式能用传值方法来传送数据 一般说来 只要在过程或函数中不出现对实参变量的赋值操作 实参变量的值是不会因调用过程或函数而变更的 实参变量对过程或函数而言是全程变量 传地址是指将实在参数在内存的存储单元的地址分配给形式参数 也就是说 实在参数与形式参数实际上共同一个存储单元 传地址的优点是被调用的过程能够影响传送给它的变量的值 从而能把信息传给调用者 这是因为 按址传送 方法实质是在传指针 它指向数据存储的地址 所以过程知道变量存放什么地方 因而能够对其进行读 写操作 以下的例子就是用 按址传送 的方法进行的 程序中 实参A起了双向传递数据的作用 即把实际参数A的存储单元的地址传递到过程的形式参数C 在过程体中进行运算后 再把结果带回主程序输出 由此可知 用传地址方法传送的变量值能被调用的过程改变 programaa vara integer procedureadd varc integer beginc c 10 writeln c c end begina 10 add a writeln a a end 运行结果 c 20a 20 从上面两例的对比中可以看出 实参数据的单 双向传递 是由过程定义中相应的形参种类所决定的 利用变量形参是从一个过程中传回数据的主要手段之一 综上所述 我们可以得到如下的结论 FreePascal中的参数若是值形参则参数传递必为传值 若形式参数为变量形参 则传地址 由于值形参的作用仅仅是将子程序外部的值传递给过程或函数 因此又称值参数是输入参数 所以对应的实际参数可以是常数 变量或表达式 而变量参数除了能将子程序外部的数据传递给过程或函数 更重要是它能将子程序中变化的形式参数的值带出来 所以又将变量参数称之为输出参数 其对应的实际参数必须为变量 programg9 varx y integer procedurepd a integer varb integer begina 1 b a b end beginx 10 y 20 pd x y writeln x y 5 end 输出 1 判断程序运行结果 不准在计算机上运算 只能用笔算 练习三 programg10 varx integer procedurepr varz integer beginz z 100 write x x end beginx 10 pr x x 100 writeln x x end 输出 2 判断程序运行结果 不准在计算机上运算 只能用笔算 3 判断程序运行结果 programg11 vara b integer proceduresub vara integer begina 0 writeln a2 a b2 b a a 15 b b 20 writeln a3 a b3 b end begina 5 b 10 writeln a1 a b1 b sub writeln a4 a b4 b end 4 文件名 g12 pas 将求梯形面积的方法设计为一个过程 利用这个过程 现在输入任意上底 下底和高的值 求梯形的面积 底 高 面积的值均为实型数 最后结果保留二位小数 测试数据输入 三个数 分别是上底 下底和高 数字间隔一空格2 53 56 6输出 19 80 函数 1 标准函数 我们已经接触过一些FreePascal提供一些内部标准函数 供编程时调用 象求 X 可调用ABS X 求可调用SQRT 49 等等 实际上 这些函数是一些包含在FreePascal系统中供用户调用的程序模块 分别命名为 ABS SQRT 等 因而 只要在程序中遵照一定的调用规则 写出某一函数名以及此函数所需的参数 系统就会自调用这些程序模块 求得运算结果 如 ABS X SQRT 12 X 等等 2 自定义函数系统提供的这些内部标准函数 虽然使用起来十分方便 但其中种类和数量毕竟有限 不可能包含用户的所有需要 在实际问题中 经常会遇到诸如求N 这一类的运算 系统中则没有提供相应的函数可供调用 为此 FreePascal允许用户自行定义一些函数 我们称之为自定义函数 这种自定义函数一经定义 就可象内部函数一样 通过函数名调用它 但要注意 这些函数必须在程序中定义 也只能在本程序中使用 自定义函数的定义格式 FreePascal自定义函数用FUNCTION语句开始 每个自定义函数均由函数的首部和函数体组成 定义格式如下 Function函数名 形参表 函数类型 函数首部 说明部分 Begin 函数体 语句块 函数名 表达式 必须有 函数运算结果通过函数名带出函数体 End 函数首部 1 函数首部以保留字Function开头 其后的函数名必须与保留字之间有一个以上的空格 2 函数名是对用户定义的一个函数的标识 用于存放调用后的函数值 函数名与标识符的构成规则相同 在同一程序中 所定义的函数名 不能用作变量数组或过程名 3 圆括号中的形参表是用逗号隔开的一个或多个形参名 形参名由用户自己决定 所有形参都必须同时说明类型 不同类型的说明之间用分号隔开 例如 FunctionEX01 X Y Real m n integer real 形参即函数的自变量 其初值来源于函数的调用 只有在程序执行过程中调用了函数 形参才有可能得到具体的值并参与运算 求得函数值 可见形参表相当于变量说明 但应特别注意 此处只能使用类型标识符 而不能直接使用类型 若函数没有自变量 则形参表可以缺省 称为无参函数 此时函数的定义形式为 Function函数名 函数类型 函数首部 4 函数的类型也就是函数值的类型 它由函数首部来说明 所求得的函数值通过函数名传送回调用程序 由此可见函数的作用一般是为了求得一个值 函数体 函数体也由说明与执行部分组成 1 说明部分用来对函数体内所用的类型 常量 变量等进行说明 这些量只在本函数内有效 与函数体外的同名量无关 2 函数体的执行部分以BEGIN开始 以END结束 其后紧跟一个分号 中间为语句块但至少要有一条赋值语句 即 函数名 表达式 该操作把表达式的值赋给函数名 然后把这个值通过函数名返回调用它的程序中去 功能 自定义函数定义了一个求值的模块 当一个语句中使用了这个函数时 这个模块才被调用执行 例1 用函数求a b c的值的程序是 参考程序 programaa vara b c longint functionadd a b longint longint vars longint begins a b add s end beginread a b c add a b writeln c end 测试数据 输入 89877798输出 16785 该程序中的ADD函数 就演示了函数结构 函数的调用函数一经定义 就可以在同一程序中与函数值类型兼容的表达式中多次被调用 其调用形式如下 变量 函数名 实在参数表 函数调用的说明 1 自定义函数中的形参称为形式参数 由于它不是实际存在的变量 所以又称虚拟变量 例如 前面所举例子中的X即为形式参数 它们并不占用内存单元 只有在调用函数时 才临时开辟相应的内存单元 存放实在参数的值 所谓实在参数是在调用函数时所用的自变量 只是在调用函数时 才将实在参数的值传送到相应于形参的临时的内存单元中去 形参实质上是实参的一个 替身 和 代办 实参在程序中可以千变万化 但 代办 只有一个 从而保证了一个子程序可被多次调用 通常 将这种数值传送称为 参数传值 在调用函数时 实在参数将值赋给形式参数 因而 必须注意实在参数的个数 类型应该与形式参数一一对应 并且必须要有确定的值 2 函数调用的步骤为 计算实参的值 传送给对应的形参 然后执行函数体 最后将函数值返回到调用处 3 函数说明是静态的 不具备执行的含义 也就是说 如果一个函数说明之后未被调用 则该函数永远不会被执行 1 文件名 h1 pas 将求两个整数的差设计为一个函数 然后求任意两个整数的差 测试数据 输入 987788788输出 89990 练习一 2 文件名 h2 pas 将求三角形的面积设计为一个函数 然后求任意底和高的三角形的面积 保留二位小数 测试数据 输入 10 22 5输出 12 75 3 文件名 h3 pas 利用标准函数 对输入的一个长度不小于8的字符串 分别输出它的长度 第2个字符和第5个字符 不同的输出结果之间间隔一个字符 提示 用到的函数有length copy测试数据 输入 asdf3536sdf输出 11s3 4 文件名 h4 pas 输入两个字符串 判断第一个字符串在第二个字符串中的起始位置 两个字符串位于两行 提示 用到的函数有pos测试数据 输入 abcdasdfabcdsdffsf输出 一行 起始位置5 5 文件名为h5 pas 编一程序 将摄氏温度换为华氏温度 公式为 其中f为华氏温度 c是摄氏温度 将上述公式编为一个函数 要求输入摄氏温度 输出华氏温度 保留两位小数 例2 先编写一个自定义函数用以求X2 5X 4 然后再通过主程序调用此函数 分别求Y1 32 5 3 4 Y2 A 5 2 5 A 5 4 自定义函数应用举例 programaa vary1 y2 a integer functionfun x integer integer beginfun x x 5 x 4end beginwrite inputa read a y1 fun 3 y2 fun a 5 writeln y1 y1 writeln y2 y2 end 测试数据 输入 inputa 2输出 y1 2y2 18 程序如下 例3 现设计一个函数完成乘方运算 当然可以用power函数来实现 分析 根据数学知识乘方运算的定义是 而当n 0时 programaa varx y real n integer functionfc x1 real n1 integer real vari integer t real begint 1 ifn1 0thenfori 1ton1dot t x1 ifn1 0thenfori 1to n1dot t x1 fc t end beginread x n y fc x n writeln y 0 2 end 测试数据 输入 23输出 8 00 例4 设计一个函数digit n k 它能将自然数N的从右边开始的第K位上的数字取出来 例如 digit 13579 3 5digit 2468 6 0调用此函数 求出3次输入后 得到的第K位上的数字之和 分析 为了取得一个数的第K位 可将其右边K 1位数字去掉 即 k 1次 NDIV10 所得到数的个位就是所求的数字 程序如下 programaa varn1 k1 j s longint functiondigit n k longint integer vari integer beginn abs n fori 1tok 1don ndiv10 digit nmod10 end 测试数据 输入 13375625345345346988093输出 18 begins 0 forj 1to3dobeginreadln n1 k1 s s digit n1 k1 end writeln s end 例5 求出正整数N M之间的完全数 N M 分析 所谓完全数是指它的因子之和等于它本身的数 如 6 1 2 3 为了判定完全数 可以定义一个布尔函数 若是完全数 其值为TRUE 否则为FALSE 程序如下 programaa varm n i integer functionperfect x integer boolean vart s integer begins 1 fort 2toxdiv2doifxmodt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船舶建造合同
- 2025年废旧电子产品回收处理行业政策与法规解读报告
- 防雷应急预案模板
- 2025新能源企业技术创新转化效率与产业链协同报告
- 金融风险管理与控制能力模块
- 基于大数据分析的工地安全事件趋势预测
- 国际工程SPEC管理的绿色可持续发展策略
- 2025年新能源行业企业绿色能源消费市场前景报告
- 城市资源管理中韧性评估模型的应用现状与发展
- 主题公园沉浸式体验设计在2025年的情感互动装置研发与项目开发报告
- 《国家学生体质健康标准》登记卡
- 七年级数学上册《数轴、相反数、绝对值》专题练习(含答案)
- 公安消防队员招录政审表
- 人教版数学六年级上册分数除法《分数除法之和倍、差倍问题》课件
- 安徽省合肥市庐阳区2024-2025学年九年级上学期第一次段考物理试卷(无答案)
- GB/T 44273-2024水力发电工程运行管理规范
- 2025电力建设工程绿色建造评价规范
- 职业技术学校《传感器技术与应用》课程标准
- 抖店员工账号劳动合同
- 医学细胞生物学细胞的内膜系统
- 文化旅游项目策划案课件
评论
0/150
提交评论