第3章ObjectPascal语言.ppt

上传人:sccc 文档编号:5641919 上传时间:2023-08-05 格式:PPT 页数:64 大小:1MB
返回 下载 相关 举报
第3章ObjectPascal语言.ppt_第1页
第1页 / 共64页
第3章ObjectPascal语言.ppt_第2页
第2页 / 共64页
第3章ObjectPascal语言.ppt_第3页
第3页 / 共64页
第3章ObjectPascal语言.ppt_第4页
第4页 / 共64页
第3章ObjectPascal语言.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《第3章ObjectPascal语言.ppt》由会员分享,可在线阅读,更多相关《第3章ObjectPascal语言.ppt(64页珍藏版)》请在三一办公上搜索。

1、任课教师:杨 超电子邮箱:yangchao_,测控软件设计,2,一、字符集和Pascal中的符号(1)基本字符 字母:英文字母az和AZ 数字:09 关系运算符:,=,=,赋值运算符::=算术运算符:+,-,*,/,Div(整除)其它符号:_,(,),.,#,$,3,(2)保留字与标识符 保留字:保留字由Pascal系统定义,由字母组成,可以直接使用,不能重新定义。如:begin、end、for、while、if、then、with、or、and、not、procedure、function等。,4,标识符:对常量、变量、过程、函数、方法等进行标识,以字母或下划线开头。如Integer、sin

2、gle、double、Read、Write、Bof、Eof等;标识符的最大长度为255;保留字不能作为标识符;尽量不要使用Delphi的指令字作为自定义标识符,以免引起混淆;标识符不区分大小写,使用前必须声明。注释:对程序的含义或功能的文字说明。Delphi不会执行注释,也不会编译注释,主要是增强程序可读性。注释的三种方式:(1)双斜线“/”;(2)小括号和*号:“(*”和“*)”;(3)大括号:“”和“”。方式(1)只能注释一行,方式(2)和(3)必须成对使用,可注释多行。,5,一、常量 常量用于存储内存中不变的量。在程序运行过程中,常量的值不能改变;常量声明后才可使用。声明方法:Const

3、 常量名称=常量值 或 Const 常量名称:数据类型=常量值 如:Const PI=3.1415926;Num:Integer=100;/Num=100 说明:声明常量时无需指明其数据类型。,6,二、变量 变量用于存储内存中变化的量。在程序运行过程中,既可以引用变量的值,也可以改变变量的值;变量声明后才可使用。声明方法:Var 变量名称:变量类型;如:Var N,Age,I,J:Integer;/多个变量“,”隔开 Record:Single;StudentNo:String;说明:一个Var可声明多个变量,但须指明类型。,7,三、变量的作用范围1.过程级变量:在过程里声明,只存在于该过程;

4、2.窗体级变量:在窗体单元的Private域内声明,只存在于该窗体范围,即该窗体单元的所有过程均可访问该级别变量,随窗体的结束而结束;3.公共变量:在窗体单元的Public域内声明,或紧跟在窗体变量声明之后声明的变量,或在公共单元里声明的变量;在整个程序运行期间均可访问,不过,在访问该级别变量之前,需先引用定义变量的单元文件,然后方可使用变量;若单元文件有对应的窗体,则变量名前需加入窗体名称,同使用组件。如frmMain.UserName。,8,四、变量的赋值 给变量赋值一个确定的数 StudentNo:=911023;/字符串用单引号 StudentWeight:=55;将一个变量的值赋值给

5、另一个变量 I:=J;/将变量J的值赋值给变量I 将算术表达式的值赋值给变量 Y:=sin(3*X+2.4)/Sqrt(Power(10,1.1)+4);先计算表达式的值,然后赋值 先比较运算,然后赋值:TF:=(X*Y20)And(Z0),9,表达式就是变量、常量、字符串、运算符和函数按照一定规则的组合。Pascal运算符包括算术运算符、逻辑运算符、关系运算符、位运算符、指针运算符和集合运算符等。有些运算符使用不同的数据类型,意义也会不同,如:运算符“+”可以用来求两个变量(常量)的和、合并两个字符串、求两个集合的并集。不同的运算符具有不同的优先级别。,10,一元运算符(优先级别最高):指针

