第2章 数据的描述.docx
《第2章 数据的描述.docx》由会员分享,可在线阅读,更多相关《第2章 数据的描述.docx(23页珍藏版)》请在冰豆网上搜索。
第2章数据的描述
Pascal基础知识
一、Pascal程序设计基础
1、Pascal语言程序的基本结构:
程序体
执行部分
程序首部
★例:
输入半径,求出圆的周长和面积。
Programexample1(input,output);
const
pi=3.14159;
var
c,s,r:
real;
begin
read(r);
c:
=pi*2*r;{求周长}
s:
=pi*r*r;{求面积}
write(c,s);{输出周长和面积}
end.
PASCAL规定,用"program"来标识这是一个PASCAL程序,任何一个PASCAL程序的首部都必须以此字开头。
PASCAL规定,凡程序中用到所有变量、符号常量、数组、标号、过程与函数、记录、文件等数据都必须在说明部分进行定义(或称"说明")。
PASCAL规定,执行部分以"begin"开始,以"end."结束,语句之间以分号隔开。
2、标准数据类型
(1)、实型(real):
最常用的数据类型。
有两种表示方法:
小数表示法和科学表示法。
小数表示法的例子:
1.25,-1.6,0.0,100.0
科学表示法的实数:
1.25e0,-1.6e0,0e0,1e2
e后的数字代表10的幂,比如1.25e0=1.25×100。
实型量的运算有:
+、-、*、/
用于实型量的标准函数有:
abs(绝对值);sqr(平方);sqrt(开方);sin(正弦);cos(余弦);
arctan(反正切):
函数的结果为弧度;
exp(以e为底的指数):
那么e2.5=exp(2.5);
ln(自然对数);
trunc(取整):
去掉小数部分;
round(舍入取整):
将小数部分四舍五入后得到最接近它的数。
如:
trunc(1.2)=1;round(1.2)=1;
trunc(1.8)=1;round(1.8)=2;
trunc(-3.6)=-3;round(-3.6)=-4;
(2)、整型(integer):
包括正、负整数和零。
不能有小数点。
Integer是整型标准类型标识符。
实型量的运算有:
+、-、*、DIV(整除)、MOD(取余)
用于整型量的标准函数有:
abs(绝对值);
sqr(平方);
pred(前导):
取自变量的前一个值。
如pred(5)=4;
succ(后继):
取自变量的后一个值。
如pred(-5)=-4;
odd(奇函数):
odd(7=true)、odd(6)=false;
chr(取字符):
chr(65)=’A’。
标准函数sin、cos、arctan、exp、ln、sqr也可以用整型量,但其结果均为实型。
例如sqrt(4)=2.0;(不是sqrt(4)=2)
实型数与整型数的主要差别是:
计算机能表示的实数的绝对值为10-38-1038,而整数为-32768-32767。
实型量和整型量运算的结果是实型量。
如:
4×0.25+1=2.0。
(3)、字符型(char):
括在单引号中的一个字符。
如:
′A′、′a′、′′(空格)、′′′(′字符)
′ABC′是字符串,单引号中只有一个字符的才是字符数,
用于整型量的标准函数有:
ord(取序号):
ASCⅡ码中字符的值,如ord(′A′)=65;
pred(前导):
前一个字符,如pred(′b′)=′a′;
succ(后继):
后一个字符,如succ(′b′)=′c′;
(4)、布尔型(boolean):
只有两个值false(假)和true(真)。
False的序号为0;true的序号为1。
用于布尔型的标准函数有:
ord(取序号):
ord(false)=0;ord(true)=1;
pred(前导):
pred(true)=false;
succ(后继):
succ(false)=true;
false没有前导,true没有后继。
用于布尔量的运算有布尔运算,也叫逻辑运算。
3、表达式和赋值语句
赋值语句是pascal程序中最常用的语句,它的一般形式为:
<变量>:
=<表达式>;
计算右端表达式的值然后将这个值赋给左端的变量。
4、read语句
read语句是读语句。
一般形式:
read(<输入变量表>)
一个读语句可以读入多个值,此时变量用“,”隔开,例如read(x,y,z);输入时各数值以空格分开。
输入数据和输入变量必须赋值相容。
readln()语句,它与read()语句的差别是在完成该语句的最后一个变量值输入之后,将结束包括这个数值的这一行,使下一个read()语句(或readln())从下一行开始输入新的数据。
输入数据:
执行输入语句:
执行结果为:
1.52.43.6↙read(a,b);a=1.5,b=2.4
4.05.96.0↙read(c,d);c=3.6,d=4.0,
输入数据:
执行输入语句:
执行结果为:
1.52.43.6↙readln(a,b);a=1.5,b=2.4
4.05.96.0↙readln(c,d);c=4.0,d=5.9
5、write语句
write语句是写语句。
一般形式:
write(<输出变量表>)
一个写语句可以输出多个值,此时变量用“,”隔开,例如write(x,y+x,z*y);若为变量,输出变量的值;若为表达式,计算表达式的值,然后输出此值;若为字符串(用两个单引号括起来的一串字符),则输出字符串本身。
为了将结果打印在不同的行上,可以利用writeln()语句。
它的作用是在输出最后一个输出项后结束当前输出行。
比如:
write(′A′,′B′);
write(′C′,′D′);
的输出结果为
ABCD
writeln(′A′,′B′);
writeln(′C′,′D′);
的输出结果为
AB
CD
Readln和writeln语句也可以不包括输入、输出表单独使用。
前者用于结束当前输入行,后者用于结束当前输出行,指向下一行。
例如:
read(x,y);
readln;
等价于readln(x,y);
write(x,y);
writeln;
等价于writeln(x,y);
可以通过添加场宽说明来控制输出所占的场宽。
常宽说明是在输出项之后加冒号,再加整型数或表达式确定输出项所占的场宽。
当场宽说明大于输出数据时,左面补上空格,场宽说明小于输出数据要求的字符数时,将自动突破场宽限制说明,按实际所需要的字符数输出整数、布尔值以及字符串。
对于实型数,当场宽说明较小时,输出时小数位数将减少,但不论场宽说明多么小,输出时至少保留1位小数。
对于实型数,还可以用两个整型表达式来说明,第一个表示总场宽,第二个表示小数位数,此时实数以小数形式输出。
二、Pascal程序设计的基本结构
Pascal语言程序可以用四种基本结构表示,这就是顺序结构、判断结构、循环结构以及"过程"和"函数"结构。
1、顺序结构:
顺序结构是一组按照书写顺序执行的语句。
2、选择结构:
当必须根据某个变量或表达式的值做出判断,以决定执行哪些语句和跳过哪些语句不执行时,我们使用选择结构,或叫判断结构。
(1)If语句
①If语句的两种形式:
Ⅰ、IF<条件>
THEN语句1
ELSE语句2;
Ⅱ、IF<条件>
THEN语句1;
(注意Ⅰ型IF语句中语句1后无";"号)
条件实际上是一个布尔表达式,它的值可以是真(true)或假(false),条件为真时执行语句1,条件为假时执行语句2(形式Ⅰ)或不执行任何操作(形式Ⅱ)。
②复合语句
在if语句中,跟在then和else后的语句可能不止一个,这时候就要用到复合语句。
复合语句是一个以begin开头,以end结束的语句,在begin和end之间可以包含若干个用“;”隔开的语句。
复合语句的一般形式为:
begin
<语句1>;
<语句2>;
……
<语句n>;
end
③复合if语句
在if语句中,then和else后的语句也可能是if语句,此时称为if语句的嵌套,或复合if语句。
例如:
IF<条件1>
THEN<语句1>
ELSEIF<条件2>
THEN<语句2>
ELSE<语句3>;
(2)case语句
case语句是实现选择结构程序设计的另一种语句。
Case语句的一般形式为:
Case<表达式>of
<表值1>:
<语句1>;
<表值2>:
<语句2>;
……
<表值n>:
<语句n>;
End
Case语句头上的表达式必须是有序类型,比如整型、字符型、布尔型、以及后面要学的枚举型和子界型,不能是实型。
表值是一些有“,”分开的常数。
表达式所有可能出现的值必须在表值中出现一次,并且只能出现一次。
当表达式的值在某一个表值中出现后,该程序仅仅执行其后的语句,然后执行case语句后的其他语句。
在case语句中,除最后一个语句外,其他的语句后都应该有分号“;”,最后一句可以没有,也可以有。
若对应一个值表的语句不止一个,应写成复合语句的形式。
Case语句的最后不要漏掉end。
3、循环结构:
利用循环结构,可以只编写少量语句,让计算机重复执行多次,从而完成大量同类的计算。
在Pascal中,实现循环程序设计的语句有For语句、While语句和Repeat语句。
(1)For语句:
①在Pascal中,实现循环程序设计的一个最常用的语句是For语句,它的一般形式为:
For<循环变量>:
=<初值>To<终值>Do
<循环体>
程序的执行过程为:
首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值小于等于终值时,执行循环体,执行完循环体以后,将循环变量的后继值赋给循环变量(For语句自动完成),然后再与终值进行比较,若仍小于终值,则再次执行循环体,直到循环变量的值大于终值,结束For语句,执行For语句后面的语句。
注意:
a、循环变量的初值和终值可以是常量、变量或表达式。
b、循环变量的类型必须与初值和终值相同,且只能是整型、字符型、布尔型、枚举型、子界型等有序类型。
c、循环体如果是多行语句,必须使用复合语句。
d、在循环体中对初值和终值表达式的改变不会影响循环次数及循环变量的取值。
不允许在循环体中用任何语句改变循环变量的值。
e、从For语句退出时,循环变量的值是没有定义的,不得使用。
f、如果初值大于终值,循环体将根本不执行。
②除了以上的形式外,For语句还有另外的一种形式:
For<循环变量>:
=<初值>Downto<终值>Do
<循环体>
这是一个从较大值递减到终值的循环。
首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值大于等于终值时,执行循环体,然后将循环变量的前导值赋给循环变量(For语句自动完成),然后再与终值进行比较,若仍大于终值,则再次执行循环体,直到循环变量的值小于终值,结束For语句,执行For语句后面的语句。
如果初值小于终值,循环体将根本不执行。
在循环设计中,那些语句安排在循环前,那些语句安排在循环中,那些语句安排在循环后,是一个至关重要的问题,必须仔细安排。
(2)While语句:
For语句用于循环次数已知的情况下,其循环次数由初值和终值决定。
但当循环次数未知,而是依赖于循环过程中不断改变的某一数值时,就需要使用Pascal提供的While和Repeat语句实现了。
While语句的一般形式是:
While<布尔表达式>Do
<循环体>
执行该语句时,首先检查布尔表达式的值,如果它为真,则执行循环体,循环体中通常包含改变该布尔值表达式值的语句。
每次执行完循环体之后,再次检查布尔表达式的值,如果仍为真,继续执行循环体,否则结束循环,执行While之后的语句。
While循环体中一定要有能改变布尔变量值的语句,否则循环将不能结束,而形成死循环。
(3)Repeat语句:
Repeat语句的一般形式是:
Repeat
<循环体>
Until<布尔表达式>
执行该循环时,首先执行循环体,然后检查Until后的布尔表达式,如此继续,直到布尔表达式为真时结束循环,执行循环语句后的其他语句。
同样,循环体中一定要有能改变布尔变量值的语句,否则循环将不能结束。
可以看出while和Repeat的两点主要区别:
a、Repeat语句是在执行完循环体后才检查布尔表达式的值,所以循环至少执行一次;而while语句是在执行循环体以前检查布尔表达式的值,有可能一次循环也不执行(布尔表达式开始就为假)。
b、Repeat语句在布尔表达式为真时结束循环,而while语句在表达式为真时执行循环。
什么时候用Repeat,什么时候用while,要根据具体情况来定。
(4)多重循环:
如果一个循环结构内部(循环体)又包含一个循环结构,就称之为多重循环结构。
任意循环语句的循环体部分都可以包含另一个循环结构语句,多重循环的嵌套次数是任意的,按照嵌套层次数,分别叫做二重循环、三重循环等。
处于内部的叫内循环,处于外部的叫外循环。
例如:
求100-999中的水仙花数(若三位数abc,abc=a3+b3+c3,则程abc为水仙花数,如:
13+53+33=1+125+27=153,则153是水仙花数)。
我们可以用一个三重循环求解:
Programexample(input,output);
Var
a,b,c:
integer;
Begin
Fora:
=1to9do{百位上的数}
Forb:
=0to9do{十位上的数}
Forc:
=0to9do{个位上的数}
ifa*a*a+b*b*b+c*c*c=a*100+b*10+c
thenwrite(a*100+b*10+c:
6);
Readln;
End.
练习1:
分别用For语句、While语句、Repeat语句计算n!
。
练习2:
[描述Description](2005年全国联赛普及组第一题)
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。
苹果成熟的时候,陶陶就会跑去摘苹果。
陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。
假设她碰到苹果,苹果就会掉下来。
[输入格式InputFormat]
输入包括两行数据。
第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
[输出格式OutputFormat]
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
4、Pascal函数与过程程序设计
1、函数
Pascal提供了一些标准函数,比如sqrt(开方)、abs(绝对值)函数等。
但Pascal提供的标准函数是有限的,并且有时不能满足某个问题的需要,这时就需要定义新的函数。
函数说明(函数定义)的一般形式:
Function<函数名>(<参数表>):
<函数类型>;
<说明部分>;
Begin
<函数体>
End;
(1)、函数必须用Function开头,然后是函数名、参数表和函数类型(即结果的类型)。
(2)、函数首部的后面是函数分程序,它由说明部分和语句部分组成。
语句部分又称函数体,由Begin和End括起来,函数体对形式参数进行处理,然后将运算结果赋给函数名,作为函数结果传给调用它的程序,所以在函数体中至少有一个给函数名赋值的语句:
<函数名>:
=<表达式>
在参数表中,可以有多个参数。
“,”用来分开相同类型的各个参数;“;”用来分开不同类型的参数;各种类型的参数分别用“:
”后的类型标识符说明。
比如:
(x,y,z:
real;m,n:
integer;ch:
char)
2、过程
函数是有局限性的,它们仅可以用于计算单个函数值,这个值是通过函数名带回给调用程序的。
我们常常需要写出一些单独的程序模块送回多个结果,或者写一个模块并不需要送回任何的结果,而只执行某些任务,比如打印以前计算的结果,这时就不能用函数了,但是可以用Pascal的过程来解决。
过程说明(过程定义)的一般形式:
Procedure<过程名>(<形式参数表>);
<说明部分>;
Begin
<过程体>
End;
过程调用的一般形式为:
<过程名>(<实在参数表>)
实在参数表是一些用“,”分开的参数组成的,并且应该满足:
a、形式参数表中可以包括值参数和变量参数,当无参数时,形式参数表和括号应该略去。
b、实在参数必须与过程说明中的形式参数个数相同,且次序一一对应。
c、与值参数对应的实在参数可以是表达式;与变量参数对应的实在参数只能是变量。
d、实在参数必须与变量参数类型同一,与值参数类型赋值相容。
●值参数与变量参数的区别如下:
a、变量参数定义时需要用保留字VAR指明,而值参数不能加VAR。
b、与值参数对应的可以是表达式,而变量参数对应的实在参数只能是变量。
c、值参数的改变不会影响到相应的实在参数,调用完之后实在参数的值不会改变,比如上例中t的改变不会影响x的具体数值;而对变量参数的运算实际上是对实在参数的运算,因此在函数中改变了实在参数的值,比如上例中s的值。
d、实在参数与值参数应类型赋值相容,而实在参数与变量参数应类型同一。
●过程与函数的不同点:
(1)、函数以Function开头,而过程以Procedure开头。
(2)、函数是通过函数名送回一个结果值,并且函数首部的最后要说明函数(即结果)的类型。
而过程的结果由参数送回,可以包括多个结果或无结果。
(3)、函数体中至少要包含一个给函数名赋值的语句;而过程不能给过程名赋值,因此过程体可以为空。
(4)、函数的调用出现在表达式中,而过程的调用必须作为一个单独的语句。
三、自定义数据类型
1、枚举与子界类型
1、枚举类型
(1)枚举类型的一般定义如下:
TYPE
<枚举类型标识符>=(<标识符>,<标识符>,…<标识符>);
VAR
<枚举类型变量表>:
<枚举类型标识符>;
枚举类型是以TYPE为开始的类型说明,此类型说明应放在常量说明和变量说明之间,然后在定义变量时,用枚举类型标识符说明枚举类型的变量。
例如:
TYPE
day=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);
month=(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec);
VAR
today,tomorrow:
day;
lastmonth,firstmonth:
month;
x,y:
real;
注意:
a、枚举类型是以TYPE为开始的类型说明;
b、每个枚举类型所允许的枚举值必须全部列在其后的括号中,每个枚举值用“,”隔开,枚举值只能是标识符(以字母开头的字母数字组合),而不能是数值常量或字符常量。
以下的定义是错误的:
type
daystype=('sun','mon','tue','wed','thu','fri','sat')
c、每个枚举值只能出现在一个枚举类型的定义中,并且只能在该定义中出现一次。
以下的定义是错误的:
type
daytype1=(monday,tuesday);
daytype2=(monday,wednesday);
(3)枚举类型变量的运算:
可以直接将枚举值赋给枚举变量,或将同类型的枚举变量赋给另一个枚举变量。
(4)TurboPascal不允许直接读写枚举值,所以枚举值的输出常用case语句间接的输入和输出,枚举值的输入和输出都要进行必要的转换,否则就会出错。
2、子界类型
(1)Pascal可以说明变量值的范围,当我们输入的数值不在此范围中时可以让程序提示我们,然后做相应的处理,这就需要通过定义子界类型和子界类型变量来做到这点。
子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。
子界类型的一般定义形式:
TYPE
<子界类型标识符>=<常量1>..<常量2>;
VAR
<子界类型变量表>:
<子界类型标识符>
例如:
TYPE
age=10..100;
letter=’a’..’z’;
VAR
workage:
age;{workage是age子界类型变量}
char:
letter;{char是letter子界类型变量}
在程序执行时,如果将存储在workage中的值小于10或大于100或不是数值,系统将终止程序的执行,并打印出相应的提示错误的信息。
同样如果准备赋给char的是数字或标点符号(非字母),程序也将终止执行,并输出诊断信息。
子界类型决定了该类型变量可以取值的范围,所以两个常量必须是同一种顺序类型(整型、字符型、布尔型、枚举型)的值,并且必须保证第一个值小于第二个值,比如:
a..b,要求a<=b,例如:
type
a=1..3;
b='a'..'d';
在定义枚举类型的子界时,一定要先定义枚举类型,然后才能定义枚举类型的子界。
例如:
Type
day=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);
schoolday=monday..friday;
myday=monday..saturday;
一个枚举值只能出现在一个枚举类型的定义中,但是可以出现在多个子界类型的定义中。
在说明子界类型时必须保证第一个值的序号小于等于第二个值的序号。
(2)和枚举类型一样,也可以不预先定义子界类型,而直接在变量说明中指出子界类型,即:
VAR
<子界类型变量表>:
<常量1>..<常量2>;
例如:
VAR
number:
1..9{number不是类型标识符,直接就是变量}
(3)子界类型的运算:
一个子界类型继承它的常量类型的运算符和标准函数,常量类型相容的不同子界类型可以混合运算,可以赋值。
子界类型的输入输出也与其继承的基类型相同。
3、数组类型
(1)一维数组的定义:
Type
<数组类型标识符>=array[<下标类型>]of<元素类型>;
Var
<数组变量表>:
<数组类型标识符>;
解释:
数组类型标识符说明了存储单元的汇集。
下标可以是boolean,char或任何用户自己定义的枚举类型和子界类型。
而不能是标准类型real或integer,因为它们都有无数个值,而Pascal所允许的数组空间是有限的。
对应下标类型的每一个枚举值有一个数组元素。
通常下标类型表示成形如min..max的子界,这里ord(min)必须小于ord(max)。
元素类型可以是任何类型,包括数组类型和其他类型。
例如:
Type
art=array[1..10]ofreal;
Var
a,b:
art;
第二种方法是在变量说明中直接说明数组类型,即
Var
a,b:
array[1..10]ofreal;
第一种方法中,首先定义数组类型art,我们推荐用这一种做法。
数组的运算:
除了同类型的数组可以整体拷贝(赋值)和参数传递外,数组是不能作其它运算的,数组也不能整体读、