第三节 分支程序.docx
- 文档编号:30248833
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:21
- 大小:29.79KB
第三节 分支程序.docx
《第三节 分支程序.docx》由会员分享,可在线阅读,更多相关《第三节 分支程序.docx(21页珍藏版)》请在冰豆网上搜索。
第三节分支程序
第二章 分支程序
在程序设计中,许多问题是在一定条件下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理。
程序执行中将出现选择(分支),根据条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句,这样的程序称为分支程序。
第一节 条件语句与复合语句
[例2.1]某服装公司为了推销产品,采取这样的批发销售方案:
凡订购超过100套的,每套定价为50元,否则每套价格为80元。
编程由键盘输入订购套数,输出应付款的金额数。
解:
设X为订购套数,Y为付款金额,则:
①输入X;
②判断X值;
③根据判断结果选择符合条件的那种方法计算Y值;
④输出计算结果。
Pascal程序:
ProgramExam21;
Varx,y:
integer;
Begin
Write('X=');Readln(x); { 输入X}
ifx>100theny:
=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语句的后继语句;若条件不成立(为假)就跳过真项而执行假项,然后执行后继语句。
而第一种格式只有真项,没有假项,当条件不成立(为假)就什么也不需做,直接往下去执行后继语句。
[例2.2]读入三个不同的数,编程按由小到大的顺序排列打印出来。
解:
设读入的三个数为a,b,c,为了把较小的数排在前面,可作如下处理:
①如果a>b就交换a、b的值,将较大的值换至后面;
②如果a>c就交换a、c的值,将较大的值换至后面;
③如果b>c就交换b、c的值,将较大的值换至后面;
④输出处理后的a,b,c。
Pascal程序:
Progranm Exam22;
Vara,b,c,t:
Real;
Begin
Write('Inputa,b,c=');
Readln(a,b,c);
ifa>bthen
begin {复合语句}
t:
=a;a:
=b;b:
=t {交换a,b}
end;
ifa>cthen
begin {复合语句}
t:
=a;a:
=c;c:
=t {交换a,c}
end;
ifb>cthen
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;
习题2.1
1.假设邮局规定寄邮件时若每件重量在1公斤以内(含1公斤),按每公斤1.5元计算邮费,如果超过1公斤时,其超出部分每公斤加收0.8元。
请编程序计算邮件收费。
2.输入三个正整数,若能用这三个数作为边长组成三角形,就计算并输出该三角形的面积,否则输出Can't。
(组成三角形的条件为:
任意两边之和大于第三边)
3.输入一个三位数的整数,将数字位置重新排列,组成一个尽可大的三位数。
例如:
输入213,重新排列可得到尽可能大的三位数是321。
第二节 情况语句与算术标准函数
如果有多种(两种或两种以上)选择,常用情况语句编程。
将前面[例2.1]改成用如下方法来处理。
根据题意,付款计算可分为两种情况:
①Y=50*X (X>100)
②Y=80*X (X<=100)
显然,情况①与②的选择取决于X值。
假设用N表示“情况值”,暂且先让N=2;
如果X>100则N=1;(此题中N的值只是1或2,且取决于X值)
Pascal程序:
ProgramExam21_1;
VarX,Y,N:
integer;
Begin
Write('X=');readln(x);n:
=2; {先让n=2}
ifX>100thenn:
=1; {如果X>100则n=1}
Casen 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=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 P=10: tax=x*0.05 (x>10000) 这里的P是“情况”值,用产值x除以1000的整数值作为P,如果P>10也归入P=10的情况。 Pascal语言用P=trunc(x/1000)取整计算, Pascal程序: ProgramExam22; Var x,p: integer; Tax : real; Begin Write('Number=');readln(x); P: =trunc(x/1000); ifP>9thenP: =10; Case P of 0 : tax: =0; 1,2,3,4 : tax: =x*0.2; 5,6,7,8,9 : tax: =x*0.3; 10 : tax: =x*0.5 end; Writeln('tt=',tt: 5: 2); Readln End. 情况表达式的计算必须考虑到“全部”情况,不要有遗漏。 如果情况常量表的“值”在某范围内是连续的,可将常量表写成: n1..n2: 语句; 因此,上面程序中的情况常量表可以写成如下程序中表示形式: ProgramExam22_1; Varx,p: integer; tax: real; Begin Write('Number=');readln(x); P: =trunc(x/1000); ifP>9thenP: =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('tt=',tt: 5: 2); Readln End. 程序中的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随机函数,产生0~1的随机值; (12)random(n)产生0~n的随机数(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.2 1.运输公司计算运费时,距离(S)越长,每公里运费越低,标准如下: 如果S<250公里;运费为标准运价的100% 如果250公里<=S<500公里,运费为标准运价的98%; 如果500公里<=S<1000公里,运费为标准运价的95%; 如果1000公里<=S<2000公里,运费为标准运价的92%; 如果2000公里<=S<3000公里,运费为标准运价的90%; 如果S=>3000公里,运费为标准运价的85%;。 请编计算运费的程序。 2.输入考试成绩,如果获85分以上为A等,获60分~84分为B等,60分以下为C等,编程输出考试等级。 3.某车间按工人加工零件的数量发放奖金,奖金分为五个等级: 每月加工零件数N<100者奖金为10元;100<=N<110者奖金为30元;110<=N<120者奖金为50元;120<=N<130者奖金为70元;N>130者为80元。 请编程,由键盘输入加工零件数量,显示应发奖金数。 第三章 循环程序 在编程中经常遇到需要多次规律相同的重复处理,这就是循环问题。 TurboPascal采用不同的循环方式来实现,常用的环循有三种: for、repeat、while. 第一节 for循环 for循环是一种自动计数型循环。 [例3.1]试打印出1~20的自然数。 解: ①用a代表1~20各数,同时也用a兼作计数,以控制循环次数; ②让a从1开始; ③输出a; ④a自动计数(加1),如果未超越所规定的循环范围则重复步骤③,否则结束循环。 Pascal程序: ProgramExam12; Vara: byte; Begin fora: =1to20do Writeln(a); Readln End. 程序中 fora: =1to20doWriteln(a);是for循环语句。 for循环语句有两种格式: (1)for 循环变量: =初值 To终值do语句; (2)for 循环变量: =初值 downto终值do语句; 第 (1)种格式的初值小于等于终值,循环变量值按自动加1递增变化; 第 (2)种格式的初值大于或等于终值,循环变量值按自动减1递减变化。 for循环是(以递增1或以递减1)计数型循环。 比如: 若将[例3.1]程序改为倒计数(递减)循环,则输出20~1的自然数数: ProgramExam31; Vara: byte; Begin fora: =20downto1do Writeln(a); Readln End. [例3.2]打印出30至60的偶数。 ] 解: 方法一: =1\*GB3①设a表示30至60的所有的数,可用for循环列出; =2\*GB3②用式子 amod2=0 筛选出其中的偶数并输出。 Pascal程序: Programex32; Vara : integer; Begin Fora: =30to60do If(amod2=0)thenwriteln(a); Readln; End. 在这个程序中,for循环后的循环语句是一个条件分支语句。 方法二: 我们知道,在式子a=2*n中,若n取自然数1、2、3、…,时,则a依次得到偶数2、4、6、…。 因此要想得到30至60的偶数,就可以让上面式子中的n取15至30的自然数就可以了。 所以本题还可以按以下步骤处理: =1\*GB3①设n表示15至30的所有自然数,可用for循环列出; =2\*GB3②用式子 a: =2*n 求出其中的偶数; =3\*GB3③将结果输出至屏幕。 Pascal程序: Programex32; Begin Forn: =15to30do Begin a: =2*n; Writeln(a); End; Readln; End. [例3.3]自然数求和: 编一个程序,求从1至100的自然数的和。 解: ①令S=0; ②令a表示1至100的自然数,用循环列出; ③将这些自然数用公式S: =S+a逐一累加到S中去; =4\*GB3④循环结束后,S即为1至100的自然数的和,输出即可。 Pascal程序: Programex33; vars,a: integer; Begin S: =0; Fora: =1to100do S: =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; =5\*GB3⑤用式子y-x=36筛选出符合条件的数x并输出。 Pascal程序: Programex34; Begin Forx: =10to99do Begin a: =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)在四位数(1000~9999)范围内,可确定a在32~99循环; ②计算N=a*a;将四位数N拆分为两个数n1和n2; ③若满足条件(n1+n2)*(n1+n2)=N就输出N。 Pascal程序: Program Exam35; VarN,a,x,n1,n2: Integer; Begin fora: =32to99do begin N: =a*a; n1: =Ndiv100; {拆取四位数的前两位数} n2: =N-n1*100; {拆取四位数的后两位数} X: =n1+n2; if x*x=N then writeln(N); end; Readln End. [例3.6]用“*”号打印出如下的长方形图案。 ********* ********* ********* ********* 解: ①上面给出的图例共有4行,我们可以用一个循环控制行的变化; ②在每行中又有9列,我们可以在前面控制行的循环中再套一个循环来控制列的变化。 Pascal程序: Programex36; Begin Fora: =1to4do {外循环控制行的变化} Begin Forb: =1to9do {内循环控制列的变化} write(‘*’); Writeln; {输出一行的“*”后换行} End; Readln; End. 程序中的循环对于a的每个值都包含着一个b=(1~9)次的内循环。 外循环fora将内循环forb包含在里面,称为for循环的嵌套。 嵌套形式如: fora: =n1ton2do forb: =m1tom2do 循环体语句; [例3.7]打印出九九乘法表: 解: 设a为被乘数,范围为1~9;b为乘数,范围为1~a;乘式为a*b=(a,b的乘积),则 a=1: b=1~a 1*1=1 a=2: b=1~a 2*1=2 2*2=4 a=3: b=1~a 3*1=3 3*2=6 3*3=9 a=4: b=1~a 4*1=4 4*2=8 4*3=13 4*4=16 : : a=9 b=1~a 9*1=9 9*2=18 … 9*9=81 ⑴从上面分解的横行中看到共有9行,这里的“行”数变化与a的变化从1~9相同,可用a控制“行”的循环; ⑵每“行”里面相乘的次数与b的范围相关,由b控制每“行”里面的“内部”循环; ⑶内循环被包含在最里层,执行完每“行”的内部循环,就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的(b=1~a)内循环。 即每到一“行”都要执行该“行”的内循环。 这里所指的“行”可以理解成抽象的行,不一定是实际上具体对应的行,可以是一个处理“块”。 Pascal程序: ProgramExam37; Vara,b: byte; Begin fora: =1to9do {外循环} begin forb: =1toado {内循环} write(a,’*’,b,’=’,a*b,’ ’: 3); writeln end; Readln End. 根据这种格式还可以实现多层循环嵌套,例如: fora: =n1ton2do forb: =m1tom2do forc: =k1tok2do 循环体语句; [例3.8]从七张扑克牌中任取三张,有几种组合方法? 请编程输出所有组合形式。 解: 设每次取出三张分别为a,b,c。 用三重循环分别从1~7的范围里取值;为了排除取到重号,用(a-b)*(b-c)*(a-c)<>0进行判断。 Pascal程序: programExam38; const n=7; var a,b,c,t: integer; Begin t: =0; fora: =1tondo forb: =1tondo forc: =1tondo if(a-b)*(b-c)*(a-c)<>0then Begin inc(t); writeln(a: 3,b: 3,c: 3) End; writeln(total: t: 5); readln End. [例3.9]数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三节 分支程序 三节 分支 程序