6、运算符;:函数变量的地址(返回一个指针);not:Boolean否或逐位进行二进制位值反向;乘与逻辑运算符*:算术乘运算或集合的交集运算;/:浮点数的除运算;Div:整型数的整除运算;Mod:求模(整型数相除后的余数);As:安全的类型转换;,11,乘与逻辑运算符 And:Boolean或逐位的逻辑“与”运算;ShL(Shl):二进制位值左移;ShR(Shr):二进制位值右移;加减运算符+:算术加法、集合并集、字符串连接、正值或增加指针地址偏移;-:算术减法、集合差集、负值或减少指针地址偏移;Or:Boolean或逐位的逻辑“或”运算;Xor:Boolean或逐位的逻辑“异或”运算;,12,关

7、系与比较运算符=:等于;:不等于;:大于;=:大于或等于;In:属于 Is:测试对象类型是否匹配。,13,声明变量时,必须指明其数据类型,因为不同的数据类型存储的数据范围、运算方法可能不同。不论何种数据类型的变量,其值不要超出该类型的取值范围。,14,4.1 简单数据类型4.1.1 运算函数 Dec(i):变量减1后的值,等同于i:=i-1;Inc(i):变量加1后的值,等同于i:=i+1;Pred():表达式前驱的值;如:Pred(B)等于A;Succ():表达式后继的值;如:Succ(B)等于C;Ord():有序表达式的值;如:Ord(B)等于66;Low():数据类型的最小值;High(

8、):数据类型的最大值;Odd():判断是否为奇数。如:Odd(11)等于True;,15,4.1.2 整型(Integer)整型数据又可细分为多种类型(参看教材P23P24或Help文档)。常用的类型:Integer、Cardinal和Int64,但要注意:不同整数类型的变量进行运算时可能得不到想要的结果,必须进行类型的强制转换;所以参与运算的变量类型尽量一致。声明:Var I,J,K:Integer;L,M,N:Cardinal;/与LongWord类似 MM,NN:Int64;,16,4.1.3 字符型(Char)存储单个字符数据的数据类型,这些字符是在ASCII表中描述的。要想取得ASC

9、II表中的字符,可以采用两种方法:#和Char()。例如:#65和Char(65)都返回字符“A”如果想知道某个字符在ASCII表中对应的序号,使用函数Ord(),例如:Ord(Z)返回数字90。“A”“Z”:Char(65)Char(90);Char(13)、#13:回车;Char(10)、#10:换行;#10+#13、Char(10)+Char(13):换行+回车。,17,4.1.4 布尔型(Boolean)布尔型数据主要用于逻辑运算,只能取“True”或“False”两种值。建议:不要将布尔型变量用于算术运算。例如:Var TF:Boolean;If TF=True Then 可以写成

10、If TF Then If TF=False Then 可以写成 If Not TF Then,18,4.1.5 枚举型 枚举型采用列举出该类型所有可能取值的方式定义一个有序值的集合。定义方式:Type 类型名=(值1,值2,值n);在枚举类型变量中,可以用Ord(值)提取“值”对应的序号,默认情况下,“值”的序号从0开始,如:Ord(值1)为0,Ord(值n)为n-1。例如:Type TScrollStyle=(ssNone,ssHorizontal,ssVertical,ssBoth);/滚动条类型,19,4.1.6 实型 实型定义一个可以按照浮点格式进行描述的数据类型。常用的实型为Rea

11、l和Currency(货币型)。例如:Var A,B:Real;实型数操作函数:Round(A)圆整,即四舍五入后取整;Trunc(A)直接提取实型数A的整数部分;Int(A)将实型数A的小数部分变为0;Frac(A)提取实型数A的小数部分;关系:Frac(A)=A-Int(A),20,4.2 字符串类型4.2.1 变长字符串 声明:Var S1,S2:String;4.2.2 定长字符串 声明:Var S1,S2:String10;S3,S4:String25;4.2.3 字符串运算函数和过程;(添加StrUtils单元)Length(S):返回字符串的长度;SetLength(S,N):重

