文档库 最新最全的文档下载
当前位置:文档库 › freePascal教程

freePascal教程

freePascal教程
freePascal教程

第四单元 PASCAL 语言程序设计

在上一册教材中,我们已经初步了解了P ASCAL 语言的三种基本结构、程序设计的基本思想和方法。本单元是在上册内容的基础上进一步深入学习P ASCAL 语言的数组、子程序、字符串处理等基础知识。随着学习的深入,程序设计的题目类型越来越广泛,难度也越来越大,程序设计者不能“完全”把求解的任务推给计算机,而应对题目作较充分的分析,用较优的算法去求解,因此在计算机上编程解题是一项极好的实践活动,它可以训练观察能力、逻辑思维能力、形式化描述问题能力、规划能力、动手动脑分析问题和解决问题的能力。

第一课 循环结构的程序设计

在程序设计中,经常处理一些需要重复执行某些操作的问题,这就需要循环结构程序设计,循环结构是程序设计的三种基本结构之一,循环结构是指当某个条件满足时反复执行某些语句,否则不执行。利用循环结构,使得我们能用少而精的程序编码,来完成大量的重复计算。

在Pascal 语言中,实现循环程序设计的主要语句有For 语句(计数循环)、While 语句(当型循环)、Repeat 语句(直到型循环)。上册教材已经介绍了For 语句,本节课介绍While 语句、Repeat 语句及多重循环结构。

一、 W hile 语句结构

For 循环语句适用于已知次数的循环结构,而在实际的问题中,有时我们并不能确切知道循环要执行多少次,我们判断是否结束循环的依据是某个条件是否满足,比如“当……时就做……”,或者是“一直做到……时为止”,这种循环我们称之为条件循环。在Pascal 中条件循环语句有两种,分别是While 循环语句和Repeat 循环语句。下面分别介绍这两种语句的使用方法。

While 语句用于“当满足某一条件时进行循环”的情况,因此它也被称为“当型循环”。While 语句的语法格式如下:

While <布尔表达式> do <循环体语句>;

While 循环语句的执行流程如图1-1-1所示。

图1-1-1 While 循环语句执行流程

布尔表达式

True

False

循环体

While语句使用说明:

(1)当布尔表达为true则执行循环体,若为false,则根本不进入循环体;

(2)如果一开始布尔表达式的值就为假时,While循环就会一次循环体都不执行;

(3)相反的,如果布尔表达式永远是真的,那么循环就无法结束,从而成为“死循环”,为了避免这种情况的发生,在循环体中就一定要有能改变布尔表达式结果的操作;

(4)循环体中的语句一般情况下是多条语句,必须使用begin和end将它们括起来形成一条复合语句。

[例1] 计算S=1+3+5+……+n(n为大于1的奇数)。

程序如下:

program ex1_1;

var

odds,n,sum:integer;

begin

write(…input a odd data:?);readln(n);

sum:=0; odds:=1;

while odds<=n do

begin

sum:=sum+odds;

odds:=odds+2;

end;

writeln(sum);

end.

[例2] 输入若干个字符,它的终止符是“?”,计算输入的字符中字母“a”出现的次数(包括大小写)。

程序如下:

program ex1_2;

var

ch:char;

i:integer;

begin

i:=0;

read(ch);

while ch<>??? do begin

if (ch=?a?) or (ch=?A ?) then i:=i+1; read(ch); end; writ eln(…i=?,i) end.

在执行时,每当输入的字符为“a ”或“A ”时,则将变量i 原有的值加上1再赋给i ,相当于使i 在原有的基础上加1。当输入一个“?”的时候,循环条件不成立,循环结束,输出结果。在本程序中,输入数据“?”就是循环结束的标志,这种在程序中人为设置循环结束条件的方法我们将它叫作结束标志法,在设计循环结构程序时经常要用到这种方法。

二、 R epeat 语句结构

Repeat 语句与While 语句正好相反,Repeat 语句用于“重复执行循环体,一直到指定的条件为真时为止”的循环结构,它又被称为“直到型循环”。

Repeat 语句的语法格式为:

repeat 循环体语句

until 布尔表达式;

Repeat 循环语句的执行流程如图1-2-1所示。

图1-2-1 Repeat 循环语句执行流程

Repeat 语句使用说明:

1、先执行循环体,然后判断布尔表达式的值,为false ,则继续循环,为true 则终止循环;

2、为了使repeat 循环重复能终止,与while 循环一样,循环体中一定要有影响布尔表达式值的操作,否则该循环就是一个死循环;

布尔表达式 True False

循环体

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为止。

程序如下:

program ex1-3;

var

e,p:real;

i:longint;

Begin

e:=1;p:=1;i:=1;

repeat

p:=p/i;

e:=e+p;

i:=i+1

until p<1e-7;

writeln(‘e=’,e);

end.

[例4] 求两个正整数m和n的最大公约数。

分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:

分别用m,n,r表示被除数、除数、余数。

①求m/n的余数r;

②若r=0,则n为最大公约数,若r≠0,执行第③步;

③将n的值放在m中,将r的值放在n中;

④返回重新执行第①步。

程序如下:

program ex1_4;

var

m,n,,r : integer;

begin

write('Input m,n='); readln(m,n);

repeat

r:=m mod n;

m:=n;n:=r;

until r=0;

writeln('The greatest common divide is',m);

end.

三、多重循环结构

前面学习的循环结构都是由单一重复语句构成,即循环体部分不再是循环语句,我们把它称之为单重循环。事实上,当一个循环体语句的循环体中包含另一个循环语句时,就构成了多重循环,我们也称之为循环语句的嵌套结构。

由嵌套的层数分别称之为双重循环、三重循环等,处于内部的循环称为内循环,处于外部的循环称为外循环,在循环的嵌套结构中,读者应牢牢掌握其执行过程满足“外层循环执行一次,内层循环执行一遍”的规律。

设计多重循环时,要特别注意内、外循环之间的关系,以及各语句安放的位置,内外循环控制变量不得同名,多重循环的执行次数为各层循环执行次数的乘积。

[例5] 用多重循环求100~999之间的所有水仙花数,所谓水仙花数,是该数等于它各位数字的立方和,例如:153=13+33+53。

分析:根据题意,我们可以利用循环枚举三个数位上的数字,采用三重循环来求解,由于循环次数一定,用for循环最为简单,程序如下:

program ex1_5;

var

a,b,c:integer;

begin

for a:=1 to 9 do

for b:=0 to 9 do

for c:=0 to 9 do

if a*a*a+b*b*b+c*c*c=a*100+b*10+c

then write(a*100+b*10+c:6);

readln

end.

[例6] 求1~100之间的素数,所谓素数,就是只能被1和它本身整除的数。

分析:要判断一个数i是否为素数,只要看i是否能被2到i-1范围内的数整除,若只要有一个能整除i,则i不是素数,否则i为素数。因此求1~100之间的素数,只要对这个范围内的每一个数进行判断就可以了。

程序如下:

program ex1_6;

const

n=100;

var

i,k,s:integer;

prime:Boolean;

begin

s:=0;

for i:=2 to n do {枚举n个数}

begin

prime:=true;k:=2;

while (k

begin

if i mod k=0 then prime:=false;

inc(k); {相当于k:=k+1}

end;

if prime then

begin

write(i:5);

s:=s+1;

if s mod 10=0 then writeln; {满10个就换行} end;

end;

end.

注意:上述程序k

[例7] 编写程序在屏幕上打印出由*组成的三角形图形,其中三角形的层数n由键盘输入,如当n=3时显示图形如下:

*

* * *

* * * * *

分析:用两层循环进行控制,外层循环控制三角形的层数,内层循环控制每一层三角形的星号个数。

程序如下:

program ex1_7;

var

i,j,d:integer;

begin

write(…input depth:?);readln(d);

for i:=1 to d do

begin

write(… …:d-i+1);

for j:=1 to 2*i-1 do write(…*?);

writeln

end;

end.

学习评价

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);

