
ASCAL程序基础PPT课件.ppt
77页PASCALPASCAL程序设计基础程序设计基础柴沟中学柴沟中学 鹿咏梅鹿咏梅一、一、 PASCAL语言基础知识语言基础知识二、二、 结构化程序设计结构化程序设计三、三、 数组与字符串数组与字符串四、四、 函数与过程函数与过程五、五、 递归递归一、一、PASCAL程序的基本结构程序的基本结构Program area;Program area;ConstConst pi=3.1416; pi=3.1416;VarVar r:integer; r:integer; s:real; s:real;BeginBegin writeln(‘enter r=’); writeln(‘enter r=’); readln(r); readln(r); s:=pi*r*r; s:=pi*r*r; write(‘s=’,s) write(‘s=’,s)End.End.程序首部程序首部说明部分说明部分执行部分执行部分Program Program 程序名;程序名;Const Const 常量说明;常量说明;Type Type 类型说明;类型说明;Var Var 变量说明;变量说明;Function Function 函数说明;函数说明;Procedure Procedure 过程说明;过程说明;BeginBegin 语句语句1 1;; 语句语句2 2;; …… ……End.End.例:已知圆的半径例:已知圆的半径r r,编程求圆的面积,编程求圆的面积s.s.ProgramProgramConstConstVarVarBeginBeginEnd.End.第一节第一节 PASCAL语言基础知识语言基础知识二、二、PASCAL字符与符号字符与符号1 1.标识符.标识符 (1) (1) 标识符的定义:标识符就是以标识符的定义:标识符就是以字母开头的字母数字序列,有效长度为字母开头的字母数字序列,有效长度为6363个字符,并且个字符,并且大小写等效大小写等效。
可以用来可以用来标示常量、变量、程序、函数等标示常量、变量、程序、函数等二、二、PASCAL字符与符号字符与符号(2) (2) 标识符的分类:标识符的分类: a. a.保留字保留字( (关键字关键字) ) 所谓保留字是指在 所谓保留字是指在PascalPascal语言中具有特定的语言中具有特定的含义,标准含义,标准PascalPascal语言中的保留字一共有语言中的保留字一共有3535个个. .PROGRAM,, BEGIN,, END,, CASE,, FUNTION,, PROCEDURE,, ARRAY,, AND,,CONST,,DIV,,DO,,DOWNTO,,ELSE,,FILE,,FOR,,GOTO,,IF,,IN,,LABEL,,MOD,,NIL,,NOT,,OF,,OR,,PACKED,,RECORD,,REPEAT,,SET,,THEN,,TO,,TYPE,,UNTIL,,VAR,,WHILE,,WITH二、二、PASCAL字符与符号字符与符号b.标准标识符:指标准标识符:指Pascal语言预先定义的标识符,具有特殊含义语言预先定义的标识符,具有特殊含义。
标准常量 标准常量 False Maxint True标准类型 标准类型 Boolean Char Real Integer标准函数 标准函数 Abs Arctan Chr Cos Eof Eoln Exp Ln Odd Ord Pred Round Sin Sqr Sqrt Succ Trunc标准过程 标准过程 Dispose Get New Pack Page Put Read Readln Reset Rewrite Unpack Write Writeln标准文件 标准文件 Input Output二、二、PASCAL字符与符号字符与符号 c c.用户自定义标识符:由你自己根据需要来定义.用户自定义标识符:由你自己根据需要来定义 选用的标识符不能与保留字和标准标识符相同选用的标识符不能与保留字和标准标识符相同 在定义标识符时可以用的字符:在定义标识符时可以用的字符:A——ZA——Z;;a——za——z;;0——90——9;;+ +,,- -,,* *,,/ /,,= =,,<><>,,<=<=,,>=>=,,< <,,> >,,( (,,) ),,[ [,,] ],,{ {,,} },,:=:=,,,;,,,,;,. .,:,,:,....,,' ',,^ ^ 注:Pasca语言除了能使用以上规定的基本符号外,不得使用任何其它符号。
三、三、PASCAL数据类型数据类型数据的一个重要特征就是它的类型,数据类型数据的一个重要特征就是它的类型,数据类型确定了数据的构成和可进行的运算确定了数据的构成和可进行的运算PascalPascal语语言是一种强类型语言,言是一种强类型语言,不同类型间不能任意转不同类型间不能任意转换,不同类型的变量一般不允许作混合运算换,不同类型的变量一般不允许作混合运算程序中出现的所有常量、变量和用户自定义的程序中出现的所有常量、变量和用户自定义的数据必须预先说明后才能使用数据必须预先说明后才能使用三、三、PASCAL数据类型数据类型PascalPascal数据类型数据类型 简单类型简单类型构造类型构造类型指针类型指针类型 三、三、PASCAL数据类型数据类型1.1.整型整型 类型 类型 数值范围数值范围 shortint (短整型) -128..128 integer(整型) -32768..32767 longint(长整型) -2147483648..2147483647 byte(字节型) 0..255 word(字类型) 0..65535 三、三、PASCAL数据类型数据类型2.实型实型 类型 类型 数值范围数值范围 real (基本实型) single (单精度实型) double(双精度实型) 三、三、PASCAL数据类型数据类型3.3.布尔型布尔型 boolean false true01逻辑真逻辑真逻辑假逻辑假三、三、PASCAL数据类型数据类型4.字符型字符型 char 字符型的值必须用字符型的值必须用单引号括起来单引号括起来,,字字母作为字符型的值时,大小写是不等母作为字符型的值时,大小写是不等价的,价的,并且字符型只允许单引号中有并且字符型只允许单引号中有一个字符,否则就是字符串。
一个字符,否则就是字符串 例:例:var var c:char; c:char; c:=‘a’ c:=‘a’四、常量与变量四、常量与变量1.1.常量常量(1)(1)常量:在某个程序的整个过程中其值不变的量常量:在某个程序的整个过程中其值不变的量2)(2)常量定义:常量定义出现在说明部分语法格式:常量定义:常量定义出现在说明部分语法格式:constconst常量标识符常量标识符1=1=常量值常量值1;1;......常量标识符常量标识符n=n=常量值常量值n;n; 常量标识符的类型由定义它的常量的类型决定 常量标识符的类型由定义它的常量的类型决定 ConstConst pi=3.1416; pi=3.1416; a=10; a=10; c=‘c’; c=‘c’; t=true; t=true;四、常量与变量四、常量与变量2.2.变量变量(1)(1)变量:在某个程序的运行过程中变量:在某个程序的运行过程中其值可以发生改变的量其值可以发生改变的量(2)(2)变量说明:变量说明出现在说明部分。
语法格式:变量说明:变量说明出现在说明部分语法格式:varvar变量标识符列表变量标识符列表: :类型类型; ;......变量标识符列表变量标识符列表: :类型类型; ;varvara,b,c:integera,b,c:integer;;m,n:real m,n:real ;;五、运算符和表达式五、运算符和表达式1.运算符运算符 a.算术运算符算术运算符 运算符 运算 运算对象 结果类型 运算符 运算 运算对象 结果类型 + 加 加 整型、实型 只要有一个运算对象是实型,结果就整型、实型 只要有一个运算对象是实型,结果就 - 减 减 整型、实型 是实型,如果全部的运算对象都是整整型、实型 是实型,如果全部的运算对象都是整 * 乘 乘 整型、实型 型并且运算不是除法,则结果为整型,整型、实型 型并且运算不是除法,则结果为整型, / 除 除 整型、实型 若运算是除法,则结果是实型整型、实型 若运算是除法,则结果是实型 div 整除 整除 整型 整型整型 整型 mod 取余 取余 整型 整型整型 整型 5 div 3=15 mod 3=2 五、运算符和表达式五、运算符和表达式 b.逻辑运算符逻辑运算符 运算符运算符 运算运算 运算对象运算对象 结果类型结果类型 not 逻辑非 布尔型 布尔型逻辑非 布尔型 布尔型 and 逻辑与 布尔型 布尔型 逻辑与 布尔型 布尔型 or 逻辑或 布尔型 布尔型逻辑或 布尔型 布尔型 xor 逻辑异或 逻辑异或 布尔型布尔型 布尔型布尔型① not (非) 条件为True时,其结果值为False;否则为True;(取反)not(3<4)② and (与) 两条件都为True时,其结果值为True;否则为False; ③ or (或) 两条件中只要有一个为True ;其结果值为True;否则为False; ④xor (异或) 两条件的逻辑值不相同时,其结果值为True;否则为False;五、运算符和表达式五、运算符和表达式 c.关系运算符关系运算符 运算符 运算符 运算运算 运算对象 运算对象 结果类型结果类型 = 等于 简单类型 布尔型 等于 简单类型 布尔型 <> 不等于 不等于 简单类型 布尔型简单类型 布尔型 < 小于 简单类型 布尔型 小于 简单类型 布尔型 > 大于 简单类型 布尔型 大于 简单类型 布尔型 <= 小于等于 小于等于 简单类型 布尔型简单类型 布尔型 >= 大于等于 大于等于 简单类型 布尔型简单类型 布尔型 运算符优先级运算符优先级:not→*,/,div,mod,and →xor,+,--,or →in,=,<>,>=,<=五、运算符和表达式五、运算符和表达式2.表达式表达式((1)通过运算符把常量、变量、函数调用)通过运算符把常量、变量、函数调用结合起来组成的式子。
结合起来组成的式子pi*r*rpi*r*rSum+2Sum+2(x
键盘输入两个变量的值,交换值后输出方法:间接交换法方法:间接交换法算法分析:(算法分析:(“自顶向下,逐步求精自顶向下,逐步求精”的编程思想)的编程思想)s1:通过键盘给通过键盘给a,b两个变量赋值;两个变量赋值;s2:交换交换a,b的值;的值; s2-1:引入中间变量引入中间变量c;; s2-2:在在c中存放的中存放的a值;值; s2-3:在在a中存放的中存放的b值;值; s2-4:在在b中存放的中存放的c值;值;s3:输出变量输出变量a,b的值程序代码:程序代码:program ex1; var a,b,c:integer; beginwrite(‘please input a,b:’);read(a,b);writeln(‘a=’,a,‘b=’,b);c:=a;a:=b;b:=c;writeln(‘a=’,a,‘b=’,b) end. 一一 .顺顺序序结结构构程程序序设设计计Pascal 语言的语句分为简单语句(也称基本语句)和复合语句(也称构造语句) o(二二):几个简单语句::几个简单语句:o1.赋值语句:.赋值语句:o格式:变量标识符:格式:变量标识符:=表达式;表达式;o功能:计算和赋值双重功能:功能:计算和赋值双重功能:o【例2】写出程序执行后,变量的值。
o程序代码:oprogram ex2;o varoa,b:integer;oc:real;och:char;obool:boolean;obegino a:=3;o b:=a;o b:=a+1;o a:=a+1;o c:=a+b;o ch:=’h’;o bool:=true;o bool:=not bool;o end.o说明:1)“:=”赋值号不同于“=”号,具有方向性,具有计算功能o 2)赋值号两边的类型应该相同o 3)一个赋值语句只能给一个变量赋值,变量可以进行多次赋值o 4)被赋值的变量可以作为因子参与运算2.输入语句(.输入语句(read,readln))::格式:格式:read(变量名表变量名表); readln<(变量名表变量名表)> read(a1,a2,a3); 等价于等价于 read(a1);read(a2);read(a3); readln(a1,a2,a3); 等价于等价于 read(a1);read(a2);read(a3);readln;功能:通过键盘,给指定的变量赋值。
功能:通过键盘,给指定的变量赋值例3】::写出程序运行后,变量的值程序代码:program ex3; var a,b,c:integer;i,j,k:real;ch1,ch2,ch3:char;begin read(a,b,c); readln(i,j,k);read(ch1,ch2,ch3);writeln(‘a=’,a,‘b=’,b,‘c=’,c);writeln(‘i=’,i, ‘j=’,j,‘k=’,k);writeln(‘ch1=’,ch1,‘ch2=’,ch2,‘ch3=’,ch3);end.程序运行后,输入数据:1 2 3 4 56.1 7 8 9 0dos执行readln后多余的数据将被忽略;执行read后多余的数据要么被忽略,要么被下一个read或readln语句所读入o3.输出语句(.输出语句(write,writeln):):o格式:格式:write(输出项);(输出项);o writeln<(输出项输出项)>;;o功能:按指定的格式将输出项的内容输出功能:按指定的格式将输出项的内容输出o【例【例4】:写出程序运行后的结果写出程序运行后的结果o程序代码:oprogram ex4;o constoa=10;ob=20;obegino writeln(50);o writeln(a);o writeln(a+b);o writeln(‘a+b=’,a+b)oend.o说明:1)输出项的内容可以是一项,也可以是若干项,各项之间用逗号分隔。
o 2)当输出项为常量,直接输出常量的值;当输出项为变量时,输出该变量存储单元内的内容,变量允许属于任何一种标准数据类型;当输出项为表达式时,先计算后输出;当输出项为字符串时,原样输出单引号括起来的内容 501030a+b=301、定义:复合语句是由若干条语句组成的语句序列形式:begin 语句1; 语句2; ···· 语句nend;用保留字begin和end括起来,构成一条逻辑上的语句,语法上充当一条语句三三):复合语句::复合语句:二二 . 选选择择结结构构程程序序设设计计1..if 语句:语句:格式:(1) if 条件 then 语句(2) if 条件 then 语句1 else 语句2 (3)if 语句嵌套if 条件1 then 语句11 else if 条件2 then 语句21 else 语句22 ;例:计算下列函数 y=Program p; Var x,y:real; begin read(x); if x<0 then y:=--1 else if x>0 then y=1 else y=0; writeln(‘y=‘,y); end. 输入:5 输出:0 (x=0)1 (x>0)--1 (x<0)2.case 语句:分情况语句(多分支语句)格式:case 表达式 of 常数表1:语句1; 常数表2:语句2; ···· 常数表n:语句n; else 语句n+1 end;功能:先计算表达式的值,然后将表达式的值依次与各常数表进行对照,当找到一个与表达式的值相匹配的常数表时,就去执行该CASE常数表后面的语句。
说明:1)end 与case 对应 2)表达式的类型通常是整型、字符型 3)常量表是常量,其类型与表达式的类型要一致常量表中的常量不能重复 通常将一组重复执行的语句称为循环体,而控通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定制重复执行或终止执行由重复终止条件决定 因此,重复语句是由循环体及重复终止条件两部因此,重复语句是由循环体及重复终止条件两部分组成FOR循环循环当循环当循环while直到直到repeat循环循环一、循环结构的三种形式:三三 . 循循环环结结构构程程序序设设计计(一)for循环语句1 1..forfor语句:(语句:(““计数循环计数循环””):就是将规定循环体重复执行的次数就是将规定循环体重复执行的次数格式:格式:for for 控制变量:控制变量:= =初值初值 to to 终值终值 do do 循环体语句;循环体语句; for for 控制变量:控制变量:= =初值初值 downto downto 终值终值 do do 循环体语句;循环体语句;2、for语句执行过程语句执行过程 ① ①先将初值赋给左边的变量(称为循环控制变量);先将初值赋给左边的变量(称为循环控制变量); ② ②判断循环控制变量的值是否已判断循环控制变量的值是否已““超过超过””终值,如已超过,则跳到步骤终值,如已超过,则跳到步骤⑥⑥;; ③ ③如果末超过终值,则执行如果末超过终值,则执行dodo后面的那个语句(称为循环体);后面的那个语句(称为循环体); ④ ④循环变量递增(对循环变量递增(对toto)或递减(对)或递减(对downt o)downt o)1;1; ⑤ ⑤返回步骤返回步骤②②;; ⑥ ⑥循环结束,执行for循环下面的一个语句。
循环结束,执行for循环下面的一个语句3 3、说明:、说明: 1) 1) 初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、布初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、布尔型和字符型等顺序类型,不能为实型尔型和字符型等顺序类型,不能为实型 2 2)递增按)递增按succsucc函数规律变化,递减按函数规律变化,递减按predpred函数规律变化,整型按数值大小变化,如果函数规律变化,整型按数值大小变化,如果为字符型量,按为字符型量,按ASCIIASCII码表的顺序计算码表的顺序计算 3 3)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对控)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对控制变量进行赋值制变量进行赋值 4 4)当初值超过终值,不执行循环,循环次数为零当初值超过终值,不执行循环,循环次数为零例:计算1+2+3+……+100之和var i,s:integer;begin s:=0; for i:=1 to 100 do s:=s+i; writeln(s);end.循环体:重复执行循环体:重复执行初值初值i:循环控制变量循环控制变量终值终值 (二).(二).while语句:语句: 对于对于for循环有时也称为计数循环。
循环有时也称为计数循环[适合用于事先知道循环次数适合用于事先知道循环次数]. 当循环次数未知,只能根据某一条件来决定是否进行循环时,用当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句实现循环要更方便语句实现循环要更方便当型循环当型循环”):当条件满足时反复执行循环体当条件满足时反复执行循环体格式:格式:while 布尔表达式布尔表达式 do 语句语句;;执行过程:执行过程: while语句的执行过程为:语句的执行过程为: ①①判断布尔表达式的值判断布尔表达式的值,如果其值为真如果其值为真,执行步骤执行步骤2,否则执行步骤否则执行步骤4; ②②执行循环体语句执行循环体语句(do后面的语句后面的语句); ③③返回步骤返回步骤1; ④④结束循环结束循环,执行执行while的下一个语句的下一个语句说明:说明: 1)为了使)为了使while循环能正常终止,循环能正常终止,布尔表达式中的变量必须在循环体中的某布尔表达式中的变量必须在循环体中的某语句中有所改变,即有可能使布尔表达式的值为假,语句中有所改变,即有可能使布尔表达式的值为假,使循环结束,否则将出使循环结束,否则将出现死循环。
现死循环 2)循环体中的语句一般是多条语句,用)循环体中的语句一般是多条语句,用begin和和end使其成为一条复合语句使其成为一条复合语句引例:引例:求恰好使求恰好使s=1+1/2+1/3+…+1/n的值大于的值大于10时时n的值var s : real; n : integer;{{n分母}分母}begin s:=0; n:=0; while s<=10 do{当{当s的值还未超过的值还未超过10时}时} begin n:=n+1;{分母{分母1}} s:=s+1/n;{将下一项值累加到{将下一项值累加到s}} end; writeln(n);{输出结果}{输出结果}end. repeat语句:(“直到型循环”):反复执行循环体直到条件满足为止格式:repeat 语句1; 语句2; 语句3; ··· 语句n until 布尔表达式; 执行过程:先执行指定的语句序列,然后判断表达式。
三). repeat语句:(“直到型循环”)例】:输入若干个字符,它的终止符是‘#’,计算输入的字符中‘a’(‘A’)出现的次数program ex7; var ch:char; i:integer;begin i:=0; repeat read(ch); if (ch=’a’) or (ch=’A’) then i:=i+1; until ch=’#’; writeln(‘i=’,i)end.三种循环语句的相同点与不同点FORWHILEREPEAT语语句格式句格式FOR <循循环变环变量量>::=<初初值值> TO <终值终值> DO <语语句句>WHILE <布布尔尔表达式表达式> DO<循循环环体体>REPEAT<循循环环体体>UNTIL <布布尔尔表达式表达式>循循环变环变量量赋值赋值布布尔尔表达式表达式无循无循环变环变量量循循环环次数次数确定,由初确定,由初值值和和终值终值决定决定不确定,由循不确定,由循环环体前的布体前的布尔尔表表达式决定,当达式决定,当值为值为“假假”时时,,结结束循束循环环可能一次循可能一次循环环也没有也没有不确定,由循不确定,由循环环体后的布体后的布尔尔表达式决定,当表达式决定,当值值为为“真真”时结时结束循束循环环。
至少有一次循至少有一次循环环循循环环体体多多语语句句时时,需用,需用BEGIN和和END多多语语句句时时,需用,需用BEGIN和和END多多语语句句时时,不需用,不需用BEGIN和和END数 组一、为什么要使用数组:例例1 输入50个学生的某门课程的成绩,打印出低于平均分的同学号数与成绩 分析:在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求学生的总分,进而求出平均分但因为只有读入最后一个学生的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把50个学生的成绩都保留下来, 然后逐个和平均分比较,把高于平均分的成绩打印出来如果,用简单变量a1,a2,…,a50存放这些数据,可想而知程序要很长且繁 要想如数学中使用下标变量ai形式表示这50个数,则可以引入下标变量a[i]这样问题的程序可写为:第三节 数组与字符串 tot:=0;{tottot:=0;{tot表示总分表示总分} } for i:=1 to 50 do for i:=1 to 50 do {循环读入每一个学生的成{循环读入每一个学生的成绩,并累加它到总分}绩,并累加它到总分} beginbegin read(a[i]);read(a[i]); tot:=tot+a[i];tot:=tot+a[i]; end;end; ave:=tot/50;ave:=tot/50;{计算平均分}{计算平均分} for i:=1 to 50 dofor i:=1 to 50 do if a[i] 二、一维数组二、一维数组 当数组中每个元素只带有一个下标时,我们称这样的数组为一维数组1、一维数组类型的定义、一维数组类型的定义 一维数组类型的一般格式: array[下标1..下标2] of <基类型>; o我们可以说,数组是由固定数量的相同类型的元素组成的如:type arraytype=array[1..8]of integer; var a1,a2:arraytype; 或var a1,a2:array[1..8]of integer; 一维数组应用示例例例 输入50个数,要求程序按输入时的逆序把这50个数打印出来也就是说,请你按输入相反顺序打印这50个数 分析:我们可定义一个数组a用以存放输入的50个数, 然后将数组a内容逆序输出 源程序如下: program ex5_1; type arr=array[1..50]of integer; {说明一数组类型arr} var a:arr;i:integer; begin writeln('Enter 50 integer:'); for i:=1 to 50 do read(a[i]);{从键盘上输入50个整数} readln; for i:=50 downto 1 do {逆序输出这50个数} write(a[i]:10); end.二维数组o数组类型的定义中有两个下标类型二维数组类型的定义:ntype intarr=array [1..4] of integer; arr=array [1..5] of intarr; nvar a:arr;n变量a是一个二维的数组变量,它有5个分量,分别用a[1], a[2], a[3], a[4], a[5]表示,每个分量相当于一个一维的数组变量(有4个整型分量),通过下标区分:Øa[1,1], a[1,2], a[1,3], a[1,4] Øa[2,1], a[2,2], a[2,3], a[2,4]Øa[3,1], a[3,2], a[3,3], a[3,4] Øa[4,1], a[4,2], a[4,3], a[4,4]Øa[5,1], a[5,2], a[5,3], a[5,4]otype arr=array [1..5] of array [1..4] of integer; var a:arr; 等价的定义方式:otype arr=array [1..5,1..4] of integer; var a:arr;或var a:array [1..5,1..4] of integera[1,1] a[1,2] a[1,3] a[1,4] a[2,1] a[2,2] a[2,3] a[2,4]a[3,1] a[3,2] a[3,3] a[3,4] a[4,1] a[4,2] a[4,3] a[4,4]a[5,1] a[5,2] a[5,3] a[5,4]二维数组应用举例:例:例: 输入输入4名学生数学、物理、英语、化学、名学生数学、物理、英语、化学、pascal五门课五门课的考试成绩,求出每名学生的平均分,打印出表格。 的考试成绩,求出每名学生的平均分,打印出表格 分析:用二维数组 分析:用二维数组a存放所给数据存放所给数据,第一下标表示学第一下标表示学生的学号生的学号, 第二个下标表示该学生某科成绩,如第二个下标表示该学生某科成绩,如a[i,1]、、a[i,2]、、a[i,3]、、a[i,4]、、a[i,5]分别存放第分别存放第i号学生数学、物号学生数学、物理、英语、化学、理、英语、化学、pascal 五门课的考试成绩五门课的考试成绩,由于要求每由于要求每个学生的总分和平均分,个学生的总分和平均分, 所以第二下标可多出两列,分所以第二下标可多出两列,分别存放每个学生别存放每个学生5门成绩和总分、平均分门成绩和总分、平均分 源程序如下: program ex5_4; var a:array[1..4,1..7]of real; i,j:integer; begin fillchar(a,sizeof(a),0); {函数fillchar用以将a中所有元素置为0} writeln('Enter 4 students score'); for i:=1 to 4 do begin for j:=1 to 5 do {读入每个人5科成绩} begin read(a[i,j]); {读每科成绩时同时统计总分} a[i,6]:=a[i,6]+a[i,j]; end; readln; a[i,7]:=a[i,6]/5;{求平均分} end;{输出成绩表} writeln( 'No. Mat. Phy. Eng. Che. Pas. Tot. Ave.'); for i:=1 to 4 do begin write(i:2,' '); for j:=1 to 7 do write(a[i,j]:9:2); writeln; end; end.字符串 字符串有常量形式和变量形式。 字符串有常量形式和变量形式把按一定顺序排列的字符数据叫做字符串,把按一定顺序排列的字符数据叫做字符串,表示方法是将字符放入单引号中表示方法是将字符放入单引号中,字符,字符串个数叫做字符串的长度串个数叫做字符串的长度字符串变量可以用串类型标识符字符串变量可以用串类型标识符 string[n]来表示N取值在取值在1~~255之间省略为之间省略为255定义格式定义格式 :: type 字符串类型名字符串类型名=string [最大长度最大长度];;定义字符串变量格式是:定义字符串变量格式是:Var 字符串变量名:字符串类型名;字符串变量名:字符串类型名;也可以直接定义字符串变量,其格式为:也可以直接定义字符串变量,其格式为:Var 变量名:变量名: string[最大长度最大长度];;或或 变量名:变量名:string;字符串之间的运算:字符串之间的运算:• 对字符串可以整体输入或输出,如:对字符串可以整体输入或输出,如:read(x);write(y);• 允许对串变量进行赋值,如:允许对串变量进行赋值,如:X:=‘abc’; y:=x• 可以对字符串进行连接运算,使用可以对字符串进行连接运算,使用‘+’进行连接。 如:进行连接如:‘ho’+’me’结果是:结果是:’home’• 字符串之间可以进行关系运算:字符串之间可以进行关系运算: >、、 <、、 =、、 <>、、 >=、、 <=、、 <>比较方法按比较方法按ASCII码一个字符一个字码一个字符一个字符比较字符串函数((1)字符串测长函数)字符串测长函数格式:格式:length(s)功能:求字符串功能:求字符串S的长度,结果为整型的长度,结果为整型2)求子串函数)求子串函数格式:格式:copy (s,n,1);功能:在功能:在S串的第串的第N位开始截取位开始截取1位字符串位字符串3)) 查找子串函数查找子串函数格式:格式:pos((b,s);;功能:求子串功能:求子串b在在s中出现的起始位置,结果为整型,若未找到显示中出现的起始位置,结果为整型,若未找到显示04)插入过程)插入过程格式:格式: insert ((s1,s2,i);功能:将功能:将s1插入插入 s2中的第中的第i个字符位置,若结果超出个字符位置,若结果超出s2的最大长度,则超出的部分被截的最大长度,则超出的部分被截掉5)删除过程)删除过程格式:格式:delete (s,I,n);功能:删除功能:删除s中第中第i个字符位置开始的个字符位置开始的n 个字符。 个字符6)数值转换为字符串过程)数值转换为字符串过程格式:格式:str(v,s);功能:将数值功能:将数值V转换成字符串,存放在字符串变量转换成字符串,存放在字符串变量s中7)字符串转换为数值过程)字符串转换为数值过程格式:格式:val(s,v,c);功能:将数字串功能:将数字串s转换成数值转换成数值v,变量变量C记录检测出错的第一个字符的位置,当未出错时,记录检测出错的第一个字符的位置,当未出错时,C为为0一、过程和函数统称子程序子程序的执行过程第四节第四节 函数与过程函数与过程函数((1)标准函数:)标准函数: 我们已经接触过一些我们已经接触过一些Free Pascal提供一些内部标准函数,供编程时调用,提供一些内部标准函数,供编程时调用,象求象求|X|可调用可调用ABS((X),求可调用),求可调用SQRT(49)等等实际上,这些函数是一等等实际上,这些函数是一些包含在些包含在Free Pascal系统中供用户调用的程序模块,分别命名为:系统中供用户调用的程序模块,分别命名为:ABS,SQRT…等因而,只要在程序中遵照一定的调用规则,写出某一函数等因而,只要在程序中遵照一定的调用规则,写出某一函数名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果。 名以及此函数所需的参数,系统就会自调用这些程序模块,求得运算结果如:如:ABS(X) SQRT(12+X)等等2)自定义函数)自定义函数 系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数系统提供的这些内部标准函数,虽然使用起来十分方便,但其中种类和数量毕竟有限,不可能包含用户的所有需要在实际问题中,经常会遇到诸如量毕竟有限,不可能包含用户的所有需要在实际问题中,经常会遇到诸如求求N!这一类的运算,系统中则没有提供相应的函数可供调用为此,!这一类的运算,系统中则没有提供相应的函数可供调用为此,Free Pascal允许用户自行定义一些函数,我们称之为自定义函数这种自定义函允许用户自行定义一些函数,我们称之为自定义函数这种自定义函数一经定义,就可象内部函数一样,通过函数名调用它但要注意:这些函数一经定义,就可象内部函数一样,通过函数名调用它但要注意:这些函数必须在程序中定义,也只能在本程序中使用数必须在程序中定义,也只能在本程序中使用 函数定义及调用函数定义及调用一、Pascal标准函数:abs(x)、sqr(x)、等二、用户自定义函数:函数定义的格式:function <函数名函数名>(<形式参数表形式参数表>):<函数类型函数类型>;{函数首部函数首部}<局部变量说明局部变量说明>begin<语句语句1>;<语句语句2>;······<语句语句n>;<函数名函数名>:=<表达式表达式>; end;{函数体函数体}函数说明函数说明注:1)函数首部以关键字function开头。 2)括号内为形式参数表,即形参表3)函数的类型也就是函数值的类型4)函数的执行部分以begin开头,以end结束(end后有一个分号)在执行部分,至少要有一条将函数值传给函数名的赋值语句,即:<函数名>:=<表达式>;这样就由函数名将求得的函数值带回调用该函数的程序中【例】 求3!+5!+7!的值分析:可以先编写一个求n!的函数fac Program exp7_1 ; —— 程序首部 Var s,: real ; x :integer ;function fac(n:integer): real ;{ 函数首部函数值的类型是实型 } var {局部变量说明} k,t:integer; begin t:=1; for k:=2 to n do t:=t*k; fac:=t; {将结果赋值给函数} end;begin { 主程序调用 } s:=fac(3) + fac(5) +fac(7) ; writeln( ‘s =‘,s) end.函数的调用函数的调用: 可以在任何与函数值类型兼容的表达式中调用可以在任何与函数值类型兼容的表达式中调用函数,或者说,函数调用只能出现在允许表达式函数,或者说,函数调用只能出现在允许表达式出现的地方,或作为表达式的一个因子。 出现的地方,或作为表达式的一个因子函数调函数调用方式与标准函数的调用方式相同用方式与标准函数的调用方式相同函数调用的一般格式:函数调用的一般格式: <函数名>(实在参数表)<函数名>(实在参数表) 说明:说明:①①实在参数简称实在参数简称实参实参实参的个数必须与函数说明中形参的个数一致,实实参的个数必须与函数说明中形参的个数一致,实参的类型与形参的类型应当一一对应参的类型与形参的类型应当一一对应②②调用函数时,一般的,实参必须有确定的值调用函数时,一般的,实参必须有确定的值③③函数调用的步骤为:函数调用的步骤为:计算实参的值,计算实参的值,“赋给赋给”对应的形参对应的形参;;函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行函数的定义是静态的,若定义后未被调用,则该函数永远不会被执行④④调用的自定义函数应在调用之前已定义过调用的自定义函数应在调用之前已定义过⑤⑤自定义函数中的形参,因不是实际存在的变量,故又称为虚拟变量,它自定义函数中的形参,因不是实际存在的变量,故又称为虚拟变量,它们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,们并不占用内存单元,只有在调用函数时,才临时开辟相应的内存单元,存放实在参数的值。 〈实在参数表〉是一些由逗号分隔的参数,它们是在存放实在参数的值〈实在参数表〉是一些由逗号分隔的参数,它们是在调用函数时所用的自变量只有在调用函数时,才将实在参数的值传送到调用函数时所用的自变量只有在调用函数时,才将实在参数的值传送到形参的临时内存单元中去可见,形参实质上是实参的一个形参的临时内存单元中去可见,形参实质上是实参的一个“替身替身”【例】:计算右图五边形的面积例】:计算右图五边形的面积program ex3; var b1,b2,b3,b4,b5,b6,b7,s:real;function area(a,b,c:real):real; varp:real; beginp:=(a+b+c)/2;area:=sqrt(p*(p-a)*(p-b)*(p-c));end; beginwriteln(‘input b1-b7:’);readln(b1,b2,b3,b4,b5,b6,b7);s:=area(b1,b5,b6)+area(b2,b6,b7)+area(b3,b4,b7);writeln(‘s=’,s:10:3); end.b7b4b3b2b1b5b6过程定义及调用 一、标准过程:read、readln、write、writeln等二、用户自定义过程:过程定义的格式:procedure <过程名>(<形式参数表>);{过程首部}<局部变量说明>begin<语句1>;<语句2>;······ {过程体}<语句n>; end; 说明说明: ①①过程首部以关键字过程首部以关键字procedure开头。 开头②②过程名是用户自定义的标识符,只用来标识一个过程,不过程名是用户自定义的标识符,只用来标识一个过程,不能代表任何数据,因此不能说明能代表任何数据,因此不能说明“过程的类型过程的类型”③③形参表的一般格式形式如下:形参表的一般格式形式如下:[var] 变量名表:类型;变量名表:类型;…;;[var] 变量名表:类型其中带变量名表:类型其中带var的称为变量形参,不带的称为变量形参,不带var的称为值形参的称为值形参 ④④在过程体内使用的有关常量、变量等必须在过程体的说明在过程体内使用的有关常量、变量等必须在过程体的说明部分内加以说明或定义部分内加以说明或定义⑤⑤与函数体不同的是:函数体的执行部分至少有一个语句给与函数体不同的是:函数体的执行部分至少有一个语句给函数名赋值,而过程体的执行部分不能给过程名赋值,因为函数名赋值,而过程体的执行部分不能给过程名赋值,因为过程名不能代表任何数据过程名不能代表任何数据三、过程调用:三、过程调用:【例】:计算五边形的面积program ex3_1; var b1,b2,b3,b4,b5,b6,b7,s,sum:real;procedure area(a,b,c:real;var s:real); var p:real; begin p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); end; beginwriteln(‘input b1-b7:’);readln(b1,b2,b3,b4,b5,b6,b7);sum:=0;area(b1,b5,b6,s);sum:=sum+s;area(b2,b6,b7,s);sum:=sum+s;area(b3,b4,b7,s);sum:=sum+s;writeln(‘s=’,s:10:3); end.过程过程主程序主程序过程过程调用调用形式参数表形式参数表 过程的调用过程的调用 过程调用是通过一条过程调用是通过一条独立的过程调用语句独立的过程调用语句来实现的,它与函数调来实现的,它与函数调用完全不同。 过程调用与调与标准过程(如用完全不同过程调用与调与标准过程(如write,read等)的方式相等)的方式相同调用的一般格式为:同调用的一般格式为: <过程名> <过程名> 或或 <过程名>(实在参数表)<过程名>(实在参数表)说明说明: ①①实参的实参的个数、类型个数、类型必须与形参一一必须与形参一一对应对应②②对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量对应于值形参的实参可以是表达式,对应于变量形参的实参只能是变量③③过程调用的步骤为:计算实参的值;将值或变量的过程调用的步骤为:计算实参的值;将值或变量的“地址地址”传送给对应传送给对应的形参;执行过程体;返回调用处的形参;执行过程体;返回调用处1.函数往往只为求一个函数值; 过程一般会被设计成求若干个运算结果,完成一系 列的数据处理,或与计算无关的各种操作2.函数有类型,最终要将函数值传送给函数名; 过程无类型,不能给过程名赋值3.调用方式不同 函数的调用出现在表达式中; 过程的调用是由独立的过程调用语句实现的4.返回值的方法不同。 函数值是通过函数名传回调用程序; 过程则是通过参数将运算的结果传给调用程序四、过程与函数的主要区别:四、过程与函数的主要区别:变量及其作用域变量及其作用域一、变量的类型:一、变量的类型:全程变量和局部变量全程变量和局部变量1)、全程变量和它的作用域)、全程变量和它的作用域 全程变量是指在程序开头的说明部分定义和说明的量全程变量是指在程序开头的说明部分定义和说明的量 全程变量的作用域分为两种情况:全程变量的作用域分为两种情况: (1)在全程变量和局部变量不同名时,其作用域是整个程序在全程变量和局部变量不同名时,其作用域是整个程序 (2)在全程变量和局部变量同名时,全局变量的作用域不包含同在全程变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域名局部变量的作用域2)、局部变量和它的作用域)、局部变量和它的作用域凡是在子程序内部使用的变量,必须在子程序中加入说明凡是在子程序内部使用的变量,必须在子程序中加入说明这种在子这种在子程序内部说明的变量称为局部变量程序内部说明的变量称为局部变量局部变量的作用域是其所在的子局部变量的作用域是其所在的子程序。 程序形式参数也只能在子程序中有效,因此也属于局部变量形式参数也只能在子程序中有效,因此也属于局部变量 局部变量的作用域分为两种情况:局部变量的作用域分为两种情况: (1)当外层过程的局部变量名和嵌套过程中的局部变量不同名时,当外层过程的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过程外层过程的局部变量作用域包含嵌套过程 (2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层过程的局部变量作用域不包含此过程外层过程的局部变量作用域不包含此过程 【例5】:全程变量的作用域program ex5; var m:integer; procedure test1; begin m:=100; end; begin m:=5; writeln(‘before the test1 call,m is:’,m); test1; writeln(‘after the test1 call,m is:’,m); end.运行结果:before the test1 call,m is:5after the test1 call,m is:100【例6】:比较全程变量与局部变量的作用域。 program ex6; var m:integer; procedure test2;var m:integer;begin m:=100;end; beginm:=5;writeln(‘before the test2 call,m is:’,m);test2;writeln(‘after the test2 call,m is:’,m); end.运行结果:before the test1 call,m is:5after the test1 call,m is:5参数的传递参数的传递 一、参数的类型:1.形参和实参:.形参和实参:函数调用和过程调用的一般步骤:注意:由于形参类型不同,其在函数和过程调用中所起的作用也不同形参的类型可分为:值形参、变量形参、函数形参、过程形参实参也对应分为:值实参、变量实参、函数实参、过程实参 实参和形参结合 执行函数体或过程体 返回调用处继续执行2、值参和变参(1)值参:在函数或过程定义中,没有加VAR 说明的参数,在调用函数或过程时,调用程序将实在参数的值直接传递给形参,起着赋值作用2)变参:在函数或过程定义中,加有VAR 说明的参数,在调用函数或过程时,调用程序将实在参数的变量地址传递给形变参,因此当过程或函数处理中,改变形参变量的值,则实在参数的变量值也随之改变。 共享同一个存储单元) 例:procedure area(a,b,c:real;var s:real);3.值参和变参例题:值形参:function fac(x:integer):integer;【例7】:值参数分析program ex7; vara:integer; procedure sum(b:integer);begin b:=b+10; writeln(‘b=’,b);end; begina:=10;sum(a);writeln(‘a=’,a); end.运行结果:b=20a=10变量形参:procedure area(a,b,c:real;var s:real;)几点说明:1.函数不允许用变量形参;过程如需向调用程序返回值时,应采用变量形参2.变量形参要求它的实参和它是同一类型的变量,而不能是表达式3.在过程执行时,遇到对变量形参的引用或赋值,就是对相应参数的引用或赋值4.对变量形参的任何操作就是对实参本身的操作 【例8】:变量参数分析program ex8; var a:integer; procedure sum(var b:integer);begin b:=b+10; writeln(‘b=’,b);end; begina:=10;sum(a);writeln(‘a=’,a); end.运行结果:b=20a=20o小结:值参和变参o值形参——传值:调用时可用表达式代替形参,不改变实在参数的值。 o变量形参——传地址:调用时必须用变量代替形参变量,改变实在参数的值 例:请看下列程序的运行结果 program li3_10;var a,b,c:integer;procedure sub(x,y:integer;var z:integer); begin x:=x+1;y:=y+1;z:=x+y; writeln('sub:x=',x:2,'y=',y:2,'z=',z:2); end;begin a:=1;b:=4;c:=9; writeln('main:a=',a:2,'b=',b:2,'c=',c); sub(a,b,c);writeln('main:a=',a:2,'b=',b:2,'c=',c); sub(c+5,b*b,a); writeln('main:a=',a:2,'b=',b:2,'c=',c); readln;end. 运行结果:main:a=1 b=4 c=9 sub:x=2 y=5 z=7 main:a=1 b=4 c=7 sub:x=13 y=17 z=30 main:a=30 b=4 c=71.递归的定义:Pascal语言中,如果在一个函数、过程等的定义或说明内部又直接或间接地出现有对自身的引用,则称它们是递归的或者是递归定义的。 例如:在数学上,所有偶数的集合可递归地定义为:0是一个偶数;一个偶数和2的和是一个偶数可见,仅需两句话就能定义一个由无穷多个元素组成的集合2.递归的实现:通过函数或过程的调用来实现函数或过程直接调用其自身,称为直接递归;函数或过程间接调用其自身,称为间接递归 第五节第五节 程序的递归调用程序的递归调用3.例题:【例】:用递归计算n!n!可以由下列公式表示:program ex15; var n:integer;s:integer; function fac(a:integer):integer;begin if a=0 then fac:=1 else fac:=a*fac(a-1);end; beginreadln(n);s:=fac(n);writeln(n,‘!=’,s) end.输入:5输出:n!1 n=0n(n-1)! n>0主程序主程序fac(5)5*fac(4)4*fac(3)3*fac(2)2*fac(1)1*fac(0)1112624120递归结构的优点:结构清晰、容易阅读和理解,递归结构的缺点:需要保留每次递归调用时的参数 ,和局部变量,占用内存大,耗费机时多,程序运行的效率较低 ,递归算法的实用情况:符合递归的描述:1.需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少。 2.递归调用的次数是有限的3.必须有递归结束的条件分析以下程序写出运行结果(循环结构练习)1、Var y,m,d:integer:BeginReadln(y,m);Case m of1,3,5,7,8,10,12:d:=31;4,6,9,11:d:=302:if(y mod 4)=0 and (y mod 100<>=10) or (y mod 400=0) then d:=29 else d:=28;end;writeln(y,d):end.input: 2000 2output:2、、Var S,I:ingeger;BeginS:=0;For I:=1 to 100 doIf (I mod 3=0)and (I mod 4=0)Then s:=s+i;Writeln("s=",s)End.output:3、、Var i:integer;Beginfor i:=1 to 100 doif i mod 2=0 thenBeginwrite(i:4);if i mod 5=0 then writeln;End;End.output:作作 业业4、、VAR i,j:integer;BEGINFoR i:=1 TO 5 DoBEGINFoR j:=5 DOWNT0 i DoWrite(“十’);WritelnENDEND.5、var n,i,a1,a2,a3:integer;beginreadln(n);a1:=3;a2:=5;write(a1:8,a2:8);for i:=3 to n dobegina3:=a1+a2;a1:=a2;a2:=a3;write(a3:8);end;end.输入:10输出:6、、VAR i,j, k,sum1,sum2:Integer; BEGIN sum1:=0; sum2:=0; k:=1; while k<=10 DO BEGIN if (k MOD 2=0)THEN FOR i:=1 To 5 D0 sum1:=sum1十i ELSE FOR j:=1 To 5 D0 sum2:=sum2十i; k:=k十1; END;writeln(suml,sum2)END.7、、VAR n:Integer; b,t:Real; BEGIN t:=1;b:=1;n:=2; REPEAT b:=b*n; t:=t十b; n:=n十1 UNTIL n>8; Writeln(t:3:0) END.结结 束束。