12、新设置字符串的长度为N;Si:表示字符串S的第 i 个字符(i从1开始);Pos(SubStr,Str):返回SubStr在Str中的位置;,21,LowerCase(S):返回字符串S全部小写的结果;UpperCase(S):返回字符串S全部大写的结果;AppendStr(S2,S1):将字符串S1添加到字符串S2的后面,并以S2为变量返回,相当于S2:=S2+S1,但本函数效率更高;多个字符串相加最好采用S1+S2+Sn。Copy(S,Ind,N):从字符串S的第Ind个字符开始,复制N个字符。若IndLength(S),则返回空串;如果Ind后字符的个数小于N,则返回Ind后面的所有字符

13、。LeftStr(S,N)、RightStr(S,N):分别返回字符串S左侧、右侧的N个字符。IntToHex(V,N):将整数V转换成N位16进制格式。,22,IntToStr(N):将整型数转换为字符串;StrToInt(S):将整数字符串转换为整数;FloatToStr(A):将浮点数转换为字符串;StrToFloat(S):将浮点数字符串S转换为浮点数;DateToStr(D):将日期数据转换字符串;TimeToStr(D):将时间数据转换字符串;DateTimeToStr(D):将日期和时间数据转换字符串;StrToDate(S):将日期字符串S转换为日期;StrToTime(S):

14、将时间字符串S转换为时间;StrToDateTime(S):将日期和时间字符串S转换为日期和时间;,23,24,4.3 结构类型4.3.1 集合类型 定义集合类型的语法格式:Type 集合类型名=Set of 序列数据类型;例如:Type TMySet=Set of 0.255;或 Type TMySet=Set of Byte;集合类型声明后,即可定义和使用集合类型的变量:Var LineNum:TMySet;LineNum:=1,4,7;思考:枚举类型与集合类型有何区别?,25,判断某元素J是否在集合里,使用 In:If J in LineNum Then 4.3.2 集合类型的使用举例T

15、FontStyle=(fsBold,fsItalic,fsUnderline,fsStrikeOut);TFontStyles=Set of TFontStyle;If ChkBold.Checked Then Font.Style:=Font.Style+fsBold/并集 ElseFont.Style:=Font.Style-fsBold;/差集注:集合里的元素与位置无关,且不能重复。,26,4.4 数组类型 数组类型表示同类数据的集合,它们共用一个名字,通过编号(索引)来访问其中的某个数据。如某个班级所有学生的名字构成一个数组。一维静态数组:声明数组时即指定数组大小。如:Var Stud

16、entNames:Array40 of String;数组元素40个,索引从0开始,直到39 TeacherNames:Array1.120 of String;数组元素120个,索引从1开始,直到120,27,一维动态数组:声明数组时不指定数组大小,程序运行过程中可随时改变其大小。如:Var StudentNames:Array of String;TeacherNames:Array of String;运行时改变其大小:SetLength(数组名,N);/设置数组大小为N例:SetLength(StudentNames,40);/设置数组大小 SetLength(TeacherNames

17、,120);/设置数组大小 SetLength(TeacherNames,135);/改变数组大小,28,如何表示机电学院14个班级学生的姓名?二维静态数组:如:Var StudentNames:Array1.14,1.40 of String;或 StudentNames:Array0.13,0.39 of String;第一个索引表示班级,第二个索引表示学生学号 二维动态数组:如:Var StudentNames:Array of Array of String;使用时:SetLength(StudentNames,14,40);/设置大小注意:数组类型一旦确定不可改变;动态数组索引始于0

18、。,29,数组有关操作说明 Low(A):返回数组A的第一个(最小)下标;如果是多维数组,返回数组A第一维的第一个(最小)下标;High(A):返回数组A的最后一个(最大)下标;如果是多维数组,返回数组A第一维的最后一个(最大)下标;A:=B:大小、类型相同的数组,可以通过赋值语句操作;如果A是动态数组,则使用nil可释放其占用内存:A:=nil;或 SetLength(A,0);改变动态数组大小时,存留下来的数据不受影响。,30,4.5 记录类型 记录类型可以用来保存一组不同类型的数据信息。定义记录类型的语法格式:Type 记录类型名=Record Field1:类型1;Field2:类型2

