首页 第三章到第九章

第三章到第九章

举报
开通vip

第三章到第九章第一章 简单程序 第三章 Turbo Pascal语言简介 第一节 Turbo Pascal 的安装与运行 PASCAL语言是一种算法语言,它是瑞士苏黎世联邦工业大学的N.沃思(Niklaus Wirth)教授于1968年设计完成的,1971年正式发表。它的命名是为了纪念法国数学家Pascal。 PASCAL语言是一种结构化的程序设计语言,可以用来编写应用程序。它又是一种系统程序设计语言,可以用来编写顺序型的系统软件(如编译程序)。它的功能强、编译程序简单,是70年代影响最大一种算法语言。 Turbo Pascal...

第三章到第九章
第一章 简单程序 第三章 Turbo Pascal语言简介 第一节 Turbo Pascal 的安装与运行 PASCAL语言是一种算法语言,它是瑞士苏黎世联邦工业大学的N.沃思(Niklaus Wirth)教授于1968年 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 完成的,1971年正式发表。它的命名是为了纪念法国数学家Pascal。 PASCAL语言是一种结构化的程序设计语言,可以用来编写应用程序。它又是一种系统程序设计语言,可以用来编写顺序型的系统软件(如编译程序)。它的功能强、编译程序简单,是70年代影响最大一种算法语言。 Turbo Pascal 是由美国Borland公司设计、研制的一种适用于微机的Pascal语言应用开发集成环境。该产品由1983年推出1.0版本发展到1992年推出的7.0版本,功能不断完善。(参看p20) 1.安装及启动 本系统可以直接把TP70H文件夹复制到任意磁盘如d:;然后在TP70H文件夹中找到文件TP70H.EXE,发送到桌面快捷方式,点击“Turbo Pascal”程序图标即可运行。 2.Turbo Pascal系统的退出 退出Turbo Pascal系统的方法有: (1) 选择主菜单File中菜单项Exit,或者通过键盘命令ALT+X,可以彻底退出Pascal,若有未存储过的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 ,系统会给出提示询问是否要保存; (2) 选择主菜单File中菜单项Dos shell可以退出Pascal,进入DOS提示符状态,但Pascal仍然驻留在内存中。欲返回Pascal,可以键入命令exit. 3.集成环境及菜单使用 Turbo Pascal 集成环境(IDE)启动成功后,会出现下图的窗口界面,窗口由标题栏、工具栏、主菜单栏、编辑窗口和位于底部的状态行构成,这是Turbo Pascal 7.0的一个基本工作界面。 4.程序的输入和调试 下面通过一个简单的Pascal 程序来说明如何完成一个程序的输入、编辑、编译、链接、运行、保存等操作。程序如下: program ex; begin writeln(' Hello word!’); readln; end. (1)进入编辑状态 选择主菜单File中的菜单项Load,或按快捷键F3,在出现的对话框中输入文件名:test.pas,.pas可省略;若文件已存在,则调出。 (2)输入源程序 光标在编辑窗口,此时将程序按书写格式输入,输入的过程中可使用光标键和删除键进行编辑操作,每行输完后按回车键换行。 (3)保存程序 选择主菜单File中的菜单项Save,或按快捷键F2,则该程序就以test.pas为文件名保存在当前目录了。 (4)编译源程序 程序输入以后,即可开始编译。运行主菜单Compile中的菜单项Compile,或者按Alt+F9,对所输入的程序进行编译,此时屏幕上会显示有关编译信息的对话框。 如果在编译过程中发现程序有语法错误,系统会提示第一个错误信息。此时,应有针对性地进行修改。修改后再重复编译的过程,直到编译成功。 (5)运行程序 选择主菜单Run中的菜单项Run,或按快捷键Ctrl+F9,则完成程序的编译和运行, (6)观察运行结果 通过快捷键Alt+F5切换到用户屏幕,以便观察运行结果。再按任一键可返回编辑窗口。 (7)退出PASCAL Alt+x 5。常用命令的快捷方式 F3:打开或建立文件 F2:保存文件 Alt+F9:编译程序 (也可直接按F9,程序有错误时光标会停在错误的地方) Ctrl+F9:编译和运行程序 Alt+F5:查看程序运行结果 Alt+x:退出PASCAL Ctrl+c:中断程序运行 Ctrl+Insert:复制 Shift+Del:剪切 Shift+Insert:粘贴 Ctrl+Y:删除一行 Alt+Backspace:撤消 第二节 Pascal 程序结构和基本语句 通过下面的简单例题,可以速成掌握Pascal程序的基本组成和基本语句的用法,让初学者直接模仿学习编写简单程序。 [例1.1]编程在屏幕上显示“Hello World!”。 program ex11; begin writeln('Hello World! '); readln; end. 这个简单样例程序,希望大家的程序设计学习能有一个良好的开端。程序中的writeln是一个过程调用语句(Pascal没有输入、输出语句,用过程调用语句read()和write()代替),它能命令计算机在屏幕上输出相应的内容,而紧跟writeln语句后是一对圆括号,其中用单引号引起的部分将被原原本本地显示出来。 {p59.例3-5 写一个程序,原样打印如下图所示的杨辉三角图形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 } program YanghuiTriange2; begin writeln('write yanghui's triangle'); writeln(' 1'); writeln(' 1 1'); writeln(' 1 2 1'); writeln(' 1 3 3 1'); writeln('1 4 6 4 1'); end. [例1.2]已知一辆自行车的售价是300元,请编程计算a辆自行车的总价是多少? 解:若总售价用m来表示,则这个问题可分为以下几步处理: ①从键盘输入自行车的数目a; ②用公式 m=300*a 计算总售价; ③输出计算结果。 program ex12; {程序首部} var a,m : integer; {说明部分} begin {语句部分} write(‘a=’); readln(a); {输入自行车数目} m := 300*a; {计算总售价} writeln(‘m=’,m); {输出总售价} readln; {等待输入回车键} end. 此题程序结构完整,从中可看出一个Pascal 程序由三部分组成: (1)程序首部 由保留字program开头,后面跟一个程序名(如:Exl1);其格式为: program 程序名; 程序名按标识符定义由用户自己取,它的第一个字符必须是英文字母,其后的字符只能是字母或数字和下划线组成,程序名中不能出现运算符、标点符和空格。 (2)说明部分 程序中所用的标号(label)、常量(const)、类型(type)、变量(var)、过程(procedure)与自定义函数(function),需在使用之前预先说明,定义数据的属性(类型)。例如, var s,r,c: real; 是变量说明,此处说明s,r,c三个变量均为实数类型变量。只有被说明为某一类型的变量,在程序中才能将与该变量同类型的数值赋给该变量。变量说明的格式为: var 变量表:类型; (3)语句部分 指由保留字 begin至 end.之间的语句系列,是解决问题的具体处理步骤,也是程序的执行部分。这部分的语句系列称复合语句,其中不能有说明语句,语法上当成一个语句对待;begin、end对,又称语句括号。 Pascal程序不管是哪部分,每句末尾都必须有分号(;)作为语句的分隔符,但允许最接近 end 的那个语句末尾的分号省略;程序结束的end末尾必须有圆点(. ),是整个程序的结束标志。 程序中花括号“{ }”之间的部分为注释部分。 Pascal程序结构可归纳用如下的示意图来表示: Program 程序名; 程序首部 标号说明; (label) 常量说明; (const) 说明部分 类型说明; (type) 变量说明; (var) 过程或函数说明; begin 程序体 (主程序) 语句系列; 语句部分 end. 图1.1 Pascal程序的结构 把处理问题的步骤编成能从上到下顺序执行的程序,是简单程序的基本特征。再来 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 下面例题的Pascal程序结构和继续学习基本语句。 [例1.3]编程计算半径为r的圆的面积和周长。 解:这是一个简单问题,按数学方法可分以下几步进行处理: ① 从键盘输入半径的值r; ② 用公式 s=πr2 计算圆面积; ③ 用公式 c=2πr 计算圆周长; ④ 输出计算结果。 program Ex13; {程序首部 } var r,s,c: real; {说明部分 } begin {语句部分 } write ('r='); readln(r); {输入半径 } s:=pi*r*r; {圆面积公式S=πr2} c:=2*pi*r; {圆周长公式C=2πr} writeln('s=',s); {输出结果 } writeln('c=',c); readln {等待输入回车键} end. 程序中pi是Pascal提供的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 函数,它返回圆周率的近似值: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; ⑤ 紧接等式后面输出显示商和余数。 program ex14; var a,b,c,d : integer; begin write('Input a,b:'); {给出提示信息} readln(a,b); {输入a,b} writeln; {输出一空行} write(a,'/',b,'=');{输出等式之后不换行} c:=a div b;{整除运算,取商的整数部分} d:=a mod b;{相除取商的余数部分} writeln(c,'…',d); {输出后自动换行 } readln {等待输入回车键 } end. 执行本程序中第一个write语句,输出其引号以内的一串提示信息,是给紧接着的输入语句提供提示(要求输入几个什么数据),有“一目了然,人机对话”之效果。 readln也是一个过程调用语句(特殊的输入语句),要求输入一个回车(换行)才能往下执行。 readln是输入语句,它的一般格式为: ① read (变量1,变量2); ② readln (变量1,变量2); ③ readln 前两种格式均要从键盘给变量输入数据,输入时,所键入的数据之间以空格为分隔,以回车为输入结束。若多输入了数据(即数据个数超过变量个数),read语句读完数据之后,能让后续的读语句接着读取多下来的数据;而readln 语句对本行多输入的数据不能让后续语句接着读取多下来的数据。为了防止多输入的数据影响下一个输入语句读取数据,建议尽量使用readln语句输入数据。第三种格式不需输入数据,只需按下一个回车键。 第四章 语句与控制流程 在程序设计中,许多问题是在一定条件下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理。程序执行中将出现选择(分支),根据条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句,这样的程序称为分支程序。 第一节 条件语句与复合语句 [例2.1] 某服装公司为了推销产品,采取这样的批发销售 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :凡订购超过100 套的,每套定价为50元,否则每套价格为80元。编程由键盘输入订购套数,输出应付款的金额数。 解:设x为订购套数,y为付款金额,则: ① 输入x; ② 判断 x 值; ③ 根据判断结果选择符合条件的那种方法计算y值; ④ 输出计算结果。 program exam21; var x,y: integer; begin write('x=') ;readln(x) ; { 输入x} if x >100 then y:=50*x else y:=80*x; {条件判断与选择 } writeln('y=',y) ; readln end. 程序中的 if 语句常称为条件语句,其一般格式为: (1) if 条件 then 语句; (2) if 条件 then 语句1 else 语句2; if 语句的功能是按条件在两种可能中选择其中一种。习惯上把if 后面的表达式称为条件表达式,then 后面的语句称为真项,else 后面的语句称为假项。若条件成立(为真)就执行真项,然后执行if语句的后继语句;若条件不成立(为假)就跳过真项而执行假项,然后执行if语句的后继语句。而第一种格式只有真项,没有假项,当条件不成立(为假)就什么也不需做,直接往下去执行if语句的后继语句。 [例2.2] 读入三个不同的数,编程按由小到大的顺序排列打印出来。 解:设读入的三个数为a,b,c,为了把较小的数排在前面,可作如下处理: ① 如果a>b就交换a、b的值,将较大的值换至后面; ② 如果a>c就交换a、c的值,将较大的值换至后面; ③ 如果b>c就交换b、c的值,将较大的值换至后面; ④ 输出处理后的a,b,c。 progranm exam22; var a,b,c,t: real; begin write('Input a,b,c='); readln(a,b,c); if a>b then begin {复合语句} t:=a; a:=b; b:=t {交换a,b} end; if a>c then begin {复合语句} t:=a; a:=c; c:=t {交换a,c} end; if b>c then begin {复合语句} t:=b; b:=c; c:=t {交换b,c} end; writeln('a,b,c:',a:6,b:6,c:6); readln end. if 语句规定它的真项或假项位置上只能是一个基本语句,如果需要写一组语句,就应当使用复合语句。本程序中有三处用到复合语句。每个复合语句的范围是从begin开始到与它相对应的end为止。复合语句的地位和一个基本语句相同;其一般格式为: begin 语句系列 end。 {p73.例4-4 三个数的排序(Sorting)问题。编写一个程序能够从键盘输入任意 三个不同的整数,并以升(正)序的形式输出。} program sorting; var a,b,c:integer; begin writeln('a,b,c='); readln(a,b,c); if a>b then if b>c then writeln(c:4,b:4,a:4) else if a>c then writeln(b:4,c:4,a:4) else writeln(b:4,a:4,c:4) else if a>c then writeln(c:4,a:4,b:4) else if c>b then writeln(a:4,b:4,c:4) else writeln(a:4,c:4,b:4); readln; end. { a,b,c= 3 5 7 3 5 7 a,b,c= 5 7 3 3 5 7 a,b,c= 7 3 5 3 5 7 } **{p72.例4-3 身高预测问题。根据人体生理知识和数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持锻炼等。小孩成人后身高的计算公式为: 男性成人后身高=(父亲身高+母亲身高)×0.54 (cm) 女性成人后身高=(父亲身高×0.923+母亲身高)/2 (cm) 此外,若坚持体育锻炼可增加身高2%,营养及良好的卫生饮食习惯可增加1.5%。请写一个程序输入你父母的身高,然后预测出你个人的身高。} program ForecastStature; var FatherStature,MotherStature,ChildStature,child1:real; sex:integer; GoodHabit,TakeExercise,TakeGood:char; begin writeln('Input FatherStature,MotherStature:'); readln(FatherStature,MotherStature); writeln('Input Sex:'); readln(sex); if sex=1 then ChildStature:=(FatherStature+MotherStature)*0.54 else ChildStature:=(FatherStature*0.923+MotherStature)/2; writeln('ChildStature=',ChildStature:5:2); child1:=ChildStature; writeln('Input TakeExercise:'); readln(TakeExercise); if (TakeExercise='y') or (TakeExercise='Y') then ChildStature:=Child1*1.02; writeln('ChildStature=',ChildStature:5:2); writeln('Input GoodHabit:'); readln(GoodHabit); if (GoodHabit='y')or (GoodHabit='Y') then ChildStature:=Child1*1.015; writeln('ChildStature=',ChildStature:5:2); writeln('Input TakeExercise and GoodHabit:'); readln(TakeGood); if (TakeGood='y') or (TakeGood='Y') then ChildStature:=Child1*1.035; writeln('ChildStature=',ChildStature:5:2); readln; end. { Input FatherStature,MotherStature: 1.7 1.6 Input Sex: 1 ChildStature=1.78 Input TakeExercise: y ChildStature=1.82 Input GoodHabit y ChildStature=1.81 Input TakeExercise and GoodHabit: y ChildStature=1.84 Input FatherStature,MotherStature: 1.7 1.6 Input Sex: 0 ChildStature=1.58 Input TakeExercise: y ChildStature=1.62 Input GoodHabit y ChildStature=1.61 Input TakeExercise and GoodHabit: y ChildStature=1.64 } 第二节 情况语句与算术标准函数 如果有多种(两种或两种以上)选择,常用情况语句编程。 将前面[例2.1]改成用如下方法来处理。根据题意,付款计算可分为两种情况: ① y=50*x (x>100) ② y=80*x (x<=100) 显然,情况①与②的选择取决于x值。假设用n表示“情况值”,暂且先让n=2; 如果x>100则n=1;(此题中n的值只是1或2,且取决于x值) program exam21_1; var x,y,n: integer; begin write('x=') ;readln(x) ; n:=2; { 先让n=2 } if x>100 then n:=1; {如果x>100则 n=1 } case n of { 关于情况处理 } 1: y:=50*x; 2: y:=80*x; end; writeln('y=',y) ; readln end. 程序中的 case─end 语句为情况语句,是多路分支控制,一般格式为: case 表达式 of 情况常量表1: 语句1; 情况常量表2: 语句2; : : 情况常量表n: 语句n end; 执行情况语句时,先计算case后面表达式的值,然后根据该值在情况常量表中的“对应安排”,选择其对应的语句执行,执行完所选择语句后就结束case语句;如果常量表中没有一个与表达式值对应的语句,则什么也不做就结束本case语句。 case 语句的另一种应用格式为: case 表达式 of 情况常量表1: 语句1; 情况常量表2: 语句2; : : 情况常量表n: 语句n; else 语句 n+1 end; 这种格式的前面部分是相同的,所不同的是:如果常量表中没有一个与表达式值对应的语句,则执行与else对应的语句,然后结束case语句。 [例2.2] 对某产品征收税金,在产值1万元以上征收税5%;在1万元以下但在5000元 以上的征收税3%;在5000元以下但在1000元以上征收税2%;1000元以下的免收税。编程计算该产品的收税金额。 解:设x为产值,tax为税金,用p表示情况常量各值,以题意中每1000元为情况分界: 这里的p是“情况”值,用产值x除以1000的整数值作为p,如果p>10也归入p=10的情况。用p=trunc(x/1000)取整计算, p=0: tax=0 (x<1000 ) p=1,2,3,4: tax=x*0.02 (1000<=x<5000 ) p=5,6,7,8,9: tax=x*0.03 (5000<=X<10000 ) p=10: tax=x*0.05 (x>= 10000 ) programexam22; var x,p : integer; tax, : real; begin write('Number=') ; readln(x) ; p:=trunc(x/1000) ; if p>9 then p:=10; case p of 0 : tax:=0; 1,2,3,4 : tax:=x*0.02; 5,6,7,8,9 : tax:=x*0.03; 10 : tax:=x*0.05 end; writeln('tax=',tax:5:2) ; readln end. 情况表达式的计算必须考虑到“全部”情况,不要有遗漏。如果情况常量表的“值”在某范围内是连续的,可将常量表写成: n1.. n2:语句; 因此,上面程序中的情况常量表可以写成如下程序中表示形式: program exam22_1; var x,p: integer; tax: real; begin write('Number=') ; readln(x) ; p:=trunc(x/1000) ; if p>9 then p:=10; case p of 0 : tax:=0; 1..4 : tax:=x*0.2; { 从1至4作为同一情况处理 } 5..9 : tax:=x*0.3; { 从5至9作为同一情况处理 } 10 : tax:=x*0.5 end; writeln('tax=',tax:5:2) ; readln end. {p75.例4-5 计算器的模拟问题。编写一个程序模拟简单的计算器,要求能够进行 两个操作数的加、减、乘、除四则运算。例如,当输入"543.2×12"时,计算器显示计算结果"6518.40"。} program Calculator; var result,Number1,Number2:real; ch:char; begin writeln('Input Number1:'); readln(Number1); writeln('Input operator(+、-、*、/):'); readln(ch); writeln('Input Number2:'); readln(Number2); result:=0; case ch of '+':result:=Number1+Number2; '-':result:= Number1-Number2; '*':result:= Number1*Number2; '/':if Number2<>0.0 then result:=Number1/Number2 else writeln('divide overflow!'); else writeln('Input error! '); end; writeln(Number1:0:2,ch:1,Number2:0:2,'=',result:0:2 ); readln; end. { Input Number1: 543.2 Input operator(+、-、*、/): * Input Number2: 12 543.20*12.00=6518.40 } 程序中的trunc(x)为取整函数,是Pascal的算术标准函数之一。Pascal常用的算术标准函数有20个(参见p42,p375),设i为整型数, x为实型数,: (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的自然对数(loge x ); (6) odd(i) 判断i的奇偶数(当i为奇数时odd(i)值为true,否则为false); (7) ord(s) 求s的序号,结果为整型; (8) chr(i) 求i的序号对应的ASCII码; *(9) pi 求π值(3.1415926535897932…); (10) pred (s) 求s的前趋值; (11) succ(s) 求s的后继值; *(12) random 随机函数,产生0~1的随机值; *(13) random(n)产生0~n的随机数 (n为word类型,先执行randomize,才能得到随机数); (14) round(x) 求x的四舍五入整数; (15) trunc(x) 求x的截断整数; (16) sqr(x) 求x的平方值; (17) sqrt(x) 求x的开平方根值; (18) sin(x) 求x的正弦函数(x为弧度); (19) cox(x) 求x的余弦函数(x为弧度); (20) arctan(x) 正切的反三角函数(x为数值); 在编程中经常遇到需要多次规律相同的重复处理,这就是循环问题。Turbo Pascal采用不同的循环方式来实现,常用的循环有三种: for、repeat、while. 第三节 for 循环 for循环是一种自动计数型循环,先判断后执行。 [例3.1] 试打印出1~20的自然数。 解:① 用i代表1~20各数,同时也用i兼作计数,以控制循环次数; ② 让i从初值1开始, 如果i未超越所规定的循环范围则③,否则结束循环; ③ 输出i; ④ i自动计数(加1),如果未超越所规定的循环范围则重复步骤③,否则结束循环。 program exam31; var i: byte; begin for i:=1 to 20 do writeln (i); readln end. 程序中for i:=1 to 20 do writeln (i);是for循环语句。 for 循环语句有两种格式: (1) for循环变量:=初值 to 终值 do 语句; (2) for循环变量:=初值 downto 终值 do 语句; 第(1)种格式的初值小于等于终值,循环变量值按自动加1递增变化; 第(2)种格式的初值大于等于终值,循环变量值按自动减1递减变化。 for 循环是 (以递增1或以递减1) 计数型循环。 比如: 若将[例3.1]程序改为倒计数(递减)循环,则输出20~1的自然数: program exam31_1; var i: byte; begin for i:=20 downto 1 do writeln(i) ; readln end. [例3.2]打印出30至60的偶数。 解: 方法一: ①设i表示30至60的所有的数,可用for循环列出; ②用条件式 i mod 2=0 筛选出其中的偶数并输出。 program ex32; var i : integer; begin for i := 30 to 60 do if i mod 2=0 then writeln(i); readln; end. 在这个程序中,for循环后的语句是一个条件语句。 方法二:我们知道,在式子i=2*n中,若n取自然数1、2、3、…,时,则i依次得到偶数2、4、6、…。因此要想得到30至60的偶数,就可以让上面式子中的n取15至30的自然数就可以了。所以本题还可以按以下步骤处理: ①设n表示15至30的所有自然数,可用for循环列出; ②用式子 i := 2*n 求出其中的偶数; ③将结果输出到屏幕。 program ex32_1; var n,i: integer; begin for n := 15 to 30 do begin i := 2*n; writeln(i); end; readln; end. [例3.3]自然数求和:编一个程序,求从1至100的自然数的和。 解:① 令s=0; ② 令i表示1至100的自然数,用循环列出; ③ 将这些数用公式s:=s+i 逐一累加到s中去; ④ 循环结束后,s即为1至100的和,输出即可。 program ex33; var s,i : integer; begin s := 0; for i := 1 to 100 do s := s+i; writeln(‘s=’,s); readln; end. [例3.7] 打印出九九乘法表: 解:设i为被乘数,范围为1~9;j为乘数,范围为1~i;乘式为i*j(i,j的乘积),则 i=1: j=1~i 1*1=1 i=2: j=1~i 2*1=2 2*2=4 i=3: j=1~i 3*1=3 3*2=6 3*3=9 i=4: j=1~i 4*1=4 4*2=8 4*3=13 4*4=16 : : i=9:j=1~i 9*1=9 9*2=18 … 9*9=81 ⑴从上面分解的行中看到共有9行,这里的“行”数变化与i的变化从1~9相同,可用i控制“行”的循环; ⑵每“行”里面相乘的次数与j的范围相关,由j控制每“行”里面的“内部”循环; ⑶内循环被包含在最里层,执行完每“行”的内部循环,就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的(j=1~i)内循环(即“列”)。 program exam37; var i,j: byte; begin for i:=1 to 9 do {外循环 } begin for j:=1 to i do {内循环 } write(i,'* ',j,'= ',i*j,' ':3); writeln end; readln end. 根据这种格式还可以实现多层循环嵌套,例如: for a:=n1 to n2 do for b:=m1 to m2 do for c:=k1 to k2 do 循环体语句; [例3.8]从七张扑克牌中任取三张,有几种组合方法?请编程输出所有组合形式。 解:设每次取出三张分别为i,j,k。用三重循环分别从1~7的范围里取值;为了排除取到重号,用(i-j)*(j-k)*(i-k) < >0进行判断。 program exam38; const n=7; var i,j,k,t: integer; begin t:=0; for i:=1 to n do for j:=i to n do for k:=j to n do if (i-j) * (j-k) * (i-k) <>0 then begin inc (t); riteln (i:3, j:3, k:3) end; writeln ( 'total:', t :5); readln end. {total:35} [例3.9] 数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(或质数)。现在由键盘输入一个自然数n,编程判断n是否是素数,是则输出“Yes”,否则输出“No”。 解:根据定义,对于给定的自然数n,只需判断除1和它本身外,还有没有能够整除它的第三个自然数即可。 ① 令k从2循环至n-1;{n-1可改为n div 2或trunc(sqrt(n))} ② 根据n mod k是否为0可求k的约数; ③ 若有约数,则判定n不是素数;否则n是素数。 program exam39; var n,k: integer; yes:boolean; begin yes:=true; writeln('n='); readLn(n); for k:=2 to n-1 do {外循环 } if n mod k=0 then yes := false; {如果有约数, 则不是素数} if yes then writeln('Yes') else writeln('No'); readln; end. 程序中的变量yes为布尔(或逻辑)类型(boolean)。布尔值只有两个: true(真) false(假) 布尔变量yes为真,在逻辑上表示n是素数;布尔值常用于条件语句、循环语句和逻辑表达式中。 Pascal 共有四种逻辑运算符: ① and (与) 两条件都为true时,其结果值为true;否则为false; ② or (或) 两条件中只要有一个为true ;其结果值为true;否则为false; *③ xor (异或) 两条件的逻辑值不相同时,其结果值为true;否则为false; ④ not (非) 条件为true时,其结果值为false;否则为true;(取反) 第四节 repeat 循环 repeat循环是直到型循环,先执行后判断。 试将上一节的例3.1(打印出1~20的自然数)程序改为 repeat 循环: program exam31_1; var i: byte; begin repeat writeln ( i :8); inc(i);{ i的值增加1, i:=i+1} until i>20; readln end. 程序中的repeat循环格式为: repeat 循环体语句; until 条件表达式; {直到条件为真} repeat循环首先执行由repeat和until括起来的循环体语句,然后检查until后面的条件表达式:如果表达式结果为假,则继续执行循环体,接着继续检查until后面的条件表达式,如此反复执行直到这个表达式结果为真时结束循环。repeat循环体语句必须有能改变until后面条件表达式值的语句,并最终使这个条件表达式的值为真,使循环自动结束。 过程inc (i,n)相当于i : =i+n,其中的i和n是长整型;常用的同类过程格式如下: (1) inc(i) 等同 i:=i+1; (2) inc(i, n) 等同 i:=i+n; (3) dec(i) 等同 i:=i—1; (4) dec(i, n) 等同 i:=i—n; [例3.10]求两个自然数m和n的最大公约数。 解:若自然数a既是m的约数,又是n的约数,则称a为m和n的公约数,其中最大的称为最大公约数。为了求得最大公约数,可以从最大可能的数(如m或n)向下寻找,找到的第一个公约数即是最大公约数。 program ex310; var m,n,a:word; begin write('Input m,n: ');readln (m,n); write('(',m,',',n,')= ') ; a := n+1; repeat dec(a); until (m mod a=0) and (n mod a=0); writeln(a); readln; end. { Input m,n:18 12 (18,12)=6 } ***************** {最小公倍数。} program ex310_1; var m,n,a:word; begin write('Input m,n: ');readln (m,n); write('(', m, ' , ' , n, ')=' ) ; a := m-1; repeat inc(a); until (a mod m=0) and (a mod n=0); writeln(a); readln; end. { Input m,n:18 12 (18,12)=36 } 第五节 While 循环 While循环是当型循环,先判断后执行 。 *[例3.8] 前面第一章{p68.例4-2 鸡兔同笼问题}。头36,脚106,求鸡兔各几只?在此用下面方法编程求解。 解: 设鸡为j只,兔为t只。已知头为h, 脚为f。 ①让鸡的只数逐次加1进行递推计算,初始时j=0; ②计算兔的只数t=h-j; ③当总脚数(4*t+2*j) < >f就做 (j=j+1,t=h-j); ④当4*t+2*j=f时,说明所推算的j和t是正确的,应结束循环,并输出t,j。 program exam38; const h=36; f=106; var j,t:integer; begin j:=0; t:=h-j; {初始时让j从0开始计算 } while 4*t+2*j<>f do{条件为真就做循环体} begin inc(j); { 递推改变J值 } t:=h-j {计算兔的只数 } end; writeln('j=',j, ' ', 't=',t ) ; readln end. {j=19 t=17} 程序中采用while当型循环,while的格式为: while 条件表达式 do 语句; 其中do后面的“语句”是被重复执行的,称为循环体;若循环体是多个语句, 必须用复合语句。 while循环首先判断条件表达式,当条件表达式的值为真就执行do 后面的语句(循环体)。 while的循环体内也必须包含能改变控制变量取值的语句, 影响条件表达式的值, 最终使条件表达式为false (假), 才能结束循环。 *[例3.9] 输入任一的自然数a,b, 求a ,b的最小公倍数。 解:这里采用适合计算机查找的方法: 设d是它们的最小公倍数。先找出a,b当中的较大者并存放在a中, 将较小者存放在b中, 让d=a, 当b能够整除d时, 则d是所求的最小公倍数;当b不能整除d,就逐次地让d增加a。例如:a=18, b=12, 步骤如下: ① 让d=a (d=18) ② 当(d mod b)<>0 为真时 ( d不能整除b ) 就做 d=d+a, 重复②; ③ 当(d mod b)<>0 为假时结束循环,并输出d。 program exam39; var a,b,d,t : word; begin writeln('Input a,b: '); readln(a , b); if a0 do {当条件为真时就做do后面的语句 } inc(d,a); writeln('[',a,', ',b,']= ',d) ; readln end. {Input a,b: 18 12 [18,12]=36} Pascal语言的三种基本循环方式, for循环对循环范围有明确规定, 且循环变量只能是递增1或递减1自动计数控制; 而repeat--until循环和while--do循环比较灵活, 只要对条件表达式的值能控制满足一定要求就能组成循环, 但在循环体中必须有改变循环变量值的语句, 使条件判断(逻辑值)最终为true或flase, 让循环能够终止。 [例3.10]求自然数m, n的最大公约数。 解:采用如下方法步骤: (1)求m除以n的余数r; (2)当余数r<>0就做m=n;n:=r; r=m mod n, 重复(1)和(2); (3)当余数r=0就结束循环,并输出n值。 比如m=18, n=12时,处理步骤为: (1)r=m mod n=6 ,得余数r为6; (2) 此余数r不为零 ,让m = 12,n = 6; (3) 重复r=m mod n=0 ,得余数r为0; (4) 结束循环,输出6(余数为零时的b值即是所求的最大公约数)。 此方法称为辗转相除法求最大公约数。 program exam310; var m,n, r: word; begin write('Input m,n: ');readln(m,n); write('(',m,', ',n,')= ') ; r:=m mod n; while r <> 0 do begin m:=n; n:=r; r:=m mod n; end; writeln(n); readln end. { Input m,n:18 12 (18,12)=6} ****************** [例3.10]求自然数m, n的最大公约数。 解:采用如下方法步骤: (1)求m除以n的余数r; (2)当余数r<>0就做m=n;n:=r; r=m mod n, 重复(1)和(2); (3)当余数r=0就结束循环,并输出n值。 比如m=18, n=12时,处理步骤为: (1)r=m mod n=6 ,得余数r为6; (2) 此余数r不为零 ,让m = 12,n = 6; (3) 重复r=m mod n=0 ,得余数r为0; (4) 结束循环,输出6(余数为零时的b值即是所求的最大公约数)。 此方法称为辗转相除法求最大公约数。 program exam310; var m,n,r,a,b,ab: word; begin write('Input m,n: ');readln (m,n); a:=m;b:=n; write('(',m, ', ',n,')= ') ; r:=m mod n; while r <> 0 do begin m:=n; n:=r; r:=m mod n; end; writeln(n); writeln('ab=',a*b div n); readln end. { Input m,n:18 12 (18,12)=6 ab=36 Input m,n:7 3 (7,3)=1 ab=21 } ****************************** {p81.例4-6 求和问题。写一程序求sum= 。 } program ExampleSum; var i,sum:integer; Begin i:=1; sum:=0; while i<=100 do begin sum:=sum+i; i:=i+1 end; write('sum=',sum); readln; End. {sum=5050} {p83.例4-7 韩信点兵问题。汉朝将军韩信有一队士兵,他想知道有多少人,便让 士兵排队报数:按1至5报数,记下最末一个士兵报的数为1;按1至6报数, 记下最末一个士兵报的数为5;按1至7报数,记下最末一个士兵报的数为4; 最后按1至11报数,记下最末一个士兵报的数为10。问韩信至少有多少兵?} program ChineseRemainder; const max=10000; var NumberOfSoldier:integer; Begin NumberOfSoldier:=65; while NumberOfSoldier
本文档为【第三章到第九章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_711407
暂无简介~
格式:doc
大小:575KB
软件:Word
页数:50
分类:理学
上传时间:2010-10-19
浏览量:50