欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第7章 过程与函数课件.ppt

    • 资源ID:14873922       资源大小:1.05MB        全文页数:127页
    • 资源格式: PPT        下载积分:40金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要40金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第7章 过程与函数课件.ppt

    目录大纲第七章 过程与函数7.1 过程 7.1.1 事件过程的创建与调用 7.1.2 通用过程7.2 函数 7.2.1 函数的定义 7.2.2 函数的应用举例7.3 参数传递 7.3.1 变量参数 7.3.2 值参数和常量参数 7.3.3 默认参数7.4 子程序的嵌套与递归 7.4.1 子程序的嵌套 7.4.2 子程序的递归7.5 变量的作用域 7.5.1 公有变量和私有变量 7.5.2 全局变量和局部变量7.6 小结 过程(procedure)与函数(function)是实现面向对象编程思想的重要手段。在Delphi中将各个功能模块做成函数或者过程的形式,供程序不同位置的调用,被调用的函数和过程也成为子程序。使用函数和过程不仅可以将一个大的、复杂的问题简单化,而且还可以使程序更加清晰、条理。 过程与函数的区别在于过程没有返回值,而函数有返回值。一般来说定义过程的目的是为了实现某个功能、执行某个操作,而定义函数的目的在于计算得到某个值。7.1 过程 在Delphi中过程分为系统标准过程和自定义过程。系统标准过程是系统内部定义的,无需定义即可直接调用,如第二章所讲的过程EncodeDate过程,用户无需定义它,即可直接调用实现将年、月、日合并成为日期类型的功能。自定义过程也分为两类,即事件过程和通用过程。 事件过程的执行有两种方式,一种是事件驱动,即一个事件发生了,系统自动执行相应的事件过程,还有一种就是调用并执行事件过程。事件过程与对象有关,是Delphi应用程序中最重要的过程。 通用过程不依附于对象,通用过程一般用来执行某些操作,完成某个功能。有些功能代码在程序的多处出现,我们把它做成过程,在多处调用它,这样可以使得程序清晰、简洁,避免书写重复的代码,这就是我们设计通用过程的理由。为了加深对过程以及过程调用的理解,我们需要重新回顾一下事件过程的定义和调用。7.1.1 事件过程的创建与调用 在对象监视器中选择某个对象(或者在窗体中单击该对象),然后在对象监视器的“Event”页中选择相应的事件并双击右边的空白区域,Delphi将自动产生一个默认的事件过程。事件过程的名称是对象名加上事件类型名,如Button1的OnClick事件对应的事件过程就是ButtonClick。 当一个事件发生后,Delphi会自动执行相应的事件过程。当然,一个事件过程也可以被多个事件甚至多个对象共享。方法是,首先为某个事件创建事件过程,然后在创建其它事件的事件过程时,从事件名称右边的下拉组合框中选择已经建立的事件过程名称即可。 共享事件的好处是,当共享事件过程的多个事件中任何一个事件发生时都会执行事件过程。有时候很多相似组件共享事件过程可以减少代码的编写。 【例7-1】在窗体上添加组件Image1Image9共9个Image组件,添加Shape组件若干,用于做Image组件的边框。设计界面如图7-1所示。 本程序是两人对弈,双方在9格的棋盘上先后布棋,单击Image在Image上显示不同的图片(圆或者叉),哪方的三个图片先成一条直线,哪方获胜。 图 7-1 程序界面 步骤如下: (1)将Image1Image9的tag属性分别设置为19。 (2)定义全局变量: n:integer; flag:array1.9of integer; 说明: n用于控制步数,奇数和偶数步分别布“叉”棋和“圆”棋。 Flag数组用于判断某个位置的棋的性质: flagx= -1:表示x位置没有布棋; flagx=0:表示x位置布“圆”棋; flagx=1:表示x位置布“叉”棋。 (3)在TForm1.FormCreate事件过程中将所有位置的棋子置为没有布棋(flagi:=-1,I从1到9),将n置初值为0,以后每布一颗棋子n就加1。代码如下: procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin n:=0; /还没有布棋子 for i:=1 to 9 do flagi:=-1; /9个Image均没有布棋子 end; (4)在对象监视器中选定9个Image组件,在Event中选择OnClick事件并双击空白区域,编写如下代码: procedure TForm1.Image9Click(Sender: TObject); begin if (flag(sender as timage).Tag=-1) then /如果该位置没有布棋子 begin n:=n+1; if n mod 2=0 then /偶数布“圆”棋子 begin (sender as timage).picture.loadfromfile(yuan.bmp); flag(sender as timage).Tag:=0; /布子后,做上标记 end else /奇数布“叉”棋子 begin (sender as timage).picture.loadfromfile(cha.bmp) ; flag(sender as timage).Tag:=1; /布子后,做标记 end; end; /省略判断胜负的代码 end;(5)运行程序,界面如图7-2所示。 图 7-2 程序运行结果 说明: (1)本程序9个Image组件的OnClick事件都共用同一个事件过程,这样显然节省代码编写工作量。 (2)我们容易知道本程序中被单击的组件表示为(sender as timage),因此可以很方便地为它设置picture属性。 (3)全局变量n用于控制布棋的奇偶步数,根据n是否能被2整除可知目前应该布 “叉”棋还是布“圆”棋。 (4)tag的作用有两个。一是用于区分不同位置的Image组件,这样可以方便设置该位置的棋子属性(是否有棋,有什么棋);二是用于判断胜负,例如:flag(sender as timage).Tag(tag为1、2、3的时候)的值都是0,显然说明“圆”棋获胜等等。请读者自己完成判断获胜的代码。 (5)上面是9个组件共用一个事件过程。当然,也可以只为Image9编写过程TForm1.Image9Click。而在Image1Image8的事件过程中调用TForm1.Image9Click事件过程。例如: procedure TForm1.Image1Click(Sender: TObject); / Image2 Image8类似 begin Form1.Image9Click(Sender) end; 还可以写成: procedure TForm1.Image1Click(Sender: TObject); begin Form1.Image9Click(form1.Image1) end; 通过本例,读者应该对事件过程的创建与调用有一个较深的认识。7.1.2 通用过程 通用过程要遵循先定义后使用的原则,只用经过定义的过程才能够被程序调用,过程是没有返回值的,因此过程的调用就是一个独立执行的语句。 1通用过程的定义 通用过程的定义语法形式为: Procedure (); 局部声明; begin ; end; 的格式为: Const | Var :类型 说明: (1)保留字Procedure是定义通用过程的首部,过程名遵循标识符的命名规则。 (2)由若干个形式参数组成,形式参数的类型和个数都必须给定,同类型的形式参数之间用逗号隔开,不同类型的形式参数之间用分号隔开,如果没有形式参数,则括号可省略。例如: m,n:integer;var gys:integer (3)局部声明部分可以声明局部变量、常量、类型等等。 (4)程序体以begin开始,以end结束,end之后是分号。 2通用过程的调用 程序执行某个过程称之为调用,调用的格式为: 过程名(实参表); 说明: (1)实参表中的参数的个数和类型必须和形参一致,实参是按照在参数表中的先后顺序将参数值依次传递给形参的。 (2)如果形参用前冠以var,则相应的实参必须是变量,否则只需要是同类型的表达式即可。 3通用过程举例 【例7-2】编写一个过程,输出m行“*”号,要求第一行输出1个“*”号,以后每行比上一行多出一个“*”,要求使用控制台应用程序。 设计步骤如下: (1)选择“File | New | Other”出现新建项目对话框,在新建项目对话框中选择“Console Applicaion”,出现代码编辑器。 (2)在代码编辑器中输入程序,如下: program Project1; $APPTYPE CONSOLE uses SysUtils; var n:integer; procedure prin(m:integer); var i,j:integer; begin for i:=1 to m do begin for j:=1 to i do write(*); writeln; end; end; begin write(输入行数:); readln(n); prin(n); readln; end. (3)运行程序,输入行数6,结果如图7-3所示。 图 7-3 程序运行结果 说明: (1)本程序定义了变量n,在主程序和过程里面都是有效的,定义了i,j仅在过程中有效,是局部变量。 (2)形参m是整型,实参n也应该是整型。 【例7-3】编写通用过程,用于求两个数或者三个数的最大公约数。界面如图7-4所示。 分析:由于求公约数在多处出现,因此最好把它定义为子程序,以便在多处调用,鉴于目前读者只学了过程,所以本例编写通用过程来解决问题。 图 7-4 求公约数界面图 步骤如下: (1)求两个数m和n的最大公约数有一种方法将做碾转相除法,即:求m和n的最大公约数就是求n和m mod n的最大公约数,这样一来问题就变成了求n和m mod n的最大公约数了。将n看成新的m,m mod n看成新的n继续使用碾转相除法直到n为0,此时的m就是所求的最大公约数。根据分析过程gys定义如下: procedure gys(m,n:integer;var result:integer); begin repeat result:=m; m:=n; n:=result mod n; until n=0; result:=m; end; 说明:形式参数result必须定义为变量参数,以便将结果回传给实际参数,这点将在后面的章节中仔细讲解。 (2)编写Button1的OnClick事件过程如下: procedure TForm1.Button1Click(Sender: TObject); var result1:integer; begin gys(6,9,result1); panel2.Caption:=最大公约数为:+inttostr(result1); / Panel2是小面板 end; (3)编写Button2的OnClick事件过程如下: procedure TForm1.Button2Click(Sender: TObject); var result1:integer; begin gys(12,16,result1); panel2.Caption:=最大公约数为:+inttostr(result1); end; (4)编写Button3的OnClick事件过程如下: procedure TForm1.Button3Click(Sender: TObject); var result1,result2:integer; begin gys(8,12,result1); /带回的result1为8和12的最大公约数 gys(result1,18,result2); /求result1和18的最大公约数,结果由result2带回 panel2.Caption:=最大公约数为:+inttostr(result2); end;(5)运行程序,结果如图7-5所示。 图 7-5 求最大公约数 说明: 【例 7-2】的过程用于控制台应用程序,而【例7-3】的过程却用于 Windows 应用程序。另外【例 7-3】中的过程返回(或者带回)一个结果, 【例 7-2】却进行某种操作。因此活用 Delphi 过程将会为程序增色不少。 7.2 函数 和过程一样函数也是子程序的一种形式,函数与过程的区别在于函数有返回值,过程没有返回值。Delphi中的函数同样分为标准函数和自定义函数,标准函数如sin,cos、exp、datetostr等,标准函数无需定义,直接调用即可。本节讲述自定义函数,自定义函数要先定义,后调用,调用的方法和标准函数一样。7.2.1 函数的定义 自定义函数要遵循先定义后使用的原则,只用经过定义的函数才能够被程序调用,函数定义的格式是: Function ():; 局部声明; begin ; end; 的格式为: Const | Var :类型 说明: (1)保留字Function是定义函数的首部,函数名遵循标识符的命名规则。 (2)由若干个形式参数组成,形式参数的类型和个数都必须给定,同类型的形式参数之间用逗号隔开,不同类型的形式参数之间用分号隔开,如果没有形式参数,则括号可省略。例如: m,n:integer;var gys:integer (3)局部声明部分可以声明局部变量、常量、类型等等。 (4)程序体以begin开始,以end结束,end之后是分号 (5)是函数返回值的类型,函数是有返回值的。函数的返回值是通过函数名带回的,因此,在函数定义部分需要给函数名赋值,如果在函数体中不给函数名赋值,则函数的返回值就是默认值,数值型的默认值是0,布尔类型就是false,字符类型就是空字符等等。 【例7-4】编写一个自定义函数,用于求整数n的阶乘。 function fac(n:integer):int64; /返回值定义为integer容易溢出 var m:int64;i:integer; begin m:=1; for i:=1 to n do m:=m*i; fac:=m; end;7.2.2 函数的应用举例 【例7-5】求100以内的素数之和。 分析:因为本程序需要多处求素数,因此可以考虑定义一个函数用于判断某个数是否为素数。这个函数是布尔类型,返回值为true表示这个数是素数,返回值为false表示这个数不是素数。 步骤如下: (1)设计界面如图7-6所示。 (2)设置函数如下: function prime(n:integer):boolean; 图 7-6 程序界面 var i:integer; begin prime:=true; for i:=2 to trunc(sqrt(n) do if n mod i=0 then prime:=false; end; 说明:首先假设n是素数,令prime:=true,然后在2 之间寻找n的因子,如果找到n的因子则前面的假设是错误的,重新令prime:=false。如果找不到任何因子则n是素数,此时prime仍然保持为初始假设的true值。 (3)编写BitBtn1的事件过程,如下: procedure TForm1.BitBtn1Click(Sender: TObject); var s,i:integer; begin s:=0; for i:=2 to 100 do if prime(i) then s:=s+i; panel2.Caption:=100以内素数之和为+inttostr(s); end;(4)程序运行,界面如图7-7所示。 图 7-7 程序运行结果 【例7-6】求两个数的最大公约数和最小公倍数。 分析:求两个数的最大公约数可以使用碾转相除法,而最小公倍数和最大公约数有这样的数学关系,即:m和n的最小公倍数乘以它们的最大公约数刚好等于m和n的乘积。因此,只要求出最大公约数,就可以求出最小公倍数。因为二者的特殊的数学关系,本例将求最大公约数和最小公倍数定义为一个函数。 设计步骤如下: (1)设计界面如图7-8所示。设计界面如图7-8所示。 图 7-8 求公约数公倍数界面 (2)编写函数的代码如下: function divmul(m,n,flag:integer):integer; var t,a,b:integer; begin a:=m;b:=n; /在m和n值改变之前先将原值保留到a和b中以备以后使用 repeat t:=m; m:=n; n:=t mod n; until n=0; if flag=1 then divmul:=m /最大公约数 else divmul:=a*b div m; /最小公倍数 end; 说明: 由于求m和n的最小公倍数需要使用到最大公约数和m和n,所以先将m和n的值先保留到a和b中,以便在求最小公倍数的过程中使用。 本自定义函数的参数中巧妙地定义了一个flag,flag值为1就是求最大公约数的标志,flag值为其它值表示求最小公倍数。 (3)编写Button1的事件过程,如下: procedure TForm1.Button1Click(Sender: TObject); var m,n:integer; begin m:=strtoint(edit1.Text); n:=strtoint(edit2.Text); edit3.Text:=inttostr(divmul(m,n,1); /edit3中是最大公约数 edit4.Text:=inttostr(divmul(m,n,0); /edit4 中是最小公倍数 end;(4)运行程序,结果如图7-9所示。 图 7-9 程序运行结果 说明: (1)【例7-5】巧妙地将函数结果定义为布尔类型,然后在程序中根据prime(i)的值来决定是否加到s中。 (2)【例7-6】使用到参数flag,根据参数flag的值的不同,函数返回不同的值,这也是程序的巧妙之处。这两个例题各有千秋,读者应该举一反三,灵活运用。 (3)需要强调的是函数的使用必须遵循先定义后使用的原则,也就是说函数定义的代码必须写在调用程序之前。7.3 参数传递 在定义函数或过程的时候所使用的参数称之为形式参数,简称形参,在调用函数或过程的时候所使用的参数称之为实际参数,简称实参。实参和形参必须一一对应,而且对应的参数的类型也必须相同。参数传递是指调用程序按照先后顺序将实际参数一一传递给对应的形式参数。按照参数传递方式的不同,形式参数还可以分为变量参数、常量参数、值参数。7.3.1 变量参数 在过程或者函数定义的时候,如果形式参数前冠以保留字var,则表示该参数是变量参数。变量参数的值传递方式是地址传递,所谓地址传递是指实际参数将自己的内存地址传递给形式参数,这样一来形式参数实际上和实际参数表示同一个存储单元。形式参数值的改变将会影响实际参数的值。 例如,在【例7-3】中利用过程procedure gys(m,n:integer;var result:integer)求公约数,在定义过程的时候形式参数result就是变参,而过程: procedure gys(m,n:integer;var result:integer); begin repeat result:=m; m:=n; n:=result mod n; until n=0; result:=m; end; 中result的值就是最大公约数,这个变量参数的值通过地址传递给调用程序中的变量result1,在Tform1.ButtonClick中result1和变量参数result就是一个存储单元。 procedure TForm1.Button1Click(Sender: TObject); var result1:integer; begin gys(6,9,result1); panel2.Caption:=最大公约数为:+inttostr(result1); end; 说明:由于形式参数和实际参数表示同一个存储单元,因此实际参数必须是变量。7.3.2 值参数和常量参数 在定义函数或者过程的时候,如果参数前被冠以保留字const,那么该参数就是常量参数,如果参数前既没有保留字var也没有保留字const,那么该参数就是值参数。 1值参数 值参数的值的传递是按照值来传递的,即将实参的值传递给形参,形参和实参不是一个存储单元,形参值的改变,不会影响实参。 2常量参数 无论实参是否是变量,常量参数在过程中,其值不能改变。7.3.3 默认参数 在定义函数或者过程的时候,可以给形式参数指定一个默认值,指定默认值的方法是:在形式参数后按使用“=”,并给出一个具体的值。例如: Procedure printline(m:integer;n:integer=5); 对于上面定义的过程,下面的两个调用语句是等价的: prinline(a,5); prinline(a); Delphi规定,在函数或者过程定义的时候,不能让前面的形式参数有默认值而后面的参数却没有默认值。例如下面这样定义是不行的: Procedure printline(m:integer=5;n:integer); 这是因为Delphi的参数传递是从前往后依次按照顺序传递的。 【例7-7】教职工信息录入系统。教职工的信息包括姓名、性别、民族。因为教职工中男职工多女职工少,汉族教职工多少数民族教职工少,基于此,为了提高数据录入速度,在定义过程的时候将男性、汉族作为默认值。 设计步骤如下: (1)在窗体上添加组件面板Panel1、多行编辑框Memo1、单行编辑框Edit1、Edit2、Edit3、标签Label1、Label2、Label3、按钮Button1,设置属性。设计界面如图7-10所示图7-10 教职工信息输入窗口 (2)编写自定义过程完成教职工信息添加,自定义过程如下: procedure import(xm:string;xb:widestring=男;mz:string=汉族); begin xm:=xm+ ; /每个人的姓名长度可能不一样 xm:=copy(xm,1,8); /在姓名后加空格,补足8位 xb:=xb+ ; /性别之后空两个小格 form1.Memo1.Lines.Add(xm+ +xb+ +mz); end; 说明: 姓名是必须的,性别是默认的,默认值“男”,民族是默认的 (3)编写Button1的事件过程,如下: procedure TForm1.Button1Click(Sender: TObject); var a:word; begin if length(trim(edit1.Text)=0 hen a:=messagedlg(请输入姓名,mterror,mbok,1) /姓名不可少 else if length(trim(edit2.Text)=0 /性别默认,此时民族也取默认值 then import(edit1.Text) /仅有一个参数,是姓名 else if length(trim(edit3.Text)=0 /性别不默认,但是民族取默认值 then import(edit1.Text,edit2.Text) /此时,有两个参数姓名和性别 else import(edit1.Text,edit2.Text,edit3.Text); /三个编辑框都不空,三个参数,分别是姓名、性别、民族 edit1.Text:=; edit2.Text:=; edit3.Text:=; edit1.SetFocus; end; 说明: 男性和汉族是默认值。在输入时如果只输入姓名,则性别取默认值“男性”,此时即使输入民族也没有用,民族此时也取默认值“汉族”。 在输入信息的时候,如果输入了姓名、性别,若没有输入民族,此时民族取默认值“汉族”。(4)运行程序,结果如图7-11所示。 7.4 子程序的嵌套与递归 在子程序(函数或者过程)中定义了另外的子程序(函数或者过程)就称之为子程序(函数或者过程)的嵌套。在Delphi中子程序(函数或者过程)直接或者间接调用它自己就称之为递归,递归分为直接递归和间接递归。7.4.1 子程序的嵌套 子程序中可以定义子程序,而小的子程序中还可以定义更小的子程序,这就是子程序的层数。Delphi规定上级子程序必须完整地包含下级子程序,如图7-12所示,不允许局部包含,也就是如图 7-13所示的交叉包含。 图 7-13 错误的嵌套关系 图7-12 正确的嵌套关系 【例7-8】输入m,n的值求组合数C 。 分析:已知C = ,因此要想求C 可以定义阶乘函数,求出了阶乘,就可以求出C 。 根据分析,设计步骤如下:(1)设计界面如图7-14所示。 图 7-14 求组合数界面 (2)编写comb组合函数,代码如下: function comb(m,n:integer):real; var x,y,z:real; function fac(n:integer):real; var p:real;i:integer; begin p:=1; for i:=1 to n do p:=p*i; fac:=p; end; begin x:=fac(m); y:=fac(n); z:=fac(m-n); comb:=x/(y*z); end; (3)单击Button1,编写Button1的OnClick事件过程。如下: procedure TForm1.Button1Click(Sender: TObject); var m,n:integer; begin n:=strtoint(edit1.Text); m:=strtoint(edit2.Text); if nm then edit3.Text:=m必须=n! else edit3.Text:=floattostr(comb(m,n); end;(4)运行程序,如图7-15所示。 图7-15 程序运行结果 说明:这里将fac函数和comb函数的返回值都定义为real类型。因为integer或者int64表示数的范围有限。如果定义为int64只能够求出m小于等于20以内的组合数。如果定义为integer则适用范围更小。 为了防止在编辑框中输入非法的字符,可以编写如下代码: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key=#48) and (key=#48) and (keym then edit3.Text:=m必须=n! else begin comb(m,n,c); edit3.Text:=floattostr(c); end; end; (3)编写其他事件过程的代码,如下: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key=#48) and (key=#48) and (key=#48) and (key1,分为3步进行 hanno(a,c,b,n-1); /第步 s:=Move +a+ to +c; /第步 form1.Memo1.Lines.Add(s); hanno(b,a,c,n-1); /第步 end; end; (3)编写Button1的OnClick事件过程如下: procedure TForm1.Button1Click(Sender: TObject); var first,second,last:string1;n:integer; begin memo1.Lines.Clear; /清空memo first:=trim(edit1.Text); /初始塔座 second:=trim(edit2.Text); /过渡塔座 last:=trim(edit3.Text); /目标塔座 n:=strtoint(edit4.Text); /圆盘个数 hanno(first1,second1,last1,n) end; (4)运行结果,如图7-21所示。 问题: 可否将n阶Hanno塔问题分解成下面3步进行: 将a座上面的最小的圆盘移动到b座。 再将a座上剩下的n-1的圆盘移动到c座,中间可以经过b过渡。 再将b盘上的那个最小的圆盘移动到c盘上。 请读者思考。 图 7-21 程序运行结果 7.5 变量的作用域 变量的作用域是指变量在哪些范围可以使用。当一个程序包含多个子程序的时候,各个子程序中都可以定义变量,这些变量只能够在所定义的子程序中有效,称之为局部变量,而在Delphi中还允许用户定义全局的变量。7.5.1 公有变量和私有变量 在单元接口部分声明的变量称之为公有变量,公有变量可以被其它单元引用。单元接口interface决定了本单元哪些变量是公有变量。其他单元需要使用该公有变量只需要在uses部分加上该单元即可。 在单元的实现部分(implementation)部分声明的变量属于死右边量,只能被本单元使用。7.5.2 全局变量和局部变量 在子程序中定义的变量,只能够在该子程序中有效,称之为局部变量。而在子程序之前,在Implementation之后定义的变量可以被本单元所有子程序所使用,属于全局变量。 一般来说要尽量多使用局部变量,防止全局变量的副作用,如果需要在多个子程序之间交换数据则可以通过全局变量来进行。 【例7-13】在【例7-12】中,如果我们希望在移动圆盘之前显示第多少步,此时,可以考虑使用全局变量。 步骤省略,修改后的程序如下: implementation $R *.dfm var count:int64; /定义全局变量,用于表示移动的次数 procedure hanno(a,b,c:char;n:integer); var s:string; begin if n=1 then begin count:=count+1; /无论哪次调用过程移动圆盘count值都有效,也就是在上次基础上再加1 s:=第+inttostr(count)+步,Move +a+ to +c; form1.Memo1.Lines.Add(s); end else begin hanno(a,c,b,n-1); count:=count+1; /无论哪次调用过程移动圆盘count值都有效,也就是在上次基础上再加1 s:=第+inttostr(count)+步,Move +a+ to +c; form1.Memo1.Lines.Add(s); hanno(b,a,c,n-1); end; end; procedure TForm1.Button1Click(Sender: TObject); var first,second,last:string1;n:integer; begin count:=0; /移动之前count先赋值为0 memo1.Lines.Clear; first:=trim(edit1.Text); second:=trim(edit2.Text); last:=trim(edit3.Text); n:=strtoint(edit4.Text); hanno(first1,second1,last1,n) end;运行结果如图7-22所示。 图 7-22 汉诺塔运行结果 【例7-14】编写一个计算器程序。 步骤如下: (1)添加加速按钮SpeedButton1SpeedButton16,添加编辑框Edit1,添加BitBtn组件BitBtn1和BitBtn2。 图 7-23 计算器界面 2)调整这些组件的大小和位置,设置属性,见表7-1所示。界面如图7-23岁示。 表7-1 组件的属性设置 (3)首先定义全局变量: implementation $R *.dfm var op:char;one,two,result:real; /定义全局变量 (4)因为SpeedButton1SpeedButton9的代码类似,故同时选中数字按钮“1”“9”,即:SpeedButton1SpeedButton9,在Events页中选定OnClick事件,双击右边空白栏,编写事件过程TForm1.SpeedButton1Click。这样SpeedButton1SpeedButton9就共享了该事件过程。代码如下: procedure TForm1.SpeedButton1Click(Sender: TObject); begin edit1.Text :=edit1.Text +(sender as Tspeedbutton).caption; /所按键的Caption显示在编辑框 if op=#0 /尚未输入运算符,即目前所按数字键是第一个操作数 then begin one:=strtofloat(edit1.text); /第1个操作数 edit1.Text:=floattostr(one) /显示在编辑框中 end else begin /如果op#0,表示是第2个操作数 two:=strtofloat(edit1.text); /第2个操作数 edit1.Text:=floattostr(two) /显示第2个操作数在编辑框 end; end; 编写“0”的事件过程如下: procedure TForm1.SpeedButton10Click(Sender: TObject); begin if not (pos(.,edit1.Text)=0)and (pos(0,edit1.Text)=1) /如果编辑框中无小数点,且第一个字符是0,则不许继续加入0字符 then edit1.Text :=edit1.Text +SpeedButton10.Caption; /允许加入0字符 /将编辑框中的数字保存到操作数1或者操作数2 if op=#0 /尚未输入操作运算符号 then one:=strtofloat(edit1.text) /保留到第1个操作数中 else two:=strtofloat(edit1.text) /保留到第2个操作数中 end; 编写小数点SpeedButton11的事件过程,如下: procedure TForm1.SpeedButton11Click(Sender: TObject); begin if pos(.,edit1.Text )=0 /无小数点则可以输入小数点 then edit1.Text :=edit1.Text +SpeedButton11.Caption; if op=#0 /如果是第1个操作数 then one:=strtofloat(edit1.text) else two:=strtofloat(edit1.text) /第2个操作数 end; 选择“+”、“-”、“*”和“/”,即SpeedButton12SpeedButton15,编写共享的事件过程,如下: procedure TForm1.SpeedButton12Click(Sender: TObject); var s:string; begin case op of /在按运算符号之前,如果事先已经按过运算符则先运算前面的运算 /并把结果作为当前运算的第1操作数 +:result:=one+two; -:result:=one-two; *:result:=one*two; /:result:=one/two; #0:result:=one; /本次运算属于第1次运算 end; edit1.Text :=floattostr(result); one:=result; s:=(sender as Tspeedbutton).caption; op:=s1; edit1.Text :=; end; 编写“=”号,即SpeedButton16的Onclick事件过程,如下: procedure TForm1.SpeedButton16Click(Sender: TObject); begin case op of +:result:=one+two; -:result:=one-two; *:re

    注意事项

    本文(第7章 过程与函数课件.ppt)为本站会员(春哥&#****71;)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开