《Delphi-第三章-Delphi基本程序设计.ppt》由会员分享,可在线阅读,更多相关《Delphi-第三章-Delphi基本程序设计.ppt(27页珍藏版)》请在三一办公上搜索。
1、第三章 Delphi基本程序设计,本章知识点和基本要求,顺序结构选择结构循环结构过程与函数掌握顺序结构、选择结构、循环结构的使用方法掌握过程与函数的定义和使用规则理解重载的含义。,顺序结构,顺序结构是程序设计中最简单、最常用的基本结构。在该结构中,各操作块(简称块,对应于程序中的“程序段”)按照出现的先后顺序依次执行。它是任何程序的主体基本结构,即使在选择结构或循环结构中,也常以顺序结构作为其子结构。,选择结构,分支语句根据用户输入或程序运行的中间结果来确定转向执行哪个分支流程。Object Pascal提供的if语句和case语句用来实现程序的分支结构。if语句(1)if.then 语句语法
2、:if 表达式 then 语句 注意:1、复合表达式书写注意运算符的运算优先级。每一个表达式用括号括起。2、语句若为复合语句,注意使用begin和end。例:输入长和宽,计算矩形面积和周长。,选择结构,(2)if.then.else语句语法:if 表达式 then 语句1 else 语句2;注意:1、在语句1末尾(else之前)不能加分号。2、else的配对。If 条件表达式 then if 条件表达式 then 语句11 Else 语句12若else要与第一个if配对,则应改为If 条件表达式 then begin if 条件表达式 then 语句11 endElse 语句12,例:var
3、x,y:integer;beginx:=5;y:=100if x10 then y:=200else y:=300;write(y)end;,例:分段函数例:将任意输入的三整数按从大到小顺序显示,选择结构,例:编写VCL程序,界面及功能要求如图function InputBox(const ACaption:string,const APrompt:string,const ADefault:string):string;procedure ShowMessage(const Msg:string);,选择结构,例:编写一个程序,用于判断输入的年份是不是闰年。注:是闰年的条件必须满足下列条件之
4、一:(1)能被4整除,但不能被100整除的年份;(2)能被400整除的年份。,选择结构,选择结构,嵌套过多的if语句往往分不清if与else的匹配关系,影响程序的清晰,有碍阅读。对于多分支的结构宜采用case 语句。其语法格式如下:case 选择表达式 of 情况常量1:语句1;情况常量2:语句2;情况常量n-1:语句n-1;else 语句n;end;,选择结构,注意:的值必须是顺序类型(如整型、字符型、布尔型、子界型等)。中的值应该是可能具有的值,各常量之间用逗号分隔。所有常量表中的值必须互不相同。可以是简单语句,也可以是复合语句。例:教材例题。例:修改成绩判断题,根据成绩按“优秀”、“良好
5、”、“中等”、“及格”和“不及格”等输出。思考题:输入两个整数,分别代表年、月,输出该月的天数。(提示:注意闰年的情况。),循环结构,循环语句可以使一个语句块(循环体)重复执行,它是实现复杂程序流程的基础之一。Object Pascal提供了三种循环语句:while语句、repeat语句、for语句。,1.while语句(“当”型)特点:先判断,再循环。其语法形式如下:while 条件表达式 do 循环体;注意:循环体若为复合语句要在begin和end;之间。例:求前n个自然数的累加和。例:用户输入任意字符串,若字符串中包含字符0,则去掉0后显示,并统计去掉0的次数。,循环结构,2.repea
6、t语句(“直到”型)特点:先循环,后判断,最少循环1次。其语法形式如下:,repeat语句1;语句2;until 条件表达式;注意:这里不必把多个语句的循环体用begin和end括起来。,例:从1开始累加,当累加和刚刚大于79时,显示最后一个被累加的数及累加和。,循环结构,3.For语句语法格式:for 循环变量=初值 to 终值 do 循环体;for 循环变量=初值 downto 终值 do 循环体;特点:已知或可计算循环次数。和前两种循环不同,for循环中循环变量会随循环次数自动递增1或递减1,无需在循环体内控制循环变量(循环次数在进入循环前已确定,在循环体内更改会出现编译错误)注意:pa
7、scal中for循环本身无法控制步长(为1)For i:=初值 to 终值 div step do J:=初值+(i-1)*step;,例:斐波那契(Fibonacci)数列问题,作业:1.输入一行字符,计算其中数字字符的个数2.计算表达式1!+2!+3!+-+50!的值3.按从大到小的次序,输出从1到1000之间所有能同时被3和7整除的数4.编写一个简略计算个人所得税的程序,收入在3000元以下,交3%;收入在3000到5000元(含3000),交6%,收入在5000到10000元(含5000),交10%,10000元及以上的,交15%。,循环的嵌套,例:求小于给定数的素数。对于有规律的复杂
8、问题,嵌套是很好的解决方法。在多重循环中,内循环和外循环是相对的,嵌套的层数是任意的,但算法的时间复杂度会随层数成指数级增长,程序可读性也会降低,一般来说,不宜超过三层。例:求从1到指定数内奇数的阶乘之和。例:“百钱百鸡:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?”break:强制退出循环,一般用在循环体内的if结构中。continue:短路循环。例:求不能被3整除的自然数的和(S=1+2+4+5+7+N),和不超过1000。显示S及N的最大值。,过程与函数,Delphi中,有许多预先定义好的子程序,它们统称为运行库。Object Pascal也允许程序员
9、自己定义子程序。子程序的引入,降低了程序的复杂性。编写子程序还可以提高代码的重用率。子程序实现的功能相对独立。如此,将大大提高程序编写和维护的效率。Object Pascal的子程序分为两种:过程(procedure)和函数(function)。过程和函数都是实现一定功能的语句块,可被其他模块调用,也可自身进行递归调用。过程和函数的区别主要在于过程本身没有返回值,而函数有一个返回值。,过程,过程声明procedure 过程名(形参表);begin end;过程名即过程标识符。局部声明部分用于声明仅限于该过程内引用的常量、自定义数据类型、变量、过程和函数等。参数表内声明参数的个数和类型,同类型参
10、数之间以逗号分隔,不同类型参数之间以分号分隔。例:编写求阶乘过程。,函数,函数声明function 函数名(形参表):返回数据类型;beginend;函数首部除了声明函数的标识符、形式参数表以外,必须在冒号之后声明函数返回数据类型。局部声明部分与过程的局部声明部分类似。函数名本身作为一个特殊的变量,与系统预先定义的变量Result一样,可在函数体中接受赋值,用来存储函数返回值。例:编写求阶乘函数。,参数,过程或函数调用时,调用语句中传递给过程或函数的参数称为实际参数,简称实参。过程和函数首部中声明的参数称为形式参数,简称形参。实参的个数、数据类型和顺序必须与形式参数一一对应,若出现数据类型不符
11、,编译器会将实参的数据类型进行转换(如整型到实型),多个参数之间用逗号隔开。形式参数,以及过程和函数局部声明的各种标识符均为局部的,即它们的作用范围只在该过程或函数中,在局部范围内有效。,参数,形式参数分为三类:值参数(简称值参)、常量参数和变量参数(简称变参)。三者在声明时的修饰和实参的区别分述如下:值参数声明时,形参的前面无任何修饰,值参传递的是一个值。调用时,实参的值拷贝给形参,形参值的改变不影响其对应实参的值。常量参数声明时,形参的前面用保留字const修饰。常量参数的传递形式本质上类似于值参,但在子程序中,它相当于局部的类型常量,不能对常量参数进行赋值。常量参数的使用可以防止子程序对
12、实参的修改。,参数,变量参数声明时,形参的前面用保留字var修饰。变参传递的是一个变量的地址,即实参把地址传递给变参,这样变参和实参指向的是同一地址空间,因此,在过程和函数中对变参的修改,直接影响实参。显然可以利用变参为被调子程序(函数或过程)“传递”数据给主调程序。在函数或过程定义中,可以给值参数设置一个默认值。在调用子程序(过程或函数)时,如果没有提供相应的实参,那么子程序即以默认值作为初值。注意:参数的默认值只能从参数表的右边开始默认,且中间不能跳跃,此外,变参不能设置默认值。例:见下页,函数和过程的重载,procedure FillArray(a:array of Integer;va
13、lue:Integer=0);值参value是默认参数,缺省值为0,可以有如下两种调用方式:FillArray(MyArray);/参数value使用缺省值0FillArray(MyArray,10);/参数value指值10函数和过程的重载过程和函数重载是指定义多个名称相同,而参数列表不同的过程和函数。编译器依据调用时实参表中参数个数和类型,自动匹配一个重载的过程或函数。重载过程和函数首部句尾应使用保留字overload修饰。例:见下页,过程和函数的重载,function add(a,b:integer):integer;overload;begin result:=a+b;end;func
14、tion add(a,b:real):real;overload;begin result:=a+b;end;function add(a,b:string):string;overload;begin result:=a+b;end;,函数和过程的重载,重载过程或函数要慎用默认参数,因为可能会导致二义性错误。如:function f1(a:integer;b:integer=10);overload;begin result:=a+b;end;function f1(a:integer):overload;begin result:=a*a;end;,过程和函数的递归调用,递归调用是指子程序(函数或过程)调用子程序自身。递归在解决某些问题时是十分有用的方法,它可以使某些看起来相当难的问题变得容易解决,写出的程序较简短,容易理解,但递归的程序执行效率比较低。例:求s=1+2+3+n。这个求和问题可以这样理解:1 当n=1时f(n)=f(n-1)+n 当n1时在如:阶乘 1 当n=1时f(n)=f(n-1)*n 当n1时,例:用递归调用的方法,编写函数,在屏幕上显示给定层数图形。如xh(10),