freePascal教程文档格式.docx
- 文档编号:17011190
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:40
- 大小:60.21KB
freePascal教程文档格式.docx
《freePascal教程文档格式.docx》由会员分享,可在线阅读,更多相关《freePascal教程文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
begin
=sum+odds;
=odds+2;
end;
writeln(sum);
end.
[例2]输入若干个字符,它的终止符是“?
”,计算输入的字符中字母“a”出现的次数(包括大小写)。
programex1_2;
ch:
char;
i:
read(ch);
whilech<
>
’?
’do
if(ch=’a’)or(ch=’A’)
theni:
=i+1;
writeln(‘i=’,i)
在执行时,每当输入的字符为“a”或“A”时,则将变量i原有的值加上1再赋给i,相当于使i在原有的基础上加1。
当输入一个“?
”的时候,循环条件不成立,循环结束,输出结果。
在本程序中,输入数据“?
”就是循环结束的标志,这种在程序中人为设置循环结束条件的方法我们将它叫作结束标志法,在设计循环结构程序时经常要用到这种方法。
二、Repeat语句结构
Repeat语句与While语句正好相反,Repeat语句用于“重复执行循环体,一直到指定的条件为真时为止”的循环结构,它又被称为“直到型循环”。
Repeat语句的语法格式为:
repeat
循环体语句
until布尔表达式;
Repeat循环语句的执行流程如图1-2-1所示。
图1-2-1Repeat循环语句执行流程
Repeat语句使用说明:
1、先执行循环体,然后判断布尔表达式的值,为false,则继续循环,为true则终止循环;
2、为了使repeat循环重复能终止,与while循环一样,循环体中一定要有影响布尔表达式值的操作,否则该循环就是一个死循环;
3、repeat语句的特点是:
先执行循环,后判断结束条件,因而至少要执行一次循环体;
4、repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句;
5、repeat循环体可以是若干个语句,不需用begin和end。
另外需要说明的是,由于while循环与repeat语句都属于条件循环语句,因此一般可以将这两种语句互相转换,而具体使用哪条语句时要看实际情况决定。
[例3]利用泰勒公式求e的值,直到最后一项小于10-7为止。
泰勒公式如下:
e=1+1/1!
+1/2!
+1/3!
+……+1/n!
分析:
逐步往后递推,直到最后一项小于10-7为止。
programex1-3;
e,p:
real;
longint;
Begin
e:
p:
i:
repeat
p:
=p/i;
=e+p;
=i+1
untilp<
1e-7;
writeln(‘e=’,e);
[例4]求两个正整数m和n的最大公约数。
求两个正整数的最大公约数采用的辗转相除法求解。
以下是辗转的算法:
分别用m,n,r表示被除数、除数、余数。
①求m/n的余数r;
②若r=0,则n为最大公约数,若r≠0,执行第③步;
③将n的值放在m中,将r的值放在n中;
④返回重新执行第①步。
programex1_4;
m,n,,r:
integer;
write('
Inputm,n='
);
readln(m,n);
r:
=mmodn;
m:
=n;
n:
=r;
untilr=0;
writeln('
Thegreatestcommondivideis'
m);
三、多重循环结构
前面学习的循环结构都是由单一重复语句构成,即循环体部分不再是循环语句,我们把它称之为单重循环。
事实上,当一个循环体语句的循环体中包含另一个循环语句时,就构成了多重循环,我们也称之为循环语句的嵌套结构。
由嵌套的层数分别称之为双重循环、三重循环等,处于内部的循环称为内循环,处于外部的循环称为外循环,在循环的嵌套结构中,读者应牢牢掌握其执行过程满足“外层循环执行一次,内层循环执行一遍”的规律。
设计多重循环时,要特别注意内、外循环之间的关系,以及各语句安放的位置,内外循环控制变量不得同名,多重循环的执行次数为各层循环执行次数的乘积。
[例5]用多重循环求100~999之间的所有水仙花数,所谓水仙花数,是该数等于它各位数字的立方和,例如:
153=13+33+53。
根据题意,我们可以利用循环枚举三个数位上的数字,采用三重循环来求解,由于循环次数一定,用for循环最为简单,程序如下:
programex1_5;
a,b,c:
fora:
=1to9do
forb:
=0to9do
forc:
ifa*a*a+b*b*b+c*c*c=a*100+b*10+c
thenwrite(a*100+b*10+c:
6);
readln
[例6]求1~100之间的素数,所谓素数,就是只能被1和它本身整除的数。
要判断一个数i是否为素数,只要看i是否能被2到i-1范围内的数整除,若只要有一个能整除i,则i不是素数,否则i为素数。
因此求1~100之间的素数,只要对这个范围内的每一个数进行判断就可以了。
programex1_6;
const
n=100;
i,k,s:
prime:
Boolean;
s:
fori:
=2tondo{枚举n个数}
=true;
k:
=2;
while(k<
i)andprimedo{判断i是否为素数}
ifimodk=0thenprime:
=false;
inc(k);
{相当于k:
=k+1}
ifprimethen
write(i:
5);
s:
=s+1;
ifsmod10=0thenwriteln;
{满10个就换行}
注意:
上述程序k<
i条件实际上只要k<
=trunc(sqrt(i))就可以了,可以减少循环次数。
[例7]编写程序在屏幕上打印出由*组成的三角形图形,其中三角形的层数n由键盘输入,如当n=3时显示图形如下:
*
***
*****
用两层循环进行控制,外层循环控制三角形的层数,内层循环控制每一层三角形的星号个数。
programex1_7;
i,j,d:
write(‘inputdepth:
readln(d);
fori:
=1toddo
write(‘‘:
d-i+1);
forj:
=1to2*i-1dowrite(‘*’);
writeln
学习评价
1、从键盘读入5个数,计算它们的和与积以及平均值。
2、输入10个数,求出其中的最大值和最小值。
3、Fibnaocci(斐波那契)数列的定义如下:
数列的第一项为0,第二项为1,从第三项开始,每一项都是其前两项之和。
试编程输出Fibnaocci数列的前n项元素的值。
(n由键盘输入,3<
=n<
=30)
4、编程求下式中n的最大值:
22+42+62+…+n2<
1500。
5、猴子吃枣问题。
猴子摘了一堆枣,第一天吃了一半,还嫌不过瘾,又吃了一个;
第二天又吃了剩下的一半零一个;
以后每天如此。
到第十天,猴子一看只剩下一个了。
问最初有多少个枣子?
6、要将一张100元的钞票换成等值的10元、5元、2元、1元一张的小钞票,要求每次换成40张小钞票,每种至少一张,编程输出所有可能的换法,程序应适当考虑减少重复次数。
第二课枚举类型和子界类型
数据是程序设计的一个重要内容,其重要特征——数据类型,确定了该数据的取值范围以及所能参与的运算。
Pascal语言提供了丰富的数据类型,这些数据类型可以分为三大类:
简单类型、构造类型和指针类型。
其中简单类型可以分为标准类型(整型、实型、字符型、布尔型)和自定义类型(枚举类型、子界类型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。
这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。
在这些数据类型中,除了实型以外的简单类型都是顺序类型,所谓顺序类型就是它们的值不仅是有序的而且是有顺序号的。
枚举类型和子界类型就是本课学习的主要内容。
一、枚举类型
(一)枚举类型的定义
枚举类型是用户自定义的简单类型,适用于表示和处理一些非数值数据。
例如,对于一个星期中的每一天,一年中的四季,人的性别,交通信号灯的三种颜色等非数值数据,若用数值类型来表示它们,比如用整数0~6分别表示星期日、星期一~星期六,用1~4分别表示春、夏、秋、冬四季,用0和1分别表示男和女,用1~3分别表示红、绿和黄三种颜色,则显得很不直观,处理起来也容易出错。
人们希望能用直观的方式表示这些数据,而用枚举类型就能直观地表示和处理这些数据。
枚举类型属于用户自定义类型,因此在程序的说明部分必须对类型进行定义,只有经过定义后,这种类型才能被使用。
类型说明的关键字是type,类型标识符由用户自已决定,原则是以字母开头,后面跟以字母或数字,但注意不要使用Pascal保留字或标准标识符。
如以“daytype”表示有关日期的数据类型名,可定义如下:
type
daytype=(sun,mon,tue,wed,thu,fri,sat);
可见,枚举类型定义的一般格式为:
<
枚举类型标识符>
=(<
标识符1>
,<
标识符2>
,……,<
标识符n>
);
其中,<
给出了用户定义的枚举类型的名字,括号中的<
称为枚举元素,它们构成了这种枚举类型的取值范围(又称“值域”),需要注意的是<
后跟的是等号。
定义了枚举类型后,就可以在变量说明部分定义相应的枚举类型的变量了。
如:
colortype=(red,yellow,blue,white);
d1,d2:
daytype;
c:
colortype;
在类型说明部分,定义了两个枚举类型:
daytype和colortype。
daytype的值域为sun,mon,tue,wed,thu,fri,sat共七个;
colortype的值域为red,yellow,blue,white共四个。
在变量说明部分,定义了变量d1、d2为枚举类型daytype,它们的取值只限于类型daytype的值域,还定义了变量c为枚举类型colortype,它的取值只限于类型colortype的值域。
初学自定义类型时应特别注意将类型名与变量名区别开来,尤其不能将类型名当作变量名使用,类型和变量是两个完全不同的概念。
例如,在上面的例子中,d1表示变量,可对其进行运算,而daytype表示类型,不可对其施行任何运算。
以上类型定义和变量说明可合并在变量说明部分,即
(sun,mon,tue,wed,thu,fri,sat);
(red,yellow,blue,white);
以这样的方法说明变量的好处是较为简洁,但由于未定义类型标识符,所定义的类型不能重复使用。
(二)枚举类型数据的特点及应用
1、枚举元素只能是标识符
枚举元素只能是标识符,不能是数值常量、字符常量等其他任何数据类型。
下列的定义是错误的:
monthtype=(1,2,3,4,5,6,7,8,9,10,11,12);
colortype=(‘red’,‘yellow’,‘blue’);
前者错在把数值常量作为枚举值,后者错在把字符串常量作为枚举值。
还需注意的是,枚举元素是标识符,但不能把作为枚举元素的标识符视作变量名,枚举值是不能被赋值的。
2、同一个枚举元素不能出现在两个或两个以上的枚举类型定义中
在一个程序中,需要定义多个枚举类型时,需注意同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。
如下列的定义是错误的:
color1=(red,yellow,blue,white);
color2=(black,blue,green);
因为枚举元素blue既属于枚举类型color1,又属于枚举类型color2。
3、枚举类型属于顺序类型
枚举类型定义中通过列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的,且序号从0开始。
变量说明如下:
(sun,mon,tue,wed,thu,fri,sat);
其中枚举值sun的序号为0,枚举值mon的序号为1,依次类推,枚举值sat的序号值为6。
同时,枚举值是可以由大小来区别的,关系式sun<
tue的值是true,tue>
fri的值是false。
用序号函数可以求出枚举值的序号:
ord(sun)=0ord(mon)=1ord(fri)=5
用succ和pred函数可以求出枚举值的后继和前趋:
succ(sun)=monsucc(wed)=thupred(wed)=tuepred(sat)=fri
当然,枚举类型中的第一个元素没有前趋,最后一个元素没有后继。
可见,枚举值可以作为序号函数(ord)、前趋函数(pred)和后继函数(succ)的自变量。
4、对枚举类型只能进行赋值运算和关系运算
(red,yellow,blue,white);
此时,在程序中允许出现以下语句:
d1:
=sun;
d2:
=fri;
=blue;
ifd2=d2thenwrite(‘thesameday’)elsewrite(‘thedifferentday’);
可见,对枚举类型能进行赋值运算和关系运算。
但下列的语句是错误的:
①mon:
②c:
③read(d1,d2,c);
④write(d1,d2,c);
writeln(blue);
错误分析:
语句①:
把枚举值当成了变量名;
语句②:
枚举值sun不属于枚举类型变量c的值域;
语句③:
枚举类型的变量不能用read或readln语句进行读值;
语句④:
枚举类型的变量值和枚举值不能通过write或writeln语句进行输出。
5、枚举类型的应用
Pascal不允许直接读写枚举值,所以枚举值的输入、输出常用case语句间接地输入、输出。
枚举值的输入,一般先读入序号,通过case语句将枚举值相应地赋给枚举变量;
输出时,通过case语句判断枚举类型变量的值,输出相应的字符串。
[例1]有红、橙、黄、绿、蓝五种颜色的小旗,每次取出三种不同颜色的小旗表示不同的信号,输出所有信号的方案及方案总数。
programex2_1;
color=(red,orange,yellow,green,blue);
m,m1,m2,m3:
color;
s,p:
form1:
=redtobluedo
form2:
ifm1<
m2then
form3:
if(m3<
m1)and(m3<
m2)then
write(s,‘:
forp:
=1to3do
casepof
1:
=m1;
2:
=m2;
3:
=m3;
{casep}
casemof
red:
write(‘red’:
8);
orange:
write(‘orange’:
yellow:
write(‘yellow’:
green:
write(‘green’:
blue:
write(‘blue’:
{casem}
{forp}
writeln;
{if}
writeln(‘total:
’,s);
运行后共输出60种不同的信号方案。
由于枚举类型是一种顺序类型,故枚举类型的变量可以作为循环变量。
二、子界类型
(一)子界类型的定义
在实际应用中,有些数据的变化范围只局限在某一数据类型的某一确定的区域,Pascal语言中,对只取某一已经定义了的顺序类型的值的某一范围的这类问题,定义了子界这一数据类型。
例如,一年中的月份不超过12,一月中的天数不超过31。
采用子界类型便于检查数据的合法性,增加程序的可读性,使解决这类问题既符合常规概念,又自然清晰,更好保证了程序运行的正确性。
子界类型定义的一般格式为:
子界类型标识符>
=<
常量1>
..<
常量2>
其中常量1称作下界,常量2称作上界,且上界必须大于下界。
下界和上界可以是整型、字符型、布尔型、枚举型等顺序型的两个常量,但必须是同一种顺序类型,该顺序类型称为子界类型的“基类型”。
一个子界类型的取值范围是其基类型的取值范围中从下界到上界的连续一段,子界类型的值域实际上就是基类型值域的一个子集。
下面的类型定义部分中定义了一个枚举类型和四个子界类型:
Const
n=150;
Type
week=(sun,mon,tue,wed,thu,fri,sat);
age=0..n;
days=28..31;
letter='
a'
..'
z'
;
workday=mon..fri;
其中,子界类型age可表示人的年龄,其基类型为整型,取值范围为整数0~150;
子界类型days可表示一个月的天数,其基类型也是整型,取值范围为整数28~31;
子界类型letter表示小写字母,其基类型为字符类型,取值范围为字符'
~'
子界类型workday可表示一个星期的工作日,其基类型为枚举类型week,取值范围为类型week的五个枚举类型元素mon~fri,注意作为类型workday的基类型,类型week必须在类型workday之前定义。
在定义子界类型时应注意,子界类型的基类型必须是顺序类型,常用整型、字符类型和枚举类型,当用枚举类型时,该枚举类型必须先定义。
特别不可用实型作为子界类型的基类型。
基类型为整型、字符类型和枚举类型的子界类型分别称为整数子界类型,字符子界类型和枚举子界类型。
在定义了一个子界类型之后,就可说明该子界类型的变量。
例如,对于如上定义的子界类型age,days,letter和workday,可说明这些子界类型的变量如下:
Var
studentage:
age;
n,m:
days;
ch1,ch2,ch3:
letter;
today:
workday;
其中,整数子界类型变量studentage只能在0~150范围内取值,不可超出该范围,字符子界类型变量ch1,ch2和ch3都只能在'
范围内取值,余者类推。
在说明子界类型变量时还可先不定义相应的子界类型,直接在变量说明部分中将类型定义与变量说明合并起来写,例如下面的变量说明是合法的:
ch:
'
A'
Z'
u,v:
0..9;
其中,ch被说明为字符子界类型变量,其取值范围为大写字母字符'
u和v被说明为整数子界类型变量,只能取值数字0~9。
(二)子界类型数据的特点及应用
1、对基类型适用的各种运算,均适用于该子界类型
一个子界类型与其基类型的区别仅在于取值范围不同,前者的取值范围是后者的取值范围中连续的一部分,除此之外,子界类型具有其基类型的所有性质。
所以,子界类型的运算完全取决于其基类型,即基类型的所有运算同样适用于其子界类型。
例如,整型的运算有算术运算:
+、-、*、Div和Mod,以及关系运算和赋值运算,这些运算都适用于整数子界类型;
而适用于字符子界类型和枚举子界类型的运算为关系运算和赋值运算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- freePascal 教程