1、-_第一章 简单程序无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在 Pascal 语言中,执行每条语句都是由计算机完成相应的操作。编写 Pascal 程序,是利用 Pascal 语句的功能来实现和达到预定的处理要求。 “千里之行,始于足下”,我们从简单程序学起,逐步了解和掌握怎样编写程序。第一节 Pascal 程
2、序结构和基本语句在未系统学习 Pascal 语言之前,暂且绕过那些繁琐的语法规则细节,通过下面的简单例题,可以速成掌握 Pascal 程序的基本组成和基本语句的用法,让初学者直接模仿学习编简单程序。例 1.1编程在屏幕上显示“Hello World!”。Pascal 程序:Program ex11;BeginWriteln(Hello World!);ReadLn;End.这个简单样例程序,希望大家的程序设计学习能有一个良好的开端。程序中的 Writeln是一个输出语句,它能命令计算机在屏幕上输出相应的内容,而紧跟 Writeln 语句后是一对圆括号,其中用单引号引起的部分将被原原本本地显示出
3、来。例 1.2已知一辆自行车的售价是 300 元,请编程计算 a 辆自行车的总价是多少?解:若总售价用 m 来表示,则这个问题可分为以下几步处理:= 1 * GB3 从键盘输入自行车的数目 a;= 2 * GB3 用公式 m=300*a 计算总售价;= 3 * GB3 输出计算结果。Pascal 程序:Program Ex12; 程序首部Var a,m : integer; 说明部分Begin 语句部分Write(a=);ReadLn(a); 输入自行车数目-_M := 300*a; 计算总售价Writeln(M=,m); 输出总售价ReadLn; 等待输入回车键End.此题程序结构完整,从中
4、可看出一个 Pascal 程序由三部分组成:(1)程序首部由保留字 Program 开头,后面跟一个程序名(如:Exl1);其格式为 :Program 程序名;程序名由用户自己取,它的第一个字符必须是英文字母,其后的字符只能是字母或数字和下划线组成,程序名中不能出现运算符、标点符和空格。(2)说明部分程序中所用的常量、变量,或类型、及过程与自定义函数,需在使用之前预先说明,定义数据的属性(类型)。 例 1.2 程序中 Var S,R ,C: Real; 是变量说明,此处说明S,R , C 三个变量均为实数类型变量。只有被说明为某一类型的变量,在程序中才能将与该变量同类型的数值赋给该变量。变量说
5、明的格式为: Var 变量表:类型;(3)语句部分指由保留字 Begin (开始) 至 End. (结尾) 之间的语句系列,是解决问题的具体处理步骤,也是程序的执行部分。Pascal 程序不管是哪部分,每句末尾都必须有分号(;),但允许最接近 End 的那个语句末尾的分号省略;程序结束的 End 末尾必须有圆点(. ) ,是整个程序的结束标志。程序中花括号“ ”之间的部分为注释部分。Pascal 程序结构可归纳用如下来表示:Program 程序名; 程序首部标号说明; (Label)常量说明; (Const) 说明部分类型说明; (Type)变量说明; (Var)过程或函数说明; Begin
6、程序体 ( 主程序)语句系列; 语句部分End. 把处理问题的步骤编成能从上到下顺序执行的程序,是简单程序的基本特征。再来分析下面两道例题的 Pascal 程序结构和继续学习基本语句。例 1.3编程计算半径为 R 的圆的面积和周长。解:这是一个简单问题,按数学方法可分以下几步进行处理: 从键盘输入半径的值 R; 要求告诉圆的半径 R 用公式 S=R 2 计算圆面积; 用公式 C=2R 计算圆周长;-_ 输出计算结果。Pascal 程序 :Program Ex13; 程序首部 Var R,S,C: Real ; 说明部分 Begin 语句部分 Write (R=?);Readln(R); 输入半
7、径 S:=Pi*R*R; 圆面积公式 S=R 2C:=2*Pi*R; 圆周长公式 C=2RWriteln(S=,S); 输出结果 Writeln(C=,C); Readln 等待输入回车键 End.程序中 Pi 是 Pascal 提供的标准函数,它返回圆周率的近似值:3.1415926。(:=)是赋值符号,赋值语句的格式为:变量:=表达式;赋值语句的作用是将:=右边表达式的值记录到左边的变量中。Writeln 是输出语句,输出语句有三种格式: Write ( 输出项 1,输出项 2) ; 执行输出后光标不换行 Writeln (输出项 1,输出项 2) ; 执行输出后光标换到下一行 Write
8、ln 仅输出空白且光标换到下一行Writeln 语句后面的圆括号以内部分均为输出项,可以是多项,各项间用逗号分隔; 对单引号里的内容按照引号内的原样(字符) 输出显示。如果输出项是表达式,则只输出表达式的值,而不是表达式本身。例 1.4 输出两个自然数相除的商和余数。解:设被除数、除数、商和余数,分别为 A,B,C ,D ,均为变量,且都是整数类型。题中未给出具体的自然数 A、 B,可采用键盘输入方式。 给出提示,从键盘输入 a, b; 显示两数相除的数学形式; 求出 a 除以 b 的商 c; 求出 a 除以 b 的余数 d; 紧接等式后面输出显示商和余数。Pascal 程序 :Program
9、 Ex14;Var a,b,c,d : integer;BeginWrite(INPUT A,B:); 给出提示信息Readln(a, b); 输入 a,bWriteln; 输出一空行Write(a,/ ,b,=) ; 输出等式之后不换行c:=a div b; 整除运算,取商的整数部分d:=a mod b; 相除求余运算,取商的余数部分Writeln(C,d); 输出后自动换行 -_Readln 等待输入回车键 End.执行本程序中第一个 Write 语句,输出其引号以内的一串提示信息,是给紧接着的输入语句提供明确的提示(要求),有“ 一目了然,人机对话” 之效果。Readln 是一个特殊的输
10、入语句,要求输入一个回车( 换行) 才能往下执行。Readln 是输入语句,它的一般格式为: Read (变量 1,变量 2); Readln (变量 1,变量 2); Readln前两种格式均要从键盘给变量输入数据,输入时,所键入的数据之间以空格为分隔,以回车为输入结束。若多输入了数据(即数据个数超过变量个数 ),Read 语句读完数据之后,能让后续的读语句接着读取多下来的数据;而 Readln 语句对本行多输入的数据不能让后续语句接着读取多下来的数据。为了防止多输入的数据影响下一个输入语句读取数据,建议尽量使用 Readln 语句输入数据。第三种格式不需输入数据,只需按入一个回车键。例 1
11、.5自然数的立方可以表示为两个整数的平方之差,比如 43=1026 2,请输出自然数1996 的这种表示形式。(这里的 43 用自乘三次的形式 4*4*4 表示;10 2 也用自乘二次的形式10*10 表示)解:此题没有现成的计算公式能直接利用,但可以自行推出处理方法或构建适当的运算公式,按着构想的处理方案编排出各步骤。设这个自然数为 N,两个平方数分别为 X,Y, 将问题表示为求 N 3=X2Y2 先找出 X 的值,仔细观察题中的示例,用数学方法归纳可得出 X=N*(N+1)/2;(构成本题可用的计算公式) 再仔细观察,发现 Y 值比 X 小一个 N 值,即 Y=XN; 输出等式 N 3=X
12、2Y2 或 N*N*N=X*XY*YPascal 程序 :Program Ex15;Const N=1996; 常量说明 Var X,Y: Longint; 变量说明,此题计算中的数值较大,用长整型 BeginX:=N*(N+1) div 2; div 是整除运算 Y:=X-N;Writeln(N,*,N,*, N,=, X,*, X,Y,*,Y); 输出结果 ReadlnEnd.本程序中 N 是常量,X,Y 是变量,为长整数类型(Longint); 程序中的 div 是整除运算,其结果只取商的整数部分;例 1.6 求一元二次方程 x2+3x+2=0 的两个实数根。解:方程的系数是常量,分别用
13、 a,b,c 表示,可运用数学上现成的求根公式求方程的根,采取如下方法: 先求出 d=b2-4ac;(求根公式中需用开方运算的那部分) 再用求根公式算出 x1,x2 的值。(x1,x2 = ? ) 输出 x1,x2.-_Pascal 程序:program Ex16;Const a=1; 常量说明 b=3;c=2; a,b,c 表示方程系数Var d : integer; d 为整型变量X1,X2: Real; X1 ,X2 为实型变量Begind:=b*b-4*a*c;x1:=(-b+sqrt(d)/(2*a); 求方程的根x2:=(-b-sqrt(d)/(2*a);Writeln(X1=,X
14、1, :6,X2=,X2) ;输出结果Readln 等待输入一个回车键End.本程序中的 a,b,c 均为常量;变量 d 是整数类型,而变量 x1,x2 则是实数类型,因为运算式中的 Sqrt(d)开平方运算和 (/)除法运算使结果为实数。Sqrt( ) 是开平方函数,是Pascal 系统的一个标准函数。习题 1.1 模仿例题编程1. 加法计算器:编程由键盘输入两个整数 a 和 b,计算出它们的和并输出到屏幕上。2. 某梯形的上底、下底和高分别为 8,12,9,求该梯形的面积。3. 求边长为 5.6 的正立方体表面积。4. 已知图园柱体的高为 12,底面园的半径为 7,求园柱体表面积。5. 计
15、算某次考试语文、数学、英语和计算机等四科的总成绩与平均成绩。(请用输入语句从键盘输入各科成绩分)第二节 顺序结构程序与基本数据类型前面的简单程序已体现出处理问题步骤、思路的顺序关系,这就是顺序结构程序。例 1.7交换两个变量的值:由键盘输入两个正整数 A 和 B,编程交换这两个变量的值。解:交换两个变量的值,可以想象成交换两盒录音带(称为 A 和 B)的内容,可以按以下步骤处理:步骤:拿一盒空白录音带 C 为过渡,先将 A 翻录至 C;步骤:再将 B 翻录至 A;步骤:最后将 C 翻录至 B。这样操作,可达到题目要求。Pascal 程序:Program Exam17;Var a,b,c : i
16、nteger;BeginWrite(A,B=);-_Readln(a,b);C:= A; 等价于步骤 1A := B; 等价于步骤 2B := C; 等价于步骤 3Writeln(A,B);End.例 1.8 分钱游戏。甲、乙、丙三人共有 24 元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?解:设甲、乙、丙三人的钱数分别为 A,B,C 。用倒推( 逆序)算法, 从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:(在每个步骤中,各人钱数分别
17、存在A、B 、 C 中)步骤: A=8 B=8 C=8 这是最后结果的钱数,三人都一样多 步骤: A=A/2 (=4) B=B/2 (=4) C=A+B+C(=16) A,B 未得到丙分给的钱时,只有结果数的一半;C 应包含给 A,B 及本身数三者之和 步骤: A=A/2 (=2) C=C/2 (=8) B=A+B+C(=14) A,C 未得到乙分给的钱时,只有巳有数的一半;B 应包含给 A,C 及本身数三者之和 步骤: B=B/2 (=7) C=C/2 (=4) A=A+B+C(=13) C 未得到甲分给的钱时,只有巳有数的一半;A 应包含给 B,C 及本身数三者之和 步骤: 输出 A(=1
18、3)B (=7)C(=4)此时的 A,B ,C 就是三人原先的钱数 Pascal 程序 :Program Exam18;Var a,b,c: integer ;Begina:=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) ; 输出ReadlnEnd.细心观察,会发现本程序语句的顺序很关键。此例用反推
19、顺序(逆序) ,按步骤正确推算出各变量的值。当然,有的问题可按正序步骤编程,这类程序都称为顺序程序。本程序 Writeln 语句的输出项含有( : 4 ),这里的冒号用来指定该项显示所占宽度,此处是输出 4 个空格即(空格项占 4 格) 。例 1.9 有鸡兔同笼,头 30,脚 90,究竟笼中的鸡和兔各有多少只 ?解:设鸡为 J 只,兔为 T 只,头为 H,脚为 F,则:J+T=30 2*J+4*T=90 解此题暂不必采用数学上直接解方程的办法,可采用“假设条件与逻辑推理”的办法:-_假设笼中 30 个头全都是兔,那么都按每头只脚计算,总脚数为(4*H),与实际脚数 ( F )之差为(4*H F
20、),如果这个差 =0,则笼中全是兔(即鸡为 0 只);如果这个差值 0,说明多计算了脚数,凡是鸡都多给算了两只脚,用它除以 2 就能得到鸡的只数,处理步骤为: J=(4*H F)/2 先用脚数差值除以 2 算出鸡的只数 T=HJ 再用总头数减鸡数算出免的只数按此方法,这两步运算必须注意先后顺序才会符合运算逻辑。Pascal 程序 :Program Exam16;Const H=30; 常量说明 F=90;Var J,T: byte; 为字节类型的整数 BeginJ:=(4*H-F) div 2; 整除运算 T:=H-JWriteln (J=, J, : 6,T= ,T ) ;ReadlnEnd
21、.本程序中 H,F 为常量,变量 J,T 为 byte 类型,属于整数类型。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 还定义了五个标准实数类型,列表所示如下:类
22、型 取值范围 占字节数 有效数字Real 2.910-391.71038 6 78 位Single 1.510-453.41038 4 1112 位Double 5.010-3241.710308 8 1516 位Extended 1.910-49511.1104932 10 1920 位Comp -263+1238-1 8 1920 位在 Turbo Pascal 中实数的表示用科学记数法,可认为由三部分组成:# . # E +# 或 # . # E -# #表示有效数字; E 表示以 10 为底的幂; +#或-#是指数部分,+号可省略。例如: 1.7E+38 可写成 1.7E38 (等同于
23、 1. 71038 )。在实数类型定义下,即使是整数,在程序执行时系统也将自动转换成科学记数形式,试请运行下面程序并注意观察运行结果:Program Exam17;Var x: real; x 为实数类型 -_BeginX:=180; 把整数 180 赋给实数类型变量 XWriteln (x=, x) ; 输出的 x 自动表示成实数形式 ReadlnEnd.习题 1. 21.已知ABC 中的三边长分别为 25.76,74.03,59.31,求ABC 的面积。( 计算公式: S= 。 其中 P = )2.某车棚存有自行车和三轮车共 65 辆,它们的轮子数合计为 150 个。求该棚内存有的自行车和
24、三轮车各是多少辆?3.甲、乙、丙三人分别有磁带 36,48,64 盒。先由甲把自己的磁带平均分为三份,分给乙、丙各一份,自己留下一份;接着是乙,最后是丙,都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少? (输出所有的中间结果)4.五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为 32 块。问各位好友原先的糖块数分别是多少?第二章 分支程序在程序设计中,许多问题是在一定条件
25、下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理。程序执行中将出现选择( 分支) ,根据条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句,这样的程序称为分支程序。第一节 条件语句与复合语句例 2.1 某服装公司为了推销产品,采取这样的批发销售方案: 凡订购超过 100 套的,每套定价为 50 元,否则每套价格为 80 元。编程由键盘输入订购套数,输出应付款的金额数。解:设 X 为订购套数,Y 为付款金额,则 : 输入 X; 判断 X 值; 根据判断结果选择符合条件的那种方法计算 Y 值; 输出计算结果。Pascal 程序 :-_Program Exam21;
26、Var x, y: integer;BeginWrite(X=) ;Readln(x) ; 输入 Xif x 100 then y:=50*X else y:80*X; 条件判断与选择 Writeln(y=, y) ;ReadlnEnd.程序中的 if 语句常称为条件语句,它的一般格式为:(1) if 条件 then 语句;(2) if 条件 then 语句 1 else 语句 2;IF 语句的功能是按条件在两种可能中选择其中一种。习惯上把 if 后面的表达式称为条件,then 后面的语句称为真项,else 后面的语句称为假项。若条件成立( 为真)就执行真项,然后执行 if 语句的后继语句;若
27、条件不成立(为假) 就跳过真项而执行假项,然后执行后继语句。而第一种格式只有真项,没有假项,当条件不成立( 为假) 就什么也不需做,直接往下去执行后继语句。例 2.2 读入三个不同的数,编程按由小到大的顺序排列打印出来。解:设读入的三个数为 a,b,c,为了把较小的数排在前面,可作如下处理: 如果 ab 就交换 a、b 的值,将较大的值换至后面; 如果 ac 就交换 a、c 的值,将较大的值换至后面; 如果 bc 就交换 b、c 的值,将较大的值换至后面; 输出处理后的 a,b,c。Pascal 程序:Progranm Exam22;Var a,b,c,t: Real ;BeginWrite(
28、Input a, b,c=);Readln(a, b,c);if ab thenbegin 复合语句t:=a; a:=b; b:=t 交换 a,bend;if ac thenbegin 复合语句t:=a; a:=c ; c:=t 交换 a,cend;if bc thenbegin 复合语句t:=b; b:=c; c:=t 交换 b,cend;Writeln(a,b,c:,a:6, b:6, c:6);ReadlnEnd.-_if 语句规定它的真项或假项位置上只能是一个基本语句,如果需要写一组语句,就应当使用复合语句。本程序中有三处用到复合语句。每个复合语句的范围是从 Begin 开始到与它相对
29、应的 End 为止。复合语句的地位和一个基本语句相同;其一般格式为:Begin 语句系列 End;习题 2. 11.假设邮局规定寄邮件时若每件重量在 1 公斤以内(含 1 公斤) ,按每公斤 1.5 元计算邮费,如果超过 1 公斤时,其超出部分每公斤加收 0.8 元。请编程序计算邮件收费。2.输入三个正整数,若能用这三个数作为边长组成三角形,就计算并输出该三角形的面积,否则输出 Cant。(组成三角形的条件为:任意两边之和大于第三边)3.输入一个三位数的整数,将数字位置重新排列,组成一个尽可大的三位数。例如:输入 213,重新排列可得到尽可能大的三位数是 321。第二节 情况语句与算术标准函数
30、如果有多种(两种或两种以上)选择,常用情况语句编程。将前面例 2.1改成用如下方法来处理。根据题意,付款计算可分为两种情况: Y=50*X (X100) Y=80*X (X=100)显然,情况与的选择取决于 X 值。假设用 N 表示“ 情况值”,暂且先让 N2;如果 X100 则 N=1;(此题中 N 的值只是 1 或 2,且取决于 X 值)Pascal 程序 :Program Exam21_1;Var X, Y,N: integer;BeginWrite(X=) ;readln(x) ; n:=2; 先让 n=2 if X100 then n:=1; 如果 X100 则 n=1 Case n of 关于情况处理 1: Y:=50*X;2: Y:=80*X;end;Writeln(Y=, Y) ;ReadlnEnd.程序中的 Caseend 语句为情况语句,是多路分支控制,一般格式为:Case 表达式 of情况常量表 1: 语句 1;情况常量表 2: 语句 2;: :