19、;Fieldn:类型n;End;,31,例如:Type TStudent=Record Name:String;No:String20;Sex:String2;Math,English,Physics:Real;End;数据类型定义完成后,即可定义该类型的变量。例如:Var Student:TStudent;Students:Array of TStudent;,32,记录类型的使用 给记录赋值样例:Student.Name:=Tom;Student.Math:=95.5;Students0.Name:=Tom;Students0.Math:=95.5;从记录提取数据样例:Student_Na

20、me:=Student.Name;Student_Namei:=Studentsi.Name;,33,集合、数组和记录,34,5.1 简单语句 Pascal语言中最简单、最常用的语句,用英文分号“;”分隔;如:TotalScore:=Score1+Score2;Y:=sin(3*X+2.4)/Sqrt(Power(10,1.1)+4);5.2 复合语句 多个简单语句的组合,以“Begin”表示开始,以“End”表示结束(Begin和End一定成对出现)。如:Begin Score1:=92;Score2:=98;Total:=Score1+Score2;End;,35,6.1 单分支条件语句

21、格式1:If 条件 Then;或 If 条件 Then;例如:If Score=90 Then ShowMessage(优秀);格式2:If 条件 Then Begin/一条或多条语句,以“;”结束 End;例如:If Passed=True Then Begin Inc(Life);Inc(TotalNum);End;,36,6.2 双分支条件语句 格式1:If 条件 Then Else;或 If 条件 Then Else;格式2:If 条件 Then Begin/一条或多条语句,以“;”结束 End Else Begin/一条或多条语句,以“;”结束 End;,37,6.3 多分支条件语句

22、 格式1:If 条件1 Then Else If 条件2 Then Else If 条件3 Then Else;例:根据工资计算个人所得税。,38,6.3 多分支条件语句 格式2:If 条件1 Then Begin/一条或多条语句,以“;”结束 End Else If 条件2 Then Else If 条件3 Then Else Begin/一条或多条语句,以“;”结束 End;,39,6.4 Case语句 很多情况下可以替代分支条件语句。格式:Case 条件 Of 条件1:;条件2:;条件3:Begin End;Else;End;,40,例子:Case Level Of 1:ShowMess

23、age(Low);2:ShowMessage(OK);3:ShowMessage(Good);4:ShowMessage(Better);5:ShowMessage(Best);End;注意:“Case”与“End”成对出现。,41,7.1 当型循环 当条件成立时,执行或,否则退出。格式1:While 条件 Do;或 While 条件 Do;格式2:While 条件 Do Begin/一条或多条语句,以“;”结束 End;,42,7.2 直到型循环 执行或,直到退出条件成立时退出。格式:Repeat/一条或多条语句,以“;”结束 Until 条件;与当型循环的区别:当型循环:先判断条件,若条件

24、成立,则执行或,否则退出。直到型循环:先执行或,然后判断条件,若退出条件成立时退出。,43,7.3 For循环 此循环适用于循环次数已知的情况。格式1:For 循环变量:=初值 to 终值 do;格式2:For 循环变量:=初值 to 终值 do Begin/一条或多条语句,以“;”结束 End;/这两种情况下初值必须小于或等于终值。,44,7.3 For循环 格式3:For 循环变量:=初值 Downto 终值 do;格式4:For 循环变量:=初值 Downto 终值 do Begin/一条或多条语句,以“;”结束 End;/这两种情况下初值必须大于或等于终值。,45,7.4 循环的嵌套

