首页 PASCAL教学 PASCAL教程 PASCAL练习题 基础知识 常用算法 阶段测试 初赛试题 复赛题库 FP错误代码 留言板
 
第一章 简单程序
第一节 程序结构和基本语句
第二节 顺序结构程序与基本数据类型
第二章 分支程序
第一节 条件语句与复合语句
第二节 情况语句与算术标准函数
第三章 循环程序
第一节 程序结构和基本语句
第二节 Repeat 循环
第三节 While 循环
第四章 函数与过程
第一节 函数
第二节 自定义过程
第五章 自定义数据类型
第一节 数组与子界类型
第二节 二维数组与枚举类型
第三节 集合类型
第四节 记录类型和文件类型
第五节 指针类型与动态数据结构
第六章 程序设计与基本算法
第一节 递推与递归算法
第二节 回溯算法
第七章 数据结构及其应用
第一节 线性表
第二节 队列
第三节 栈
第四节 数组
第八章 搜索
第一节 深度优先搜索
第二节 广度优先搜索
第九章 其他常用知识和算法
第一节 图论及其基本算法
第二节 动态规划
   

第二节  顺序结构程序与基本数据类型

前面的简单程序已体现出处理问题步骤、思路的顺序关系,这就是顺序结构程序。

[例1.7]交换两个变量的值:由键盘输入两个正整数AB,编程交换这两个变量的值。

解:交换两个变量的值,可以想象成交换两盒录音带(称为AB)的内容,可以按以下步骤处理:

步骤①:拿一盒空白录音带C为过渡,先将A翻录至C

步骤②:再将B翻录至A

步骤③:最后将C翻录至B

这样操作,可达到题目要求。

Pascal程序:

Program Exam17;

Var a,b,c   : integer;

Begin

  Write(‘A,B=’);

  Readln(a,b);

  C:= A;                {等价于步骤1

  A := B;                {等价于步骤2

  B := C;                {等价于步骤3

  Writeln(A,B);

End.

[1.8] 分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?

:设甲、乙、丙三人的钱数分别为ABC。用倒推(逆序)算法, 从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:(在每个步骤中,各人钱数分别存在ABC中)

  步骤①: A=8 B=8 C=8        {这是最后结果的钱数,三人都一样多 }

  步骤②: A=A/2 (=4)     B=B/2 (=4)     C=A+B+C(=16)     { AB未得到丙分给的钱时,只有结果数的一半;C应包含给AB及本身数三者之和 }

  步骤③: A=A/2 (=2)     C=C/2 (=8)     B=A+B+C(=14)      {AC未得到乙分给的钱时,只有巳有数的一半;B应包含给AC及本身数三者之和 }

  步骤④: B=B/2 (=7)     C=C/2 (=4)     A=A+B+C(=13)    

 C未得到甲分给的钱时,只有巳有数的一半;A应包含给BC及本身数三者之和 }

  步骤⑤: 输出A=13B=7C=4{此时的ABC 就是三人原先的钱数 }

Pascal程序:

Program Exam18

Var abc: integer

Begin

  a:=8 b:=8 c:=8                                         {对应于步骤①}

a:=a div 2 b:=b div 2 c:=a+b+c                {对应于步骤②}

  a:=a div 2 c:=c div 2 b:=a+b+c                {对应于步骤③}

  b:=b div 2 c:=c div 2 a:=a+b+c                {对应于步骤④}

  Writeln('a='a'  ': 4'b='b'  ': 4'c='c) ;  {输出}

  Readln

End.

细心观察,会发现本程序语句的顺序很关键。此例用反推顺序(逆序),按步骤正确推算出各变量的值。当然,有的问题可按正序步骤编程,这类程序都称为顺序程序。

本程序Writeln语句的输出项含有(  '  ' :  4 ),这里的冒号用来指定该项显示所占宽度,此处是输出4个空格即(空格项占4)

 

[1.9] 有鸡兔同笼,头30,脚 90,究竟笼中的鸡和兔各有多少只?

:设鸡为J只,兔为T只,头为H,脚为F,则:

        J+T=30                

2*J+4*T=90    

解此题暂不必采用数学上直接解方程的办法,可采用“假设条件与逻辑推理”的办法:

 假设笼中30 个头全都是兔,那么都按每头4只脚计算,总脚数为(4*H),与实际脚数 ( F )之差为(4*HF),如果这个差=0,则笼中全是兔(即鸡为0只);如果这个差值 >0,说明多计算了脚数,凡是鸡都多给算了两只脚,用它除以2就能得到鸡的只数,处理步骤为:

    J=(4*HF)/2       {先用脚数差值除以2算出鸡的只数}

    T=HJ                {再用总头数减鸡数算出免的只数}

按此方法,这两步运算必须注意先后顺序才会符合运算逻辑。

Pascal程序:

Program Exam16

Const H=30                 {常量说明 }

     F=90

Var JT: byte            {为字节类型的整数 }

Begin

  J:=(4*H-F) div 2    {整除运算 }

  T:=H-J

  Writeln ('J='J'  ': 6'T= 'T )

  Readln

End.

本程序中HF为常量,变量JTbyte类型,属于整数类型。

Pascal定义了五个标准整数类型,如下表所示:

类型

取值范围

占字节数

格式

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

 在前面程序中常用的数据类型除整数类型,还有实数类型。Pascal 还定义了五个标准实数类型,列表所示如下:

类型

取值范围

占字节数

有效数字

Real

2.9×10-39~1.7×1038

6

7~8

Single

1.5×10-45~3.4×1038

4

11~12

Double

5.0×10-324~1.7×10308

8

15~16

Extended

1.9×10-4951~1.1×104932

10

19~20

Comp

-263+1~238-1

8

19~20

 

Turbo Pascal 中实数的表示用科学记数法,可认为由三部分组成:

              # .  ## E +##   # . ## E -##

  ###表示有效数字; E表示以10为底的幂; +##-##是指数部分,+号可省略。

例如:   1.7E+38 可写成1.7E38 (等同于1. 7×1038 )

在实数类型定义下,即使是整数,在程序执行时系统也将自动转换成科学记数形式,试请运行下面程序并注意观察运行结果:

Program Exam17

Var x: real                   {x为实数类型 }

Begin

  X:=180                 {把整数180赋给实数类型变量X}

  Writeln ('x='x)       {输出的x自动表示成实数形式 }

  Readln

End.

习题1. 2

1.已知△ABC中的三边长分别为25.7674.0359.31,求△ABC的面积。

    ( 计算公式: S=                                          其中P =                 )

2.某车棚存有自行车和三轮车共65辆,它们的轮子数合计为150个。求该棚内存有的自行车和三轮车各是多少辆?

3.甲、乙、丙三人分别有磁带364864盒。先由甲把自己的磁带平均分为三份,分给乙、丙各一份,自己留下一份;接着是乙,最后是丙,都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少? (输出所有的中间结果)

4.五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?

 

© 版权所有 桐乡市高级中学计算机组 王建献 2005-
制作与维护:
桐高计算机组 王建献 邮箱:omnislash2000@163.com
建议使用:800*600分辨率,IE5.0以上版本浏览器