可见,枚举类型定义的一般格式为:

type

<枚举类型标识符>=(<标识符1>,<标识符2>,……,<标识符n>);

其中,<枚举类型标识符>给出了用户定义的枚举类型的名字,括号中的<标识符1>,<标识符2>,……,<标识符n>称为枚举元素,它们构成了这种枚举类型的取值范围(又称“值域”),需要注意的是<枚举类型标识符>后跟的是等号。

定义了枚举类型后,就可以在变量说明部分定义相应的枚举类型的变量了。如:

type

daytype=(sun,mon,tue,wed,thu,fri,sat);

colortype=(red,yellow,blue,white);

var

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表示类型,不可对其施行任何运算。

以上类型定义和变量说明可合并在变量说明部分,即

var

d1,d2: (sun,mon,tue,wed,thu,fri,sat);

c: (red,yellow,blue,white);

以这样的方法说明变量的好处是较为简洁,但由于未定义类型标识符,所定义的类型不能重复使用。

(二)枚举类型数据的特点及应用

1、枚举元素只能是标识符

枚举元素只能是标识符,不能是数值常量、字符常量等其他任何数据类型。下列的定义是错误的:

type

monthtype=(1,2,3,4,5,6,7,8,9,10,11,12);

colortype=(‘red’, ‘yellow’, ‘blue’);

前者错在把数值常量作为枚举值,后者错在把字符串常量作为枚举值。还需注意的是,枚举元素是标识符,但不能把作为枚举元素的标识符视作变量名,枚举值是不能被赋值的。

2、同一个枚举元素不能出现在两个或两个以上的枚举类型定义中

在一个程序中,需要定义多个枚举类型时,需注意同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列的定义是错误的:

type

color1=(red,yellow,blue,white);

color2=(black,blue,green);

因为枚举元素blue既属于枚举类型color1,又属于枚举类型color2。

3、枚举类型属于顺序类型

枚举类型定义中通过列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的,且序号从0开始。变量说明如下:

var

d1,d2:(sun,mon,tue,wed,thu,fri,sat);

其中枚举值sun的序号为0,枚举值mon的序号为1,依次类推,枚举值sat的序号值为6。同时,枚举值是可以由大小来区别的,关系式sunfri的值是false。

用序号函数可以求出枚举值的序号:

ord(sun)=0 ord(mon)=1 ord(fri)=5

用succ和pred函数可以求出枚举值的后继和前趋:

succ(sun)=mon succ(wed)=thu pred(wed)=tue pred(sat)=fri

当然,枚举类型中的第一个元素没有前趋,最后一个元素没有后继。

可见,枚举值可以作为序号函数(ord)、前趋函数(pred)和后继函数(succ)的自变量。

4、对枚举类型只能进行赋值运算和关系运算

var

d1,d2:(sun,mon,tue,wed,thu,fri,sat);

c:(red,yellow,blue,white);

此时,在程序中允许出现以下语句:

d1:=sun;

d2:=fri;

c:=blue;

if d2=d2 then write(‘the same day’) else write(‘the different day’);

可见,对枚举类型能进行赋值运算和关系运算。但下列的语句是错误的:

① mon:=1;

② c:=sun;

③ read(d1,d2,c);

④ write(d1,d2,c);writeln(blue);

错误分析:

语句①:把枚举值当成了变量名;

语句②:枚举值sun不属于枚举类型变量c的值域;

语句③:枚举类型的变量不能用read或readln语句进行读值;

语句④:枚举类型的变量值和枚举值不能通过write或writeln语句进行输出。

5、枚举类型的应用

Pascal不允许直接读写枚举值,所以枚举值的输入、输出常用case语句间接地输入、输出。枚举值的输入,一般先读入序号,通过case语句将枚举值相应地赋给枚举变量;输出时,通过case语句判断枚举类型变量的值,输出相应的字符串。

[例1] 有红、橙、黄、绿、蓝五种颜色的小旗,每次取出三种不同颜色的小旗表示不同的信号,输出所有信号的方案及方案总数。

程序如下:

program ex2_1;

type

color=(red,orange,yellow,green,blue);

var

m,m1,m2,m3:color;

s,p:integer;

begin

s:=0;

for m1:=red to blue do

for m2:=red to blue do

if m1<>m2 then

for m3:=red to blue do

if (m3<>m1) and (m3<>m2) then

begin

s:=s+1;

write(s,‘:’);

for p:=1 to 3 do

begin

case p of

1:m:=m1;

2:m:=m2;

3:m:=m3;

end; {case p}

case m of

red:write(‘red’:8);

orange:write(‘orange’:8);

yellow:write(‘yellow’:8);

green:write(‘green’:8);

blue:write(‘blue’:8);

end; {case m}

end; {for p}

writeln;

end; {if}

writeln(‘total:’,s);

end.

运行后共输出60种不同的信号方案。

由于枚举类型是一种顺序类型,故枚举类型的变量可以作为循环变量。

二、子界类型

(一)子界类型的定义

在实际应用中,有些数据的变化范围只局限在某一数据类型的某一确定的区域,Pascal语言中,对只取某一已经定义了的顺序类型的值的某一范围的这类问题,定义了子界这一数据类型。例如,一年中的月份不超过12,一月中的天数不超过31。采用子界类型便于检查数据的合法性,增加程序的可读性,使解决这类问题既符合常规概念,又自然清晰,更好保证了程序运行的正确性。

子界类型定义的一般格式为:

type

<子界类型标识符>=<常量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表示小写字母,其基类型为字符类型,取值范围为字符'a'~'z';子界类型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都只能在'a'~'z'范围内取值,余者类推。

在说明子界类型变量时还可先不定义相应的子界类型,直接在变量说明部分中将类型定义与变量说明合并起来写,例如下面的变量说明是合法的:

Var

ch: 'A'..'Z';

u, v: 0..9;

其中,ch被说明为字符子界类型变量,其取值范围为大写字母字符'A'~'Z'; u和v被说明为整数子界类型变量,只能取值数字0~9。

(二)子界类型数据的特点及应用

1、对基类型适用的各种运算,均适用于该子界类型

一个子界类型与其基类型的区别仅在于取值范围不同,前者的取值范围是后者的取值范围中连续的一部分,除此之外,子界类型具有其基类型的所有性质。所以,子界类型的运算完全取决于其基类型,即基类型的所有运算同样适用于其子界类型。例如,整型的运算有算术运算:+、-、*、Div和Mod,以及关系运算和赋值运算,这些运算都适用于整数子界类型;而适用于字符子界类型和枚举子界类型的运算为关系运算和赋值运算。

同样,适用于一个有序类型的函数运算也适用于以其为基类型的子界类型。例如,适用于枚举子界类型的函数运算有:前趋函数Pred,后继函数Succ和序号函数Ord。由于子界类型本身也是顺序类型,所以序号函数Ord适用于任何一个子界类型,只是子界类型每个值的序号是按该值在相应的基类型中的序号来定的。例如,下面程序:

Program test;

Type

week=(sun, mon, tue, wed, thu, fri, sat);

Var

d: tue..fri;

n: -1..1;

c: 'A'..'Z';

Begin

d:=wed;

n:=1;

c:='A';

Writeln(Ord(d):3, Ord(n):3, Ord(c):3);

End.

的输出结果为:

3 1 65

子界类型的输入、输出方法同样与其基类型相同。例如,枚举子界类型变量的值不能用标准过程Read和Write直接输入和输出,只可采用与枚举类型变量相同的方法间接输入和输出。