25、同一种循环或不同类型的循环可以互相嵌套,但要注意,外层循环必须完全包含内层循环。例如:For I:=1 to 9 Do For J:=1 to 9 Do OutPut(IntToStr(I)+*+IntToStr(J)+=+IntToStr(I*J);退出循环使用Break语句,可以用在各种形式的循环结构中。注意,使用Break语句只是退出当前层循环。用Continue语句跳出当次循环继续执行。,46,8.1 常用内部函数和常量 以下的函数在System单元定义,直接使用即可。Abs(x):返回x的绝对值;Sqr(x):返回x的平方;Sqrt(x):返回x的平方根;Sin(x)、Cos(x)、

26、ArcTan(x):返回x的正弦、余弦和反正切函数值,Sin(x)、Cos(x)中的x是弧度表示的角度。Exp(x):返回ex;Ln(x):返回x的自然对数;Pi:返回圆周率3.1415926535897932385,精度取决于编译程序时的系统。,47,Random(Range):返回一个0且小于参数Range的随机数,若缺省Range,则等同于Random(1)。使用随机函数Random(Range)之前,必须调用一次Randomize过程,来初始化内部随机函数发生器。8.2 Delphi定义函数 在Delphi的“Math”单元里定义了很多常用函数,使用时,将“Math”添加到Uses语句

27、中。InRange(x,Xmin,XMax):判断x是否在某范围内;Power(a,x):返回ax;a、x均为实数;IntPower(a,x):返回ax;a、x均为整数;,48,Log10(x):返回以10为底x的对数;Log2(x):返回以2为底x的对数;LogN(B,x):返回以B为底x的对数;Max(A,B)、Min(A,B):分别返回A、B中的最大值、最小值;Sign(x):符号函数,可能返回值为1、0、-1;IsZero(x,E):判断x是否等于0或非常接近0;E为精度 SameValue(A,B,E):判断A、B是否相等或近似相等;E为精度;EnsureRange(x,Xmin,X

28、Max):若XminxXmax,返回x;若xXmax,返回Xmax。,49,8.3 自定义函数与过程 函数、过程是独立的语句块,能够实现一定的功能,可以被其它程序块调用,也叫子程序。函数在执行后有返回值,故可作为表达式使用;过程没有返回值。函数、过程必须先定义,再编写其功能代码,最后才是被调用。如(1)在Private部分声明函数、过程:Private Procedure OutPut(Txt:String);Function JieCheng(N:Integer):Integer;Public,参数列表,参数列表,50,(2)定义函数、过程,编写其功能代码:Procedure TfrmMai

29、n.OutPut(Txt:String);Begin Caption:=Txt;End;Function TfrmMain.JieCheng(N:Integer):Integer;Var I,S:Integer;Begin If N0 Then S:=0 Else If N=1 Then S:=1 Else Begin S:=1;For I:=1 to N Do S:=S*I;End;Result:=S;/Result可以表示多种函数返回值End;,参数列表,参数列表,51,(3)函数、过程的调用:Procedure TfrmMain.BtnRunClick(Sender:TObject);V

30、ar S:Integer;Begin S:=JieCheng(10)Div JieCheng(4);/调用阶乘函数计算 OutPut(10!/4!=+IntToStr(S);/调用输出过程输出计算结果End;,52,函数、过程的参数:函数、过程通常需要传递参数,参数可分为形式参数和实际参数。在过程和函数的声明、定义时参数列表中的参数为形式参数;调用函数、过程时参数列表中的参数是实际参数。参数必须指定类型,并用“;”隔开,形式参数和实际参数的类型、顺序必须一一对应、个数相同。参数的传递有“数值传递”和“地址传递”两种:通过数值传递参数,参数值不能被改变;通过地址传递参数,参数值可以被改变,因此可

31、通过地址传递参数并返回变化后的参数值;在参数列表的形式参数前加“Var”,即可将该参数设置为“地址传递参数”。,53,例如:Procedure TfrmMain.SwapAB1(A,B:Integer);Var T:Integer;Begin T:=A;A:=B;B:=T;/返回的A、B与原来相同End;Procedure TfrmMain.SwapAB2(Var A,B:Integer);Var T:Integer;Begin T:=A;A:=B;B:=T;/返回的A、B实现了交换End;,54,在程序执行过程中,总是不可避免地出现一些异常,有些异常对程序的影响不大,而有些异常对系统而言却是

32、致命的,因此,在我们无法确定哪些异常是致命的时候,最好承认所有异常都对系统产生严重影响“错误就是错误,没有大小之分!”。有了异常就必须解决!但是,我们真能分辨所有的异常类型并解决它们吗?能分辩,但比较耗时、费力,而且,不能全部解决。怎么办?解决能解决的异常,跳过不能解决的异常!,55,Delphi提供了两种解决错误的办法:(1)Try Except 或 do nothing/可能不会执行 End;(2)Try Finally do something/如释放内存等。总会执行 End;,56,一、程序中的错误1.1 语法错误 即编写的语句不符合语法规范,是一种常见错误。如Begin和End不是成

33、对出现;句尾缺“;”;标识符、变量、函数或过程未定义;数据类型不符等。这类错误在程序编译时会显示出错信息,观察代码窗口下方的信息窗口可知错误类型及所在行号,以便修改。编译命令:Ctrl+F91.2 运行错误 程序通过了编译,但在运行期间出现错误。如一个数被零除;表达式计算结果太大溢出;试图打开不存在的文件等。观察弹出的错误信息对话框即可知道错误类型。,57,1.3 逻辑错误 程序通过了编译,也能运行,但结果不对。此时,需要在程序设计阶段通过调试工具找到这类错误并修改之。二、程序调试2.1 使用断点 按下F5键或在光标所在行的左侧空白处左击鼠标,即为光标所在行设置断点,重复此操作可取消断点。2.

34、2 运行到光标处 按下F4键,程序执行到光标所在位置。2.3 单步调试 F7键:逐行执行所有语句,也会进入过程内部执行;,58,但不会进入Delphi提供的库函数内部。F8键:“逐行”执行,若遇到函数或过程,不会进入函数或过程内部,而是执行完函数或过程,并将光标停留在函数或过程调用的下一条语句上。2.4 计算/修改变量值 在调试过程中,用光标选中变量或表达式,按下Ctrl+F7键,会弹出一个对话框,显示该变量或表达式的值;有时,在代码编辑窗口,用光标选中变量或表达式,Delphi会以气泡的方式显示该变量或表达式的值。2.5 其它 更多的调试方法参见Help文档或P166P170,59,1.以自

35、然的方式编写程序,尽量少用技巧;2.用名词和动词来命名过程。动词描述行为,名词描述该行为所操纵的数据;如果动词没有意义,那可能是在命名数据;3.确保一个过程只做一件事,并做好它,这件事应当是过程名中所提到的操作。不要编写集多种功能于一身的函数,在函数的返回值中,不要将正常值和错误标志混在一起;4.方法尽可能短,这样可以把变量发生混淆的可能性降到最小。5.使用简短的方法,这使得难以在过程一级引入错误。,60,6.不要使用全局变量。7.使用完整的词语,避免缩写。8.遵守Delphi命名惯例:字段或私有数据以F为前缀,类型以T为前缀,枚举值以代表实际类型的首字母缩写为前缀;组件采用“组件前缀+组件功

36、能”的命名惯例;9.不要编写一条过分复杂的语句,紧凑的代码并不见得能得到高效率的机器代码,却会降低程序的可理解性,程序出错误的几率也会提高;10.不要将Boolean 值True 和False 对应于1 和0 进行编程;更不要将Boolean表达式或值参与数值运算;11.重要代码要有注释。,61,12.对于组件对象和记录类型变量可以使用With结构来简化代码,提高程序执行效率,如:,With EdtUserName DoBegin Text:=;Color:=clBlue;Font.Name:=Arial;Font.Color:=clWhite;End;,With StudentInfo Do

37、Begin Name:=Tom;No:=1234567890;Sex:=男;Math:=90.5;End;,组件名称,记录类型变量名称,62,用随机函数产生100个20100之间的随机整数,赋给数组A,在Memo组件中输出数组A,各数间用“,”隔开,找出该数组的最大值、最小值,算出其平均值并输出到Memo组件中。现有2组数据 A:2,8,7,6,5,11,23,44,85,19 B:3,12,9,1,22,39,43,67,87,25 将两组数据分别读入A和B数组,在Memo组件里分别输出A和B数组;再将A和B数组中下标相同的数据相加,结果存入数组C,在Memo组件里输出C数组;最后将数组C按照从小到大的顺序排列输出。,63,利用一维数组统计一个班级学生某门功课09分、1019分、2029分、3039分、4049分、5059分、6069分、7079分、8089分、9099分以及100分的人数。班级人数由编辑框输入,分数用随机函数产生。将下表中的数据的第I行变成第I列后输出。,64,5.求全班同学每门课程的最高分、最低分、平均分。,6.将一组数据按照从小到大、从大到小的顺序输出。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号