第三节 分支程序.docx

上传人:b****8 文档编号:30248833 上传时间:2023-08-13 格式:DOCX 页数:21 大小:29.79KB
下载 相关 举报
第三节 分支程序.docx_第1页
第1页 / 共21页
第三节 分支程序.docx_第2页
第2页 / 共21页
第三节 分支程序.docx_第3页
第3页 / 共21页
第三节 分支程序.docx_第4页
第4页 / 共21页
第三节 分支程序.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

第三节 分支程序.docx

《第三节 分支程序.docx》由会员分享,可在线阅读,更多相关《第三节 分支程序.docx(21页珍藏版)》请在冰豆网上搜索。

第三节 分支程序.docx

第三节分支程序

第二章 分支程序

 

在程序设计中,许多问题是在一定条件下才选择某种处理方式的,这就需要用条件判断语句或情况选择语句进行处理。

程序执行中将出现选择(分支),根据条件只选择执行部分语句,不一定都是按原顺序从头到尾地执行所有语句,这样的程序称为分支程序。

第一节 条件语句与复合语句

[例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和它本身,没有别的数能够整除它的自然数叫做素数(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1