资源描述
目录:第一章简单程序第一节Pascal程序结构和基本语句第二节顺序结构程序与基本数据类型第二章分支程序第一节条件语句与复合语句第二节情况语句与算术标准函数第三章循环程序第一节for循环第二节repeat循环第三节While循环第四章函数与过程第一节函数第二节自定义过程第五章Pascal的自定义数据类型第一节数组与子界类型第二节二维数组与枚举类型第三节集合类型第四节记录类型和文件类型第五节指针类型与动态数据结构第六章程序设计与基本算法第一节递推与递归算法第二节回溯算法第七章数据结构及其应用第一节线性表第二节队列第三节栈第四节数组第八章搜索第一节深度优先搜索第二节广度优先搜索第九章其他常用知识和算法第一节图论及其基本算法第二节动态规划第一章简单程序无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在Pascal语言中,执行每条语句都是由计算机完成相应的操作。编写Pascal程序,是利用Pascal语句的功能来实现和达到预定的处理要求。“千里之行,始于足下”,我们从简单程序学起,逐步了解和掌握怎样编写程序。第一节Pascal程序结构和基本语句在未系统学习Pascal语言之前,暂且绕过那些繁琐的语法规则细节,通过下面的简单例题,可以速成掌握Pascal程序的基本组成和基本语句的用法,让初学者直接模仿学习编简单程序。例1.1编程在屏幕上显示“HelloWorld!”。Pascal程序:Programex11;BeginWriteln(HelloWorld!);ReadLn;End.这个简单样例程序,希望大家的程序设计学习能有一个良好的开端。程序中的Writeln是一个输出语句,它能命令计算机在屏幕上输出相应的内容,而紧跟Writeln语句后是一对圆括号,其中用单引号引起的部分将被原原本本地显示出来。例1.2已知一辆自行车的售价是300元,请编程计算a辆自行车的总价是多少?解:若总售价用m来表示,则这个问题可分为以下几步处理:从键盘输入自行车的数目a;用公式m=300*a计算总售价;输出计算结果。Pascal程序:ProgramEx12;程序首部Vara,m:integer;说明部分Begin语句部分Write(a=);ReadLn(a);输入自行车数目M:=300*a;计算总售价Writeln(M=,m);输出总售价ReadLn;等待输入回车键End.此题程序结构完整,从中可看出一个Pascal程序由三部分组成:(1)程序首部由保留字Program开头,后面跟一个程序名(如:Exl1);其格式为:Program程序名;程序名由用户自己取,它的第一个字符必须是英文字母,其后的字符只能是字母或数字和下划线组成,程序名中不能出现运算符、标点符和空格。(2)说明部分程序中所用的常量、变量,或类型、及过程与自定义函数,需在使用之前预先说明,定义数据的属性(类型)。例1.2程序中VarS,R,C:Real;是变量说明,此处说明S,R,C三个变量均为实数类型变量。只有被说明为某一类型的变量,在程序中才能将与该变量同类型的数值赋给该变量。变量说明的格式为:Var变量表:类型;(3)语句部分指由保留字Begin(开始)至End.(结尾)之间的语句系列,是解决问题的具体处理步骤,也是程序的执行部分。Pascal程序不管是哪部分,每句末尾都必须有分号(;),但允许最接近End的那个语句末尾的分号省略;程序结束的End末尾必须有圆点(.),是整个程序的结束标志。程序中花括号“”之间的部分为注释部分。Pascal程序结构可归纳用如下的示意图来表示:Program程序名;程序首部标号说明;(Label)常量说明;(Const)说明部分类型说明;(Type)变量说明;(Var)过程或函数说明;Begin程序体(主程序)语句系列;语句部分End.图1.1Pascal程序的结构把处理问题的步骤编成能从上到下顺序执行的程序,是简单程序的基本特征。再来分析下面两道例题的Pascal程序结构和继续学习基本语句。例1.3编程计算半径为R的圆的面积和周长。解:这是一个简单问题,按数学方法可分以下几步进行处理:从键盘输入半径的值R;要求告诉圆的半径R用公式S=R2计算圆面积;用公式C=2R计算圆周长;输出计算结果。Pascal程序:ProgramEx13;程序首部VarR,S,C:Real;说明部分Begin语句部分Write(R=?);Readln(R);输入半径S:=Pi*R*R;圆面积公式S=R2C:=2*Pi*R;圆周长公式C=2RWriteln(S=,S);输出结果Writeln(C=,C);Readln等待输入回车键End.程序中Pi是Pascal提供的标准函数,它返回圆周率的近似值:3.1415926。(:=)是赋值符号,赋值语句的格式为:变量:=表达式;赋值语句的作用是将:=右边表达式的值记录到左边的变量中。Writeln是输出语句,输出语句有三种格式:Write(输出项1,输出项2);执行输出后光标不换行Writeln(输出项1,输出项2);执行输出后光标换到下一行Writeln仅输出空白且光标换到下一行Writeln语句后面的圆括号以内部分均为输出项,可以是多项,各项间用逗号分隔;对单引号里的内容按照引号内的原样(字符)输出显示。如果输出项是表达式,则只输出表达式的值,而不是表达式本身。例1.4输出两个自然数相除的商和余数。解:设被除数、除数、商和余数,分别为A,B,C,D,均为变量,且都是整数类型。题中未给出具体的自然数A、B,可采用键盘输入方式。给出提示,从键盘输入a,b;显示两数相除的数学形式;求出a除以b的商c;求出a除以b的余数d;紧接等式后面输出显示商和余数。Pascal程序:ProgramEx14;Vara,b,c,d:integer;BeginWrite(INPUTA,B:);给出提示信息Readln(a,b);输入a,bWriteln;输出一空行Write(a,/,b,=);输出等式之后不换行c:=adivb;整除运算,取商的整数部分d:=amodb;相除求余运算,取商的余数部分Writeln(C,d);输出后自动换行Readln等待输入回车键End.执行本程序中第一个Write语句,输出其引号以内的一串提示信息,是给紧接着的输入语句提供明确的提示(要求),有“一目了然,人机对话”之效果。Readln是一个特殊的输入语句,要求输入一个回车(换行)才能往下执行。Readln是输入语句,它的一般格式为:Read(变量1,变量2);Readln(变量1,变量2);Readln前两种格式均要从键盘给变量输入数据,输入时,所键入的数据之间以空格为分隔,以回车为输入结束。若多输入了数据(即数据个数超过变量个数),Read语句读完数据之后,能让后续的读语句接着读取多下来的数据;而Readln语句对本行多输入的数据不能让后续语句接着读取多下来的数据。为了防止多输入的数据影响下一个输入语句读取数据,建议尽量使用Readln语句输入数据。第三种格式不需输入数据,只需按入一个回车键。例1.5自然数的立方可以表示为两个整数的平方之差,比如43=10262,请输出自然数1996的这种表示形式。(这里的43用自乘三次的形式4*4*4表示;102也用自乘二次的形式10*10表示)解:此题没有现成的计算公式能直接利用,但可以自行推出处理方法或构建适当的运算公式,按着构想的处理方案编排出各步骤。设这个自然数为N,两个平方数分别为X,Y,将问题表示为求N3=X2Y2先找出X的值,仔细观察题中的示例,用数学方法归纳可得出X=N*(N+1)/2;(构成本题可用的计算公式)再仔细观察,发现Y值比X小一个N值,即Y=XN;输出等式N3=X2Y2或N*N*N=X*XY*YPascal程序:ProgramEx15;ConstN=1996;常量说明VarX,Y:Longint;变量说明,此题计算中的数值较大,用长整型BeginX:=N*(N+1)div2;div是整除运算Y:=X-N;Writeln(N,*,N,*,N,=,X,*,X,Y,*,Y);输出结果ReadlnEnd.本程序中N是常量,X,Y是变量,为长整数类型(Longint);程序中的div是整除运算,其结果只取商的整数部分;例1.6求一元二次方程x2+3x+2=0的两个实数根。解:方程的系数是常量,分别用a,b,c表示,可运用数学上现成的求根公式求方程的根,采取如下方法:先求出d=b2-4ac;(求根公式中需用开方运算的那部分)再用求根公式算出x1,x2的值。(x1,x2=?)输出x1,x2.Pascal程序:programEx16;Consta=1;常量说明b=3;c=2;a,b,c表示方程系数Vard: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=,X1,:6,X2=,X2);输出结果Readln等待输入一个回车键End.本程序中的a,b,c均为常量;变量d是整数类型,而变量x1,x2则是实数类型,因为运算式中的Sqrt(d)开平方运算和(/)除法运算使结果为实数。Sqrt()是开平方函数,是Pascal系统的一个标准函数。习题1.1模仿例题编程1.加法计算器:编程由键盘输入两个整数a和b,计算出它们的和并输出到屏幕上。2.某梯形的上底、下底和高分别为8,12,9,求该梯形的面积。(梯形面积公式为S=3.求右图所示边长为5.6的正立方体表面积。4.已知图园柱体的高为12,底面园的半径为7,求园柱体表面积。5.计算某次考试语文、数学、英语和计算机等四科的总成绩与平均成绩。(请用输入语句从键盘输入各科成绩分)第二节顺序结构程序与基本数据类型前面的简单程序已体现出处理问题步骤、思路的顺序关系,这就是顺序结构程序。例1.7交换两个变量的值:由键盘输入两个正整数A和B,编程交换这两个变量的值。解:交换两个变量的值,可以想象成交换两盒录音带(称为A和B)的内容,可以按以下步骤处理:步骤:拿一盒空白录音带C为过渡,先将A翻录至C;步骤:再将B翻录至A;步骤:最后将C翻录至B。这样操作,可达到题目要求。Pascal程序:ProgramExam17;Vara,b,c:integer;BeginWrite(A,B=);Readln(a,b);C:=A;等价于步骤1A:=B;等价于步骤2B:=C;等价于步骤3Writeln(A,B);End.例1.8分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。求原先各人的钱数分别是多少?解:设甲、乙、丙三人的钱数分别为A,B,C。用倒推(逆序)算法,从最后结果入手,按反相顺序,分步骤推算出每次各人当时的钱数:(在每个步骤中,各人钱数分别存在A、B、C中)步骤:A=8B=8C=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(=13)B(=7)C(=4)此时的A,B,C就是三人原先的钱数Pascal程序:ProgramExam18;Vara,b,c:integer;Begina:=8;b:=8;c:=8;对应于步骤a:=adiv2;b:=bdiv2;c:=a+b+c;对应于步骤a:=adiv2;c:=cdiv2;b:=a+b+c;对应于步骤b:=bdiv2;c:=cdiv2;a:=a+b+c;对应于步骤Writeln(a=,a,:4,b=,b,:4,c=,c);输出ReadlnEnd.细心观察,会发现本程序语句的顺序很关键。此例用反推顺序(逆序),按步骤正确推算出各变量的值。当然,有的问题可按正序步骤编程,这类程序都称为顺序程序。本程序Writeln语句的输出项含有(:4),这里的冒号用来指定该项显示所占宽度,此处是输出4个空格即(空格项占4格)。例1.9有鸡兔同笼,头30,脚90,究竟笼中的鸡和兔各有多少只?解:设鸡为J只,兔为T只,头为H,脚为F,则:J+T=302*J+4*T=90解此题暂不必采用数学上直接解方程的办法,可采用“假设条件与逻辑推理”的办法:假设笼中30个头全都是兔,那么都按每头只脚计算,总脚数为(4*H),与实际脚数(F)之差为(4*HF),如果这个差=0,则笼中全是兔(即鸡为0只);如果这个差值0,说明多计算了脚数,凡是鸡都多给算了两只脚,用它除以2就能得到鸡的只数,处理步骤为:J=(4*HF)/2先用脚数差值除以2算出鸡的只数T=HJ再用总头数减鸡数算出免的只数按此方法,这两步运算必须注意先后顺序才会符合运算逻辑。Pascal程序:ProgramExam16;ConstH=30;常量说明F=90;VarJ,T:byte;为字节类型的整数BeginJ:=(4*H-F)div2;整除运算T:=H-JWriteln(J=,J,:6,T=,T);ReadlnEnd.本程序中H,F为常量,变量J,T为byte类型,属于整数类型。Pascal定义了五个标准整数类型,如下表所示:类型取值范围占字节数格式Shortint(短整型)-128.1271带符号8位Integer(整型)-32768.327672带符号16位Longint(长整型)-2147483648.21474836474带符号32位Byte(字节型)0.2551无符号8位Word(字型)0.655352无符号16位在前面程序中常用的数据类型除整数类型,还有实数类型。Pascal还定义了五个标准实数类型,列表所示如下:类型取值范围占字节数有效数字Real2.910-391.71038678位Single1.510-453.4103841112位Double5.010-3241.71030881516位Extended1.910-49511.1104932101920位Comp-263+1238-181920位在TurboPascal中实数的表示用科学记数法,可认为由三部分组成:#.#E+#或#.#E-#表示有效数字;E表示以10为底的幂;+#或-#是指数部分,+号可省略。例如:1.7E+38可写成1.7E38(等同于1.71038)。在实数类型定义下,即使是整数,在程序执行时系统也将自动转换成科学记数形式,试请运行下面程序并注意观察运行结果:ProgramExam17;Varx: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个。求该棚内存有的自行车和三轮车各是多少辆?3.甲、乙、丙三人分别有磁带36,48,64盒。先由甲把自己的磁带平均分为三份,分给乙、丙各一份,自己留下一份;接着是乙,最后是丙,都按甲的方法处理。编程输出甲、乙、丙在上述过程中各人的磁带数分别是多少?(输出所有的中间结果)4.五位好朋友相聚。第一位朋友带来了很多糖块赠送给各位朋友,使每人的糖块在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?第二章分支程序在程序设计中,许多问题是在一定条件下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理。程序执行中将出现选择(分支),根据条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句,这样的程序称为分支程序。第一节条件语句与复合语句例2.1某服装公司为了推销产品,采取这样的批发销售方案:凡订购超过100套的,每套定价为50元,否则每套价格为80元。编程由键盘输入订购套数,输出应付款的金额数。解:设X为订购套数,Y为付款金额,则:输入X;判断X值;根据判断结果选择符合条件的那种方法计算Y值;输出计算结果。Pascal程序:ProgramExam21;Varx,y:integer;BeginWrite(X=);Readln(x);输入Xifx100theny:=50*Xelsey:80*X;条件判断与选择Writeln(y=,y);ReadlnEnd.程序中的if语句常称为条件语句,它的一般格式为:(1)if条件then语句;(2)if条件then语句1else语句2;IF语句的功能是按条件在两种可能中选择其中一种。习惯上把if后面的表达式称为条件,then后面的语句称为真项,else后面的语句称为假项。若条件成立(为真)就执行真项,然后执行if语句的后继语句;若条件不成立(为假)就跳过真项而执行假项,然后执行后继语句。而第一种格式只有真项,没有假项,当条件不成立(为假)就什么也不需做,直接往下去执行后继语句。例2.2读入三个不同的数,编程按由小到大的顺序排列打印出来。解:设读入的三个数为a,b,c,为了把较小的数排在前面,可作如下处理:如果ab就交换a、b的值,将较大的值换至后面;如果ac就交换a、c的值,将较大的值换至后面;如果bc就交换b、c的值,将较大的值换至后面;输出处理后的a,b,c。Pascal程序:ProgranmExam22;Vara,b,c,t:Real;BeginWrite(Inputa,b,c=);Readln(a,b,c);ifabthenbegin复合语句t:=a;a:=b;b:=t交换a,bend;ifacthenbegin复合语句t:=a;a:=c;c:=t交换a,cend;ifbcthenbegin复合语句t:=b;b:=c;c:=t交换b,cend;Writeln(a,b,c:,a:6,b:6,c:6);ReadlnEnd.if语句规定它的真项或假项位置上只能是一个基本语句,如果需要写一组语句,就应当使用复合语句。本程序中有三处用到复合语句。每个复合语句的范围是从Begin开始到与它相对应的End为止。复合语句的地位和一个基本语句相同;其一般格式为:Begin语句系列End;习题2.11.假设邮局规定寄邮件时若每件重量在1公斤以内(含1公斤),按每公斤1.5元计算邮费,如果超过1公斤时,其超出部分每公斤加收0.8元。请编程序计算邮件收费。2.输入三个正整数,若能用这三个数作为边长组成三角形,就计算并输出该三角形的面积,否则输出Cant。(组成三角形的条件为:任意两边之和大于第三边)3.输入一个三位数的整数,将数字位置重新排列,组成一个尽可大的三位数。例如:输入213,重新排列可得到尽可能大的三位数是321。第二节情况语句与算术标准函数 如果有多种(两种或两种以上)选择,常用情况语句编程。将前面例2.1改成用如下方法来处理。根据题意,付款计算可分为两种情况:Y=50*X(X100)Y=80*X(X=100)显然,情况与的选择取决于X值。假设用N表示“情况值”,暂且先让N2;如果X100则N=1;(此题中N的值只是1或2,且取决于X值)Pascal程序:ProgramExam21_1;VarX,Y,N:integer;BeginWrite(X=);readln(x);n:=2;先让n=2ifX100thenn:=1;如果X100则n=1Casenof关于情况处理1:Y:=50*X;2:Y:=80*X;end;Writeln(Y=,Y);ReadlnEnd.程序中的Caseend语句为情况语句,是多路分支控制,一般格式为:Case表达式of情况常量表1:语句1;情况常量表2:语句2;:情况常量表n:语句nend;执行情况语句时,先计算Case后面表达式的值,然后根据该值在情况常量表中的“对应安排”,选择其对应的语句执行,执行完所选择语句后就结束Case语句;如果常量表中没有一个与表达式值对应的语句,则什么也不做就结束本Case语句。Case语句的另一种应用格式为:Case表达式of情况常量表1:语句1;情况常量表2:语句2;:情况常量表n:语句n;else语句n+1end;这种格式的前面部分是相同的,所不同的是:如果常量表中没有一个与表达式值对应的语句,则执行与else对应的语句,然后结束Case语句。例2.2对某产品征收税金,在产值1万元以上征收税5%;在1万元以下但在5000元以上的征收税3%;在5000元以下但在1000元以上征收税2%;1000元以下的免收税。编程计算该产品的收税金额。解:设x为产值,tax为税金,用P表示情况常量各值,以题意中每1000元为情况分界:P=0:tax=0(x1000)P=1,2,3,4:tax=x*0.02(1000=x5000)P=5,6,7,8,9:tax=x*0.03(5000X10000)这里的P是“情况”值,用产值x除以1000的整数值作为P,如果P10也归入P=10的情况。Pascal语言用P=trunc(x/1000)取整计算,Pascal程序:ProgramExam22;Varx,p:integer;Tax:real;BeginWrite(Number=);readln(x);P:=trunc(x/1000);ifP9thenP:=10;CasePof0:tax:=0;1,2,3,4:tax:=x*0.2;5,6,7,8,9:tax:=x*0.3;10:tax:=x*0.5end;Writeln(tt=,tt:5:2);ReadlnEnd.情况表达式的计算必须考虑到“全部”情况,不要有遗漏。如果情况常量表的“值”在某范围内是连续的,可将常量表写成:n1.n2:语句;因此,上面程序中的情况常量表可以写成如下程序中表示形式:ProgramExam22_1;Varx,p:integer;tax:real;BeginWrite(Number=);readln(x);P:=trunc(x/1000);ifP9thenP:=10;CasePof0:tax:=0;1.4:tax:=x*0.2;从1至4作为同一情况处理5.9:tax:=x*0.3;从5至9作为同一情况处理10:tax:=x*0.5end;Writeln(tt=,tt:5:2);ReadlnEnd.程序中的trunc(x)为取整函数,是Pascal的算术标准函数之一。Pascal常用的算术标准函数有19个:(1)abs(x)求x的绝对值(|x|);(2)exp(x)求ex的值;(e为无理数2.71828)(3)frac(x)求x的小数部分;(4)int(x)求x的整数部分(不舍入,函数值为实型);(5)ln(x)求以e为底的x的对数(logex);(6)odd(x)判断x的奇偶数(当x为奇数时odd(x)值为true,否则为false);(7)ord(x)求x的序号,结果为整型(x为有序类型量);(8)pi值(3.1415926535897932);(9)pred(x)求x(有序类型)的前趋值;(10)succ(x)求x(有序类型)的后继值;(11)random随机函数,产生01的随机值;(12)random(n)产生0n的随机数(n为word类型,先执行randomize,才能得到随机整数);(13)round(x)求x的四舍五入整数;(14)trunc(x)求x的整数部分(截掉小数部分,结果为整型);(15)sqr(x)求x的平方值(x2);(16)sqrt(x)求x的开平方根值();(17)sin(x)求x的正弦函数(x为弧度);(18)cox(x)求x的余弦函数(x为弧度);(19)arctan(x)正切的反三角函数(x为数值);习题2.21.运输公司计算运费时,距离(S)越长,每公里运费越低,标准如下:如果S250公里;运费为标准运价的100%如果250公里S500公里,运费为标准运价的98%;如果500公里S1000公里,运费为标准运价的95%;如果1000公里S2000公里,运费为标准运价的92%;如果2000公里S3000公里,运费为标准运价的90%;如果S3000公里,运费为标准运价的85%;。请编计算运费的程序。2.输入考试成绩,如果获85分以上为A等,获60分84分为B等,60分以下为C等,编程输出考试等级。3.某车间按工人加工零件的数量发放奖金,奖金分为五个等级:每月加工零件数N100者奖金为10元;100=N110者奖金为30元;110=N120者奖金为50元;120=N130者为80元。请编程,由键盘输入加工零件数量,显示应发奖金数。第三章 循环程序在编程中经常遇到需要多次规律相同的重复处理,这就是循环问题。TurboPascal采用不同的循环方式来实现,常用的环循有三种:for、repeat、while. 第一节for循环for循环是一种自动计数型循环。例3.1试打印出120的自然数。解:用a代表120各数,同时也用a兼作计数,以控制循环次数;让a从1开始;输出a;a自动计数(加1),如果未超越所规定的循环范围则重复步骤,否则结束循环。Pascal程序:ProgramExam12;Vara:byte;Beginfora:=1to20doWriteln(a);ReadlnEnd.程序中fora:=1to20doWriteln(a);是for循环语句。for循环语句有两种格式:(1)for循环变量:=初值To终值do语句;(2)for循环变量:=初值downto终值do语句;第(1)种格式的初值小于等于终值,循环变量值按自动加1递增变化;第(2)种格式的初值大于或等于终值,循环变量值按自动减1递减变化。for循环是(以递增1或以递减1)计数型循环。比如:若将例3.1程序改为倒计数(递减)循环,则输出201的自然数数:ProgramExam31;Vara:byte;Beginfora:=20downto1doWriteln(a);ReadlnEnd.例3.2打印出30至60的偶数。解:方法一:设a表示30至60的所有的数,可用for循环列出;用式子amod2=0筛选出其中的偶数并输出。Pascal程序:Programex32;Vara:integer;BeginFora:=30to60doIf(amod2=0)thenwriteln(a);Readln;End.在这个程序中,for循环后的循环语句是一个条件分支语句。方法二:我们知道,在式子a=2*n中,若n取自然数1、2、3、,时,则a依次得到偶数2、4、6、。因此要想得到30至60的偶数,就可以让上面式子中的n取15至30的自然数就可以了。所以本题还可以按以下步骤处理:设n表示15至30的所有自然数,可用for循环列出;用式子a:=2*n求出其中的偶数;将结果输出至屏幕。Pascal程序:Programex32;BeginForn:=15to30doBegina:=2*n;Writeln(a);End;Readln;End.例3.3自然数求和:编一个程序,求从1至100的自然数的和。解:令S0;令a表示1至100的自然数,用循环列出;将这些自然数用公式S:=S+a逐一累加到S中去;循环结束后,S即为1至100的自然数的和,输出即可。Pascal程序:Programex33;vars,a:integer;BeginS:=0;Fora:=1to100doS:=S+a;Writeln(S=,S);Readln;End.例3.4一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。解:用for循环列举出所有的两位数,x为循环变量;用公式a:=xdiv10分离出x的十位数字;用公式b:=xmod10分离出x的个位数字;用公式y:=b*10+a合成新数y;用式子y-x=36筛选出符合条件的数x并输出。Pascal程序:Programex34;BeginForx:=10to99doBegina:=xdiv10;b:=xmod10;y:=b*10+a;ify-x=36thenwriteln(x);End;Readln;End.例3.5把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数。解:设符合条件的四位数为N,它应当是一个完全平方数,用(a*a)表示。为了确保N=(a*a)在四位数(10009999)范围内,可确定a在3299循环;计算N=a*a;将四位数N拆分为两个数n1和n2;若满足条件(n1+n2)*(n1+n2)N就输出N。Pascal程序:ProgramExam35;VarN,a,x,n1,n2:Integer;Beginfora:=32to99dobeginN:=a*a;n1:=Ndiv100;拆取四位数的前两位数n2:=N-n1*100;拆取四位数的后两位数X:=n1+n2;ifx*x=Nthenwriteln(N);end;ReadlnEnd.例3.6用“*”号打印出如下的长方形图案。*解:上面给出的图例共有4行,我们可以用一个循环控制行的变化;在每行中又有9列,我们可以在前面控制行的循环中再套一个循环来控制列的变化。Pascal程序:Programex36;BeginFora:=1to4do外循环控制行的变化BeginForb:=1to9do内循环控制列的变化write(*);Writeln;输出一行的“*”后换行End;Readln;End.程序中的循环对于a的每个值都包含着一个b=(19)次的内循环。外循环fora将内循环forb包含在里面,称为for循环的嵌套。嵌套形式如:fora:=n1ton2doforb:=m1tom2do循环体语句;例3.7打印出九九乘法表:解:设a为被乘数,范围为19;b为乘数,范围为1a;乘式为a*b=(a,b的乘积),则a=1:b=1a1*1=1a=2:b=1a2*1=22*2=4a=3:b=1a3*1=33*2=63*3=9a=4:b=1a4*1=44*2=84*3=134*4=16:a=9b=1a9*1=99*2=189*9=81从上面分解的横行中看到共有9行,这里的“行”数变化与a的变化从19相同,可用a控制“行”的循环;每“行”里面相乘的次数与b的范围相关,由b控制每“行”里面的“内部”循环;内循环被包含在最里层,执行完每“行”的内部循环,就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的(b=1a)内循环。即每到一“行”都要执行该“行”的内循环。这里所指的“行”可以理解成抽象的行,不一定是实际上具体对应的行,可以是一个处理“块”。Pascal程序:ProgramExam37;Vara,b:byte;Beginfora:=1to9do外循环beginforb:=1toado内循环write(a,*,b,=,a*b,:3);writelnend;ReadlnEnd.根据这种格式还可以实现多层循环嵌套,例如:fora:=n1ton2doforb:=m1tom2doforc:=k1tok2do循环体语句;例3.8从七张扑克牌中任取三张,有几种组合方法?请编程输出所有组合形式。解:设每次取出三张分别为a,b,c。用三重循环分别从17的范围里取值;为了排除取到重号,用(a-b)*(b-c)*(a-c)0进行判断。Pascal程序:programExam38;constn=7;vara,b,c,t:integer;Begint:=0;fora:=1tondoforb:=1tondoforc:=1tondoif(a-b)*(b-c)*(a-c)0thenBegininc(t);writeln(a:3,b:3,c:3)End;writeln(total:,t:5);readlnEnd.例3.9数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(或质数)。现在由键盘输入一个自然数N,编程判断N是否是素数,是则输出“Yes”,否则输出“No”。解:根据定义,对于给定的自然数N,只需判断除1和它本身外,还有没有第三个自然数即可。令K从1循环至N;根据NmodK是否为0可统计K的约数的个数;若N的约数的个数超过2个,则判定N不是素数。Pascal程序:ProgramExam39;Varn,m,k,t:integer;Beginwrite(N=);ReadLn(N);t:=0;fork:=1toNdo外循环ifNmodk=0thent:=t+1;如果N是奇数ift2thenwriteln(No)elsewriteln(Yes);Readln;End.程序中的变量yse为布尔(或逻辑)类型(Boolean)。布尔值只有两个:True(真)False(假)布尔值与条件判断结果为真(条件成立)或为假(条件不成立)的作用相同,常用于条件语句和循环语句中。上面程序中用ifyesand(tmod7=0)thenwriteln;实现每行打印七个素数换行,程序中布尔变量yes为真,在逻辑上表示是素数;关系式(tmod7=0)的值为真时,表示该行输出素数巳是个;用and将这两个“条件”连起来是作一种布尔(逻辑)运算。Pascal共有四种逻辑运算符:and(与)两条件都为True时,其结果值为True;否则为False;or(或)两条件中只要有一个为True;其结果值为True;否则为False;xor(异或)两条件的逻辑值不
展开阅读全文