2、在同一程序中,具有相同类型的不同子界类型的数据,可以混合运算

例如,若有如下变量说明:

Var

n: Integer;

m: 0..9;

k: 5..20;

则下列赋值语句都是合法的:

n:=3;

m:=n;

k:=n*m+1;

n:=(k-m)*n;

应注意在对子界类型变量赋值时,所赋的值不要越界。

若执行下列语句:

m:=10;k:=n+50;

则变量m的值为10,变量k的值为53,均超过m,k的值域,则在编译时会出错。

3、子界类型的应用

[例2] 从键盘上输入一个字符,判断其为数字字符,字母字符还是其它字符。

程序如下:

Program ex2_2;

Var

c: Char;

Begin

Readln(c);

Case c Of

'0'..'9': Writeln('This is a digit.');

'A'..'Z', 'a'..'z': Writeln('This is a letter.');

Else Writeln('This is a other character.');

End;

End.

[例3] 确定1900~2000年中某年某月的天数。

程序如下:

Program ex2_3;

Type

year=1900..2000;

month=1..12;

days=28..31;

Var

y: year;

m: month;

d: days;

Begin

{$R+}

Write('Input year(1900-2000) and month:');

Readln(y, m);

Case m Of

1,3,5,7,8,10,12:d:=31;

4,6,9,11:d:=30;

2:If (y Mod 4=0) And (y Mod 100<>0) Or (y Mod 400=0) Then d:=29

Else d:=28;

End;

Writeln('d=',d);

End.

在该程序中定义了整数子界类型year、month和days分别表示年、月和天数,为了使系统在运行程序时能自动检查子界类型变量y、m和d的值是否越界,在程序中加了编译器指示{$R+}。若在运行该程序时输入越界的年份或月份,例如输入年份为2001,则中断程序的运行,并出现如下出错信息:

range check error

学习评价

1、设有四种水果:苹果、橘子、香蕉和菠萝,现要任取其中3种水果,不能重复,不计先后顺序,请编写程序列出所有可能的取法。

2、输入年、月、日,输出该月有几天。

3、类型定义

type ren=’A’..’F’;

用A至F表示6个人,输出6个人相互握手的各种情况,统计握手的次数。

第三课数组

在前面我们所学的变量都是独立的变量,即变量之间没有内在的联系,一个变量只能表示一个数据。如果处理的数据个数较少,仅使用简单变量编程就够了。如果处理大批数据,而且这些数据之间有某种内在联系,例如,一个工厂100名工人,要给这100人记入每个月的工资,并求月平均工资,那么用简单变量处理就很不方便了。像此处所说的求平均工资的问题,需要设100个变量:S1,S2,┉,S100,要写出100个变量名,然后在求月平均工资的表达式中进行100项相加运算;如果要处理1000个数据,就要设1000个变量,这种方法显得太烦琐了。为了便于描述、处理,我们经常用一个变量来表示一批数据,而这类变量中,最常用的是数组。

数组是程序中最经常使用的数据类型,由固定数目的相同类型的元素按一定的顺序排列而成。并且在Pascal语言中,数组的元素个数必须事先确定。同时,数组元素的数据类型也必须是固定的、惟一的。比如实型数组,数组元素都必须是实型数;字符数组,数组元素都必须是字符。

一、一维数组

(一)一维数组的定义

一维数组是指只有一个下标的数组,一般用于线性批量数据的组织。

在Pascal语言中定义数组有两种方法:

(1)在说明部分type区中定义数组类型,然后再在Var区中说明数组。形式如下:

type

数组类型名=array[下标类型] of 数组元素类型;

var

数组名:数组类型名;

例如:

type

arr1=array[1..100] of real;

var

a,b:arr1;

以上说明部分的type区中,由用户定义了一个名为arr1的数组类型,在var部分说明了a 和b为arr1类型的数组。

(2)直接在var区中定义数组

var

数组名:array[下标类型] of 数组元素类型;

对于上例中a,b数组的定义,我们完全可以采用以下形式:

a,b:array[1..100] of real;

说明:其中array和of是pascal保留字。方括号中的“下标类型”可以是任何顺序类型,即可以是整型、布尔型、字符型、枚举类型和子界类型。下标类型不仅确定了该数组中数组元素下标的类型,也规定了数组元素可用下标的上界、下界和该数组中元素的个数。如上例:下标类型为子界类型,它规定了数组元素下标的下界是整数1,上界是整数100,该数组一共包含100个元素。在保留字of后面的数组元素类型规定了数组中所包含的每个元素的类型,数组元素类型可以是任何类型。在同一个数组中,所有数组元素都具有相同类型。因此我们可以说,数组是由固定数量的相同类型的元素组成的。

再次提请注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型(标识符)而是数组变量(标识符)。

(二)一维数组的引用

当定义了一个数组,则数组中的各个元素就共用一个数组名( 即该数组变量名),它们之间是通过下标不同以示区别的。对数组的操作归根到底就是对数组元素的操作。一维数组元素的引用格式为:

数组名[下标表达式]

说明:①下标表达式值的类型, 必须与数组类型定义中下标类型完全一致,并且不允许超越所定义的下标下界和上界。

②数组是一个整体,数组名是一个整体的标识,要对数组进行操作,必须对其元素操作。数组元素可以象同类型的普通变量那样作用。如:a[3]:=34;是对数组a中第三个下标变量赋以34的值。read(a[4]);是从键盘读入一个数到数组a第4个元素中去。

特殊地,如果两个数组类型一致,它们之间可以整个数组元素进行传送。如:

var a,b,c:array[1..100] of integer;

begin

c:=a;a:=b;b:=c;

end.

在上程序中,a,b,c三个数组类型完全一致,它们之间可以实现整数组传送,例子中,先将a数组所有元素的值依次传送给数组c,同样b数组传给a,数组c又传送给b,上程序段实际上实现了a,b 两个数组所有元素的交换。

(三)一维数组的应用举例

对数组的操作其实是对所有数组元素的操作,数组元素在上下界之间是连续的,我们可以通过逐个改变下标来逐个进行访问,而下标也可以是个变量,针对这些特点,对数组的操作往往利用下标设计循环,以提高处理效率。

[例1] 按照顺序读入10个数据,以逆序方式输出。

分析:我们可定义一个数组a用以存放输入的10个数, 然后将数组a内容逆序输出。

程序如下:

program ex3_1;

var

a:array[1..10] of integer;

i :integer;

begin

writeln(…Input 10 dates:?);

for i:=1 to 10 do read(a[i]);

writeln(…revers:?);

for i:=10 downto 1 do write(a[i]:3);

end.

[例2] 编程,从数组中找出最大的一个元素,并指出它是哪一个元素。

分析:设变量max,先将第一个元素的值赋与max,从第二个元素开始逐个与max比较,如max小于当前元素,则把当前元素的值赋于max,并记录其下标,然后按此方法,直到所有元素都与max比较完后,max的值即是所有元素中的最大值。

程序如下:

program ex3_2;

var a:array [1..100] of integer;

i,k,n,max:integer;

begin

write('Input n:'); readln(n);

writeln('Input ',n,' datas into array:');

for i:=1 to n do read(a[i]);

readln;

max:=a[1]; k:=1;

for i:=2 to n do

if max

begin max:=a[i]; k:=i end;

writeln('Max is a[',k,']=',max)

end.

[例3] 从键盘输入若干个数,将它们按照从小到大的顺序输出。

分析:在数据处理中经常使用排序。排序的方法很多,如:选择法、冒泡法、shell排序法、插入法等。我们这里以选择法为例如何实现排序。

选择排序的过程如下:

先将一组数(假定为整数)放在a[1],a[2],…,a[n]中。先用a[1]和其他各个元素进行比较,凡比它小的进行交换,一直比到a[n],这样,a[1]中存放的便是最小的元素。然后用a[2]和a[3],a[4],…,a[n]进行比较,凡比它小的进行交换,这样a[2]中存放的便是n个数中的次小元素,以此类推,直到最后。于是a[1]~a[n]便成为一组从小到大排序的数据。

对于数组a,第一遍扫描需进行n-1次比较操作,最小数置于a[1],第二遍扫描需进行n-2次比较操作,次小数置于a[2],每扫描一次,比较的范围就向后移动一个位置。当扫描到第n-1次时,比较数据只需一次就能完成整个排序过程。

程序如下:

program ex3_3;

const n=10; {假设有10个数据需排序}

var a:array[1..n] of integer;

i,j:integer;

temp:integer;

begin

writeln('Input ',n,' datas into array:');

for i:=1 to n do read(a[i]);

writeln(‘array a:’);

for i:=1 to n do write(a[i]:3);writeln; {输出原始数据}

for i:=1 to n-1 do

for j:=i+1 to n do

if a[i]>a[j] then

begin

temp:=a[i];a[i]:=a[j];a[j]:=temp; {交换a[i]、a[j]}

end;

writeln(‘Result’);

for i:=1 to n do write(a[i]:3);writeln; {输出排序结果}

end.

[想一想] 如果需要将一组数据从大到小排序,程序该如何调整?

信息学竞赛选择题

一、单项选择题(共10 题,每题1.5 分,共计15 分。每题有且仅有一个正确答案.)。13届普及组一、单项选择题:(每题1.5分) 1. D 2. D 3. C 4. B 5. B 6.B 7. B 8. C 9. C 10. A 11. C 12. A 13. A 14. A 15. B 16. D 17. C 18. D 19. A 20. A 1.在以下各项中,()不是CPU的组成部分。 A.控制器 B.运算器 C.寄存器 D.主板 2.在关系数据库中,存放在数据库中的数据的逻辑结构以()为主。 A.二叉树 B.多叉树 C.哈希表 D.二维表 3.在下列各项中,只有()不是计算机存储容量的常用单位。 A.Byte B.KB C.UB D.TB 4.ASCII码的含义是()。 A.二→十进制转换码 B.美国信息交换标准代码 C.数字的二进制编码 D.计算机可处理字符的唯一编码 5.一个完整的计算机系统应包括()。 A.系统硬件和系统软件 B.硬件系统和软件系统 C.主机和外部设备 D.主机、键盘、显示器和辅助存储器 6.IT的含义是()。 A.通信技术 B.信息技术 C.网络技术 D.信息学 7.LAN的含义是()。 A.因特网 B.局域网 C.广域网 D.城域网 8.冗余数据是指可以由其它数据导出的数据。例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致。例如,上面4个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是()。 A.应该在数据库中消除一切冗余数据 B.用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据 C.为了提高查询效率,在数据库中可以保留一些冗余数据,但更新时要做相容性检验 D.做相容性检验会降低效率,可以不理睬数据库中的冗余数据 9.在下列各软件,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。A.gcc B.g++ C.Turbo C D.Free Pascal

Freepascal资料详解

Freepascall资料详解 一、TP和FP的功能区别 1.Free Pascal理论上可以使用4GB(2^32byte)的内存,因此实际上几乎可以使用系统中的所有剩余内存(除非赛题中有内存限制),这是因为Free Pascal使用的是32位的编译器。但是对于Turbo Pascal来说,由于是16位的编译器,因此不能定义大小超过64KB (2^16byte)的数据类型和变量,并且在DOS实模式下可以使用的内存总数只有640KB。但这并不是说,你可以随意定义很大的数组了,因为光读入200MB的数据就会让你的程序超时了(因为现在的7200转硬盘和133的系统总线速度决定了读取数据的速度也就100MB/秒)。 2.在Free Pascal中,如果用assign给标准输入输出文件变量input和output指定了文件,在程序结束之前一定要用close关闭input和output,否则输出文件可能不能被正确的写入。这个问题是近几年NOIP竞赛和省队训练、选拔中选手常犯的错误。尤其是程序非正常结束之前(如halt)会忘记。 3.如果用Rewrite打开文件,那么文件就只能被写入了。如果需要读取这个文件,要对文件执行Reset。所以,在Free Pascal中最好不要对一个文件同时进行读写操作。 4.在Free Pascal中,集合中的元素都是4个字节长的。 5.表达式执行的顺序是不确定的。比如对于表达式a:=g(2)+f(3); 不保证g(2)一定在f(3)之前执行。 6.函数和过程在使用时,参数的类型必须和定义时完全一致。原因是在Free Pascal中添加了函数重载功能。 7.PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE成为了关键字,因此不能作为函数和过程的名字;而FAR,NEAR不再是关键字了,原因是Free Pascal是32位系统,不再需要这些关键字。 二、FP的新增功能 1.函数可以返回复杂的类型,比如记录和数组。 如: type arrtype=array[1..100] of longint;{必须要先定义数组基类型} var i,j,k,n:longint; a:arrtype; function sort(a:arrtype;n:longint):arrtype; var i,j,k:longint; begin for i:=1 to n-1 do for j:=i+1 to n do if a>a[j] then begin k:=a; a:=a[j]; a[j]:=k;

动态规划

动态规划 一、背包问题 1、0/1背包[问题背景及描述] Bessie 正在减肥,所以她规定每天不能吃超过C (10 <= C <= 35,000)卡路里的食物。农民John 在戏弄她,在她面前放了B (1 <= B <= 21) 捅食物。每桶内都有某个单位卡路里(范围:1..35,000)的食物(不一定相同)。Bessie 没有自控能力,一旦她开始吃一个桶中的食物,她就一定把这桶食物全部吃完。Bessie 对于组合数学不大在行。请确定一个最优组合,使得可以得到最多的卡路里,并且总量不超过C。例如,总量上限是40卡路里,6 桶食物分别含有7, 13, 17, 19, 29, 和31卡路里的食物。Bessie可以吃7 + 31 = 38卡路里,但是可以获取得更多:7 + 13 + 19 = 39卡路里。没有更好的组合了。 [输入] 共两行。 第一行,两个用空格分开的整数:C 和 B 第二行,B个用空格分开的整数,分别表示每桶中食物所含的卡路里。 [输出] 共一行,一个整数,表示Bessie能获得的最大卡路里,使她不违反减肥的规则。 [输入样例] 40 6 7 13 17 19 29 31 [样例输出] 39 2、固定次数的0/1背包 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件体积是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。V〈30000,n〈100,n[i]〈50。 输入输出格式: 第1行,两个用空格分开的整数:v 和n 第2—n+1行,每件体积是c[i],价值是w[i],最多有n[i]件可用 [输入样例] 40 2 10 20 5 20 30 6 [样例输出] 80 3、重复背包货币系统money 母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。[In their own

Free Pascal错误一览表

Free Pascal错误一览表1、 Run Time Errors 运行错误(A)DOS 错误代码: 1:无效DoS功能号 2:文件末找到3:路径未找到4:打开文件过多 5:禁止文件存取 6:无效文件句柄 12:无效文件存取代码 15:无效驱动器号 16:不能删除当前日录 17:不能跨驱动器改文件名(B)I/O错误100:磁盘读错 误 101:磁盘写错 误 102:文件变量 末赋值 103:文件未打 开 104:文件未用 输入方式打开 105:文件末用 输出方式打开 106:无效数字 格式 (C)严重错误 150:磁盘写保 护 15l:未知单元 152:驱动器未 准备好 153:未知命令 154:数据CRC 校验错 155:驱动器请 求的结构长度 错 156:磁盘定位 错 157:未知媒介 类型 158:扇区末找 到 159:打印机缺 纸 160:设备写失 败

161:设备读失败 162:硬件故障(D)致命错误200:被零除20l:范围检查错 202:堆栈溢出错 203:堆溢出错204:无效指针操作 205:浮点上溢出 206:浮点下溢出 207:无效浮点运算208:未安装覆 盖管理程序 209:覆盖文件 读错 210:对象未初 始化 211:调用抽象 方法 212:流登计错 213:集合下标 越界 214:集合溢出 215:算术上溢 错误 216:存取非法 217:控制-C 218:授权指令 219:无效的TY PECAST 220:无效的变 体TYPECAST 221:无效的变 体操作 222:没有变体 方法调用DISPA TCHER 223:不能建立 变体数组 224:变体不包 含数组 225:变体数组 边界错误 226:TLS初始化 错误 2、编译错误对照表

FREEPASCAL调试技巧

FP调试及其他注意事项 事先说明:调试并不是万能药,FP的调试系统有时并不稳定,如果感觉异常,或者变量一值处于无意义的随机值,或者F7单步模式下它拒绝进入自定义的函数或过程,一般需要你新启动FP再次开始重新调试,如果尝试多次仍然不行,那需要你重新安装Free pascal了,操作方法:先卸载FP,然后手工删除你FP的安装目录(一般是如C盘或D盘下的整个FPC文件夹),然后重新安装FP。1.确定fp处于Debug (调试)模式下,否则将可能无法显示一些诸如越界等错误。 1查看修改方法:Options菜单下-->Mode...后面是否为Debug如果不是,请单击修改为Debug。 2.调试说明A:设置要观察变量:一般用Ctrl+F7可以添加需要查看的变量,也可以单击Debug菜单下-->Watches打开watches窗口右击进行添加修改删除。可以直接添加变量名,也可添加数组名观察整个数组,甚至可以直接加a[i]的这种形式,观察数组中的某个元素。 B:调试方法(均在run菜单下):

F7单步模式,每次执行一条语句(确切的说是屏幕上的一行),运行时会在watches 窗口更新变量的值以供观察。 F8步进模式,每次执行一条语句,但不会深入到自定义的过程或函数中(F7会进入函数过程执行),只在主程序中按行调试执行。 F4Goto Cursor执行到光标处:调试前先将光标停在某行,然后按F4,程序自动在F4处停止,然后可以继续使用F7或F8进行调试,可以省下很多的时间。 复赛解题步骤

1、读题 2、构思策略方法 3、模拟样例数据 4、推举是否存在反例能推翻构思,如果是重新读题构思 5、建立数据结构,估算数据范围。 6、编制程序,使程序通过编译。 7、测试样例。 8、调试程序 根据源代码设计数据,尽可能让程序执行到每条语句(所有分支)。 调试数据选择: a样例b手工构造随机数据c边界数据d特殊构造数据 调试方法: (1)静态查错,直接即观察源代码,需要时打草稿。(不要一出错就跟踪) (2)动态跟踪,F7+Watches(仅在无法在静态差错中找到错误) 9、检查程序,调节优化,估算时间、空间使用情况,根据需要修改程序。 10、检查细节:输入文件名、文件夹。

FreePascal中的编译器选项

FreePascal中的编译器选项 FreePascal中的编译器选项 2010-10-09 18:32:29| 分类: Win32Program |举报 |字号订阅编译器选项: 普通选项: -h 该选项将把所有的命令行选项列出来,然后退出程序 -? 同-H一样的,在分屏显示 -i 这个选项显示编译器版权信息,你能给一个选项,类似下面-ixxx D 返回编译器的日期 V 返回编译器版本 SO 返回编译器的系统版本 SP 返回编译器所选的处理器 TO 返回编译目标系统 TP 返回编译后目标处理器 -l 在标准出上显示Free Pascal的LOGO,同时告诉你Free Pascal的版本号 -n 告诉编译器并不要读入默认的配置文件,你仍

然可以通过@选项来使用配置文件编译器返回的信息: -vxxx xxx可以是下面的: e: 默认的选项,只显示错误 i: 只显示普通的信息 w: 显示警告 n: 显示注意 h: 显示提醒 l: 使用百分比显示错误行的位置 u: 显示加载的单元名称 t: 显示程序试图打开的文件 p: 显示过程和函数的名称 c: 告诉编译器警告你当它处理有条件时 m: 显示被定义的宏 d: 显示其它的调试信息 a: 显示所有的可能的信息 0: 不要任何信息. 当你想不使用配置文件中的默认设置时有用 b: 显示所有所有声明的过程如果一个重载函数出现错误 x: 输出一些执行信息(只对Win32系统游) r: Rhide/GCC兼容模式: 将错误整理以便RHIDE能够使用

V: 创建一个包含有很多调试信息的fpcdebug.txt,主要是给编译器开发者的关于路径及文件的选项 -exxx xxx指明可执行文件as (the assembler)和ld (the linker)的路径. -FaXYZ 在系统单元后但是在其他单元之前加载单元XYZ . XYZ 是一个用逗号分隔的单元名称列表. 只能用于程序,并且和把XYZ放在USES语句的一条效果一致. -FcXXX 设置输入代码页to XXX.还在试验中. -FD 和-e 一样. -Fexxx 将错误写入文件名为xxx的文件. -FExxx 将单元和可执行文件输出到目录xxx ,而不是当前目录. -Fixxx 将xxx作为包含文件的搜索目录 . -Flxxx 将xxx作为library查找路径, 被传给连接器. -FLxxx

信息学奥赛基础知识讲义

[信息学奥赛基础知识讲义] 基础部分 一、进制:2进制数与8进制、10进制、16进制数的换算 换算1:将N进制数换算成10进制数(N可以为2,8,16或其它自然数) 换算2:将10进制数换算成N进制数(N可以为2,8,16或其它自然数) 1.下列无符号数中,最小的数是() A.(11011001)2 B.(75)10 C.(37)8 D.(2A)16 7、小张用十六进制,八进制和十进制写下了如下一个等式: 52-19=33 式中三个数是各不相同进位制的数,试问52,19,33,分别为______。 (A)8,10, 16 (B)10, 16, 8 (c) 8, 16, 10 (D) 10, 8, 16 二、数据的存储和编码 所有的数据都是以二进制存储在计算机的存储器中的,数据的传送、存储、加工、处理或指令都是以二进制形式进行的。 对于数值:弄清原码、反码、补码以及定点数和浮点数。负数在计算机中以补码形式存放,小数在计算机中是以浮点数形式存放。 0的原码表示法有两种,+0和—0 8位定点整数的补码表示范围为-128_____+127 14、计算机中的数有浮点数与定点数两种,其中用浮点数表示的数,通常由()这两部分组成。 A.指数与基数 B. 尾数与小数 C. 阶码与尾数 D.整数与小数 8、如果用一个字节表示一个整数,最高位用作符号位,其他位表示数值,例如 00000001表示+1,10000001表示-1 (1)试问这样表示法的整数a的范围应是———————— A、-127<=a<=127 B、-128<=a<=128 C、-128<=a<127 D、-128

FREE-PASCAL入门-循环结构程序(DOC)

循环结构程序设计 第1节 For循环程序实例 【问题描述】 计算一副扑克牌的点数,其中牌A为1点,牌J、Q、K分别为11、12、13点,大、小王不算点。 【问题分析】 根据题意,要计算一副扑克牌的点数,可以先求出一种花色牌的点数和,再乘以4即可。进一步分析,求一种花色牌的点数和,即是求1~13的连续自然数之和。我们用S表示所求数的和,用T表示加数,这样可以让T从1变化到13,每次让T不断加入到S中,就可以求出S的值,最后乘以4即可。 【算法设计】 ◆自然语言 ①置初值,即S=0,T=1; ②使S=S+T ,所求出的和仍放入S中; ③使T增加1,即T=T+1; ④如果T小于等于13,转第二步,否则转第五步; ⑤输出计算结果。 ◆程序流程图和结构化流程(N-S)图

【程序设计】 [程序清单] program ex3_1; var s,t:integer; begin s:=0; {S置初值为0} for t:=1 to 13 do {For循环语句} s:=s+t; writeln(‘total:’,s*4); end. [运行示例] total:364 【知识拓展】 1.在程序处理过程中,经常需要对某一条或一组语句重复执行多次,以最终完成某项任务,这就是循环。对于重复次数已知,而不依赖循环中语句的结果,常用计数循环(f or / to /do 语句)。 2.for循环语句格式: 格式一:for 控制变量:= 初值to 终值do 循环体语句; 格式二:for 控制变量:= 初值downto 终值do 循环体语句; 其中for、to、downto、do为保留字,do后面的语句称为循环体。其中循环控制变量可以是整型、字符或布尔型,但不能为实型。一般地,可以是顺序类型数据。 初值、终值表达式通常要与控制变量的类型相同。

FreePascal3.2

第二节repeat 循环 Repeat循环是直到型循环。 试将上一节的例3.1(打印出1~20的平方数表)程序改为repeat 循环: Program Exam31_1; Var a: byte; Begin a:=1;writeln ( ' a ' : 8 , ' a*a ' : 8 ) ; repeat writeln ( a :8,a*a : 8); inc(a);{改变a的值} Until a>20; Readln Emd. 程序中的Repeat循环格式为: repeat 循环体语句; until 条件表达式;{直到条件为真} Repeat循环首先执行由Repeat和Until括起来的循环体语句,然后检查Until后面的条件表达式:如果表达式结果为假,则继续执行循环体,接着继续检查Until后面的条件表达式,如此反复执行直到这个表达式结果为真时结束循环。Repeat循环体语句必须有能改变Until后面条件表达式值的语句,并最终使这个条件表达式的值为真,使循环自动结束。 程序中inc (a) 指令相当于a : =a+1,常用的同类指令格式如下: (1) inc(x) 等同x:=x+1; (2) inc(x, n) 等同x:=x+n; (3) dec(x) 等同x:=x—1; (4) dec(x,n) 等同x:=x—n; [例3.10]求两个自然数M和N的最大公约数。 解:若自然数a既是M和约数,又是N的约数,则称a为M和N的公约数,其中最大的称为最大公约数。为了求得最大公约数,可以从最大可能的数(如M或N)向下寻找,找到的第一个公约数即是最大公约数。 Pascal程序: Program ex310; Begin a := N+1; Repeat a := a-1; Until (M mod a=0) and (N mod a=0); writeln(a); Readln; End.

宁波市第22届中小学生计算机程序设计竞赛

宁波市第22届中小学生计算机程序设计竞赛 预赛试题(小学组) (考试时间120分钟,满分100分) ●●所有提交的答案都以写在答卷纸上的为准,写在试卷上的一律无效●● 学校姓名 一、选择题:请选出各题正确答案的代码(A/B/C/D)(每题2分,共40分) 1、在微型计算机的汉字系统中,一个汉字内码所占的字节数是()。 (A)1 (B)2 (C)3 (D)4 2、软盘加上写保护后,这时对它可进行的操作是()。 (A)只能读盘,不能写盘(B)既可读盘,又可写盘 (C)只能写盘,不能读盘(D)不能读盘,也不能写盘 3、下列存储设备中,断电后其中的信息会消失的是()。 (A)硬盘(B)ROM (C)RAM (D)U盘 4、pascal语言中运算(-13)MOD (-2)的结果是()。 (A)1 (B)-1 (C)0 (D)-2 5、数组A有10个下标变量,各个下标变量的赋值情形如下所示,则表达式A[A[A[5]]]的值是()。 (A)10 (B)5 (C)6 (D)2 6、1GB= ()KB 。 (A)1000 (B)1024 (C)1024×1024 (D)1000×1000 7、下面有关计算机病毒的说法,错误的是()。 (A)为防止病毒感染计算机,使用软盘时,将软盘写保护 (B)计算机的病毒不仅能损坏文件,还可能造成电脑主板等硬件的损坏 (C)上网的电脑有可能会感染病毒 (D)计算机病毒也是程序 8、下列存储器中,存取速度最快的是()。 (A)软盘(B)内存(C)光盘(D)硬盘 9、在Windows 中,能通过输入“?a*.?”命令查找到的文件是()。 (A)pascal.c (B)ppa.1 (C)https://www.wendangku.net/doc/b314956074.html, (D)https://www.wendangku.net/doc/b314956074.html,

初中信息学奥赛校本教材开发的实践与研究-最新教育资料

初中信息学奥赛校本教材开发的实践与研究 目前,有关信息学方面的教材比较多,如,南京大学出版社出版的《全国青少年信息学奥林匹克联赛》《信息学(计算机)奥林匹克》,电子工业出版社出版的《PASCAL语言程序设计》,科学技术文献出版社出版的《Free Pascal语言与基础算法》等,每本教材都有各自的局限性,有些并不符合我校学生的实际情况。 我校从2003年开始开展信息学奥赛校本课程,培训资料大部分来源于大学计算机专业教材,随着网络资料的不断丰富和信息学方面的教材出版增多,培训资料搜集的来源越来越丰富。 在这十几年信息学竞赛的教学过程中,笔者深知初中学生的特点和教学规律,这使得最终开发的校本教材能够适合初中信息学奥赛校本课程。现将自己在校本教材开发实践中得到的感受和思考,简述如下,希望得到同行和专家的指正。 一、适合初中生 由于初一学生在小学的时候一般都没有接触过计算机程序,程序对他们来说既神秘又陌生。这个阶段的学生好奇心强、动手解决问题的欲望强烈,但是还不能比较理智地处理问题,排除各种对学习的干扰。因此,他们往往不能保持学习精力的高度集中和自觉。 程序入门例题:

1.已知一辆自行车的售价是300元,请编程计算a辆自行车的总价是多少? 2.“鸡兔同笼”问题,已知笼中的头共30个,脚共90只,问鸡和兔各有多少只? 3.“兔子繁殖”问题,已知一对兔子,每个月可以生一对小兔,而小兔过一个月也可生一对小兔。即兔子的对数是:第一个月1对,第二个月2对,第三个月3对,第四个月5对……假设兔子的生育期是12个月,并且不死,问一年后,这对兔子有多少对活着的后代? 二、培养学生自学能力为目的 参加信息学奥赛的学生都是经过选拔出来学校中最优秀的 学生,这批学生各方面能力都很强,他们需要有自由发挥的空间,在教学过程中提倡学生的自主探究,而教师对学生的学习中起到引导作用。因此,开发的校本教材本身要适合教学。 1.教材中问题的设计首先与现实生活、新兴的科技成果等问题密切联系,让学生知道学习的实际用途,如果一个学生连自己为什么要学习都弄不清楚,那么他的学习行为肯定是被动的。 2.问题的解决,必须要有思考的过程,所以每个题目都加入了对问题不同程度的解析,再通过分析得出程序,给学生参考,让学生知道为什么这么写程序。 3.学生懂得了具体的解题思路,但是对于具体程序可能还是有难度的,所以对于一个程序中关键的代码要给予注释,加深学

Free pascal标准数据类型

Free pascal标准数据类型、内置函数等必备知识 一、实型整型 实型:数值范围:占字节数:有效位数 real:2.9e-39..1.7e38: 6 :11..12 single:1.5e-45..3.4e38: 4 :7..8 double:5.0e-324..1.7e308: 8 :15..16 extended:3.4e-4951..1.1e49 32 :10:19..20 comp:-2**63+1..2**63-1: 8 :19..20 整型:数值范围:占字节数:格式 shortint:-128..127:1:带符号8位 integer:-32768..32767:2:带符号16位 longint:-2147483648..2147483647:4:带符号32位 byte:0..255:1:无符号8位 word:0..65535:2:无符号16位 longword:0..4294967295:4 Cardinal:either word, longword or qword:size 2/4/8 Int64:-9223372036854775808..9223372036854775807:8 QWord:0..18446744073709551615:8 二、常用的pascal内置函数和过程

标准常量False,Maxint,True,Maxlongint,Pi 标准类型Boolean,Char,Real,Integer,Longint,等等 标准函数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,Unp ack,Write,Writeln 标准文件Input,Output (1)自变量必须为整型的标准函数: (A)前趋函数:Pred(x),函数结果类型为整型,如:Pred(4)=3 (B)后继函数:Succ(x),函数结果类型为整型,如:Succ(4)=5 (C)奇函数:odd(x),结果为布尔型。如:Odd(13)=True (D)字符函数:Chr(x)其中x为ASCII码,函数结果为字符型。如:Chr(65)='A' (2)自变量为整型(或实型),但函数值类型为实型的标准函数; (A)平方根函数:Sqrt(x) (B)整数函数:Int(x) 取整数部分,如:INT(3.85)= 3.0 (C)小数函数:Frac(x) (D)正弦函数:Sin(x)

free pascal 多线程

要创建一个新的进程,要使用BeginThread函数.它有一个强制的参数: 这个函数将执行新的线程.返回的结果是线程退出的结果. 这个现成能够被一个用来访问初始化数据的指针所传递, 程序员必须确定线程可访问的数据在访问之前没有超出范围. 函数定义: THandle=Word; TThreadFunc = function(parameter : pointer) : longint; function BeginThread(ThreadFunction: tthreadfunc) : DWord; function BeginThread(ThreadFunction: tthreadfunc; p: pointer): DWord; function BeginThread(ThreadFunction:tthreadfunc;p: pointer;var ThreadId:THandle) :DWord; 如果给了,指针p将被传递给线程当线程开始时(否则,将传递Nil). 如果给了ThreadID, 那么这个线程的ID将被存储起来. 重新开始的线程直到线程函数退出或者被EndThread结束: procedure EndThread(ExitCode : DWord); procedure EndThread; exitcode能和线程开始的代码进行检查. 下面的小例子将告诉你怎么使用: {$Mode ObjFPc} {$Threading On} Uses sysutils {$ifdef unix},cthreads{$endif} ; Const threadcount = 100; stringlen = 10000; Var Finished:Longint; Threadvar thri:Longint; Function f(p : pointer):Longint; Var s:Ansistring; Begin Writeln('thread ',longint(p),' started');

FREE PASCAL 教程

Free Pascal教程 目录 第一章简单程序 (2) 第一节Pascal程序结构和基本语句 (2) 第二节顺序结构程序与基本数据类型 (6) 第二章分支程序 (9) 第一节条件语句与复合语句 (9) 第二节情况语句与算术标准函数 (10) 第三章循环程序 (14) 第一节for循环 (14) 第二节repeat循环 (20) 第三节While循环 (24) 第四章函数与过程 (29) 第一节函数 (29) 第二节自定义过程 (31) 第五章Pascal的自定义数据类型 (36) 第一节数组与子界类型 (36) 第二节二维数组与枚举类型 (43) 第三节集合类型 (51) 第四节记录类型和文件类型 (55) 第五节指针类型与动态数据结构 (61) 第六章程序设计与基本算法 (66) 第一节递推与递归算法 (66) 第二节回溯算法 (72) 第七章数据结构及其应用 (78) 第一节线性表 (78) 第二节队列 (81) 第三节栈 (84) 第四节数组 (88) 第八章搜索 (91) 第一节深度优先搜索 (91) 第二节广度优先搜索 (101) 第九章其他常用知识和算法 (105) 第一节图论及其基本算法 (105) 第二节动态规划 (112)

第一章简单程序 无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在Pascal语言中,执行每条语句都是由计算机完成相应的操作。编写Pascal程序,是利用Pascal语句的功能来实现和达到预定的处理要求。“千里之行,始于足下”,我们从简单程序学起,逐步了解和掌握怎样编写程序。 第一节Pascal程序结构和基本语句 在未系统学习Pascal语言之前,暂且绕过那些繁琐的语法规则细节,通过下面的简单例题,可以速成掌握Pascal程序的基本组成和基本语句的用法,让初学者直接模仿学习编简单程序。 [例1.1]编程在屏幕上显示“Hello World!”。 Pascal程序: Program ex11; Begin Writeln(‘Hello World!’); ReadLn; End. 这个简单样例程序,希望大家的程序设计学习能有一个良好的开端。程序中的Writeln是一个输出语句,它能命令计算机在屏幕上输出相应的内容,而紧跟Writeln语句后是一对圆括号,其中用单引号引起的部分将被原原本本地显示出来。 [例1.2]已知一辆自行车的售价是300元,请编程计算a辆自行车的总价是多少? 解:若总售价用m来表示,则这个问题可分为以下几步处理: ①从键盘输入自行车的数目a; ②用公式m=300*a计算总售价; ③输出计算结果。 Pascal程序: Program Ex12;{程序首部} Var a,m:integer;{说明部分} Begin{语句部分} Write(‘a=’); ReadLn(a);{输入自行车数目} M:=300*a;{计算总售价} Writeln(‘M=’,m);{输出总售价} ReadLn;{等待输入回车键} End.

Free Pascal 简要语法书

Free Pascal 简要语法书 一、基本结构 一个FP程序一般可以分为程序首部(Program语句)、程序说明(常量、变量、自定义函数过程)和程序主体(Begin到End.)三部分。语句间用分号“;”分隔,一般一行写一条语句,程序最后用End.(句点)结束。基本框架如下: Program 程序名(参数); Label 标号说明; Const 常量说明; Type 类型说明; Var 变量说明; Function 函数说明; Procedure 过程说明; Begin 程序主体;

二、程序说明部分 1.常量定义(const) 常量名=常量数据; 2.类型说明(type) 类型名=类型 类型说明; 3.变量定义 变量名(多个变量名用逗号分开):变量类型; 变量类型

i.整数类型 ii.实数类型 iii.布尔类型 Type Range Boolean 1 true、false iv.字符类型 Type Range char 1 String 默认最大255个字符 4.自定义函数 function 函数名(形式参数表):返回类型; 函数的说明部分 begin 函数主体; …… 函数名:=返回值; end; function max(x,y:integer):integer; var m:integer; begin if x>y then m:=x else m:=y; max:=m; end; 当函数被赋值后,可以用exit 直接退出函数,回到主程序。 5.自定义过程 procedure 过程名(形式参数表); 过程说明部分;

begin 过程主体; …… end; 可以用过程exit 直接退出过程,回到主程序。 例题: Program ex1; Var a:_______; b:________; c:_________; Begin a:=10; b:=2; c:=a/b; writeln(c); end. 三、表达式的书写:在程序中的表达式书写方式与数学书写方式有一些区别: 1.数学运算符号:+ - * / div mod div 表示整除运算例13 div 4=3 mod 表示取余运算例13 mod 4=1(mod div 为运算符号前后必须留空白) 2.关系运算符号:> < <= => <> 关系运算的结果为真假值例5>7=false <>表示不等于例8<>9=____________ 3. 逻辑运算符号:not and or not 将关系表达式的结果取反not(5>7)=____________ and 连接两个关系表达式,当这两个关系表达式的结果为真,整个表达式结果才为真 or 连接连接两个关系表达式,当这两个关系表达式有一个的结果为真,整个表达式结果就为真 》》练习: 表示x在[5,10]之间 a,b,c代表三边,表示a,b,c构成了等腰三角形,等边三角形

free pascal 函数大全

一、数学函数: inc(i) 使i:=i+1; inc(i,b) 使i:=i+b; dec(i) 使i:=i-1; dec(i,b) 使i:=i-b; abs(x) 求x的绝对值例:abs(-3)=3 chr(x) 求编号x对应的字符。例:chr(65)='a' chr(97)='a' chr(48)='0' ord(x) 求字符x对应的编号。例:ord(‘a')=65 ord(‘a')=97 另外:ord(false)=0 ord(true)=1 sqr(x) 求x的平方。例:sqr(4)=16 sqrt(x) 求x的正根. 例:sqrt(16)=4 (ps:负数是不能进行运算的,如果需要就要先取绝对值:sqrt(-4)是错的,应该为sqrt(abs(-4)) round(x) 求x的四舍五入例:round(4.5)=5 trunc(x) 求x的整数部分例:trunc(5.6)=5 结果是integer型 int(x) 求x的整数部分例int(5.6)=5.0 结果是real型 frac (x) 求x的小数部分例 frac(5.6)=0.6 pred(x) 求x的前导 pred(‘b')='a' pred(5)=4 pred(true)=false succ(x) 求x的后继 succ(‘b')='c' succ(5)=6 succ(false)=true odd(x) 判断x是否为奇数。如果是值为true,反之值为false. odd(2)=false odd(5)=true power(a,n) 求a的n次方 power(2,3)=8 {只有在开启math库时才可以使用} random 取0~1之间的随机数(不能取到1) randomize 随机数的种子函数,在每次设置随机数时都要把这个函数放在最前面. fillchar(a,size(a),0) 数组初始化,即把数组a的值全部置为0 ;赋成布尔型变量也可以,但注意,赋成1或其他数字,计算机并不会把数组赋成你想要的值,却是其他的数字 shr: x shr n 把x换成二进制后向右移n位,相当于把x 除以 2^n shl: x shl n 把x换成二进制后向左移n位,相当于把x 乘以 2^n pascal标准函数 2009-10-31 21:14 pascal标准函数 一、变量改变: 1、inc(i) 使用后I:=I+1; Inc(I,b)使用后I:=I+b; 2、Dec(i) ;使用后I:=I-1;dec(I,b)使用后I:=I-b; 3、求x的绝对值 Abs(x) 例:abs(-3)=3 二、数学计算方面: 1、求x的平方 Sqr(x) 例:sqr(4)=16 2、求x的开方 Sqrt(x) 例:sqrt(16)=4 3、求x的四舍五入round(x) 例:round(4.5)=5 4、求x的整数部分trunc(x) 例:trunc(5.6)=5 结果是integer型 5、求x的整数部分int(x)例int(5.6)=5.0 结果是real型 6、求x的小数部分frac (x) 例 frac(5.6)=0.6

freePascal教程

第四单元 PASCAL 语言程序设计 在上一册教材中,我们已经初步了解了P ASCAL 语言的三种基本结构、程序设计的基本思想和方法。本单元是在上册内容的基础上进一步深入学习P ASCAL 语言的数组、子程序、字符串处理等基础知识。随着学习的深入,程序设计的题目类型越来越广泛,难度也越来越大,程序设计者不能“完全”把求解的任务推给计算机,而应对题目作较充分的分析,用较优的算法去求解,因此在计算机上编程解题是一项极好的实践活动,它可以训练观察能力、逻辑思维能力、形式化描述问题能力、规划能力、动手动脑分析问题和解决问题的能力。 第一课 循环结构的程序设计 在程序设计中,经常处理一些需要重复执行某些操作的问题,这就需要循环结构程序设计,循环结构是程序设计的三种基本结构之一,循环结构是指当某个条件满足时反复执行某些语句,否则不执行。利用循环结构,使得我们能用少而精的程序编码,来完成大量的重复计算。 在Pascal 语言中,实现循环程序设计的主要语句有For 语句(计数循环)、While 语句(当型循环)、Repeat 语句(直到型循环)。上册教材已经介绍了For 语句,本节课介绍While 语句、Repeat 语句及多重循环结构。 一、 W hile 语句结构 For 循环语句适用于已知次数的循环结构,而在实际的问题中,有时我们并不能确切知道循环要执行多少次,我们判断是否结束循环的依据是某个条件是否满足,比如“当……时就做……”,或者是“一直做到……时为止”,这种循环我们称之为条件循环。在Pascal 中条件循环语句有两种,分别是While 循环语句和Repeat 循环语句。下面分别介绍这两种语句的使用方法。 While 语句用于“当满足某一条件时进行循环”的情况,因此它也被称为“当型循环”。While 语句的语法格式如下: While <布尔表达式> do <循环体语句>; While 循环语句的执行流程如图1-1-1所示。 图1-1-1 While 循环语句执行流程 布尔表达式 True False 循环体

FP的技巧与数据类型

FP的技巧与数据类型 [日期:2005-11-05]来源:作者:myheimu[字体:大中小] FreePascal中的基本数据类型 预定义整型 类型范围长度(字节) Byte0..2551 Shortint-128..1271 Smallint-32768..327672 Word0..655352 Integer either smallint,longint or int64size2,4or8 Cardinal either word,longword or qword size2,4or8 Longint-2147483648..21474836474 Longword0..42949672954 Int64-9223372036854775808..92233720368547758078 QWord0..184467440737095516158 支持的实型 类型范围有效宽度长度(字节) Real platform dependant???4or8 Single 1.5E-45..3.4E387-84 Double 5.0E-324..1.7E30815-168 Extended1.9E-4951..1.1E493219-2010 Comp-2E64+1..2E63-119-208 MAXINT和MAXLONGINT分别代表最大的INTEGER和LONGINT,则最小的就分别为MAXINT-1和MAXLONGINT-1 Free Pascal和Turbo Pascal的主要区别 虽然Free Pascal尽量设计得和Turbo Pascal接近,但是由于以下的两个原因,两者之间还是有一些区别的: 1.Free Pascal是一个32位的编译器,而Turbo Pascal只是16位编译器;2.Free Pascal是一个跨平台的编译器,而Turbo Pascal只在windows上使用。

free pascal练习

寒假练习 -------鑫 若题目中未做特殊声明输给数据为非负整数且数据量小于10000 1.输入一串字符,以”?“结束,统计其中每个字母出现的次数。(所给数据为字符型) 2.读入n输出1+1/2+1/3+1/4…+1/n的值。 3.输入n个学生的某门课程的成绩,打印出高于平均分的同学号数与成绩;打印出成绩最好的同学与成绩。(若平均数无法整除取整) 4.20级台阶,每步走一阶或两阶,求共有多少种走法。 5.假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在100元要求买100只鸡,编程列出所有可能的购鸡方案。 6.求两个数的公约数,公倍数。(辗转相除法) 7.读入n个数,统计其中是质数的个数。 8.求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。 9.打印九九乘法口诀表。 10.编程求斐波那契数列的前n项。 11.编程给小学生出10道1位数加数的题目,每做对一题加10分,最后显示统计小学生所得分数. 12.从键盘入星期的数字,输出对应的英语单词。0表示星期天。 13.输出某年的每个月的天数。 14.输入一个三角形的三边,判断它是否是直角三角形 15.已知二元一次方程的a,b,c求一个一元二次方程的两个根(包括

曾根)。 16.输入三个数判断能否构成三角形。 17.输入三角形三边(三边可以构成三角形),求其面积。(海伦公式) 18.随机产生的100个40到100以内整数,统计每个数出现的次数. 19.读入n个数,将他们排序后,正序输出。 20.题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。 输入格式 输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。 输出格式 输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

相关文档