《第三章流程控制语句.docx》由会员分享,可在线阅读,更多相关《第三章流程控制语句.docx(20页珍藏版)》请在三一办公上搜索。
1、第三章流程控制语句第01讲java程序的结构及流程控制目录第一节java程序的结构第二节流程控制第三节输入/输出第四节处理异常01java程序的结构一个JaVa程序可以由一个或多个.java文件组成,这些文件称为源文件。每个源文件中含有一个或多个类或接口。一个源文件中如果有多个类,则最多只能有一个是PUbIiC类型的类,且该源文件的名字即为这个公有类的名字,且大小写也要一致。其他非PUbIiC的类的个数不限。PaCkage语句:包语句,每个文件最多只有一个,且必须放在文件开始的地方。import:引入语句,可以没有,也可以有多个,如果有import语句的话,必须放在所有类定义的前面,具有PUb
2、liC权限的类定义:每个文件中最多有一个。类定义:每个文件中包含的非public权限的类定义的个数没有限制。接口定义:每个文件中包含的接口定义个数没有限制。包的概念包是类的容器,包的设计人员利用包来划分名字空间,以避免类名冲突。Java中的包一般均包含相关的类,使用包的目的就是将相关的源代码文件组织在一起。src田quCreatesfolderscorrespondingtopackages.田student田teacher由toolsJRFSVVtQmIihrarvirSourcefolder:test/srcBrowse.Name:quikao*程序中如果有PaCkage语句,该语句一定是
3、源文件中的第一条非注释语句,它的前面只能有注释或空行。通常包名全部用小写,一个包可以包含若干个类文件,还可以包含若干个包。引入语句packagequ.zikao;importstudent.*;引入student包下面所有的类importnt;引入单个学生类publicclassControlpublicstaticvoidmain(Stringargs)引入时包与包下边的包用.分隔引包错误示例示例语句说明示例一packageTransportation;importjava.awt.Graphics;importjava,util.ArrayList;正确示例二importjava,ics;
4、importjava.util.ArrayList;packageTransportation;错误原因:在包说明语句之前含有其他语句示例三packageTransportation;packageHouse;importjava.util.ArrayList;错误原因:含有两个包说明语句02流程控制流程控制什么是流程控制,简单的来说就是控制程序走向的语句。流程控制语句又分赋值语句、分支语句、循环语句和跳转语句。语句是JaVa的最小执行单位,语句间以分号(;)作为分隔符。语句分为单语句及复合语句,单语句就是通常意义下的一条语句;而复合语句是一对大括号(“”和“”)括起来的语句组,也称为“块”。
5、赋值语句在JaVa程序中,表达式可以当作一个值赋给某个变量,这样的语句称为赋值语句。有的表达式也可单独当作语句,这样的语句称为表达式语句。语句与表达式有相同的地方,也有不同的地方。首先,有的表达式可以当作语句,但并不是所有的语句都是表达式;另外,每个表达式都会得到一个值,即表达式的计算结果。下面的语句中,前两条是赋值语句,第3条是表达式语句。customer!=newCustomer();x=12;x+;分支语句分支语句根据一定的条件,动态决定程序的流程方向,从程序的多个分支中选择一个或几个来执行。分支语句有if语句和SWiteh语句两种,先看下if语句的形式publicclassContro
6、lpublicstaticvoidmain(Stringargs)inta=3;intb=5;if(ab).printin(a);语句1else.printin(b);语句2)if关键字之后的条件表达式必须得到一个逻辑值,if语句的含义是:当条件表达式结果为true时,执行语句1,然后继续执行if后面的语句;当条件表达式为false时,如果有else子句,则执行语句2,可以没有else语句,如果没有则跳过该if语句,继续执行后面的语句。这是两种形式。if-elsepublicstaticvoidmain(Stringargs)inta=59;if(a90).pringln(成绩优秀);else
7、if(a=60&a=90).printin(成绩良好);elseif(a=59).printin(差一分就及格了”);)else.printin(不及格”);)可以嵌套使用,if中还可以写if判断switch语句switchCaSe语句如下:switch(表达式)(case选择值1:程序代码块1;case选择值2:case选择值3:程序代码块2;break;case选择值n:程序代码块n;break;/break语句可选default:程序代码块;SWitCh语句的语义是:计算表达式的值,用该值依次和1,2,,n相比较。如果该值等于其中之一,例如1,那么执行CaSe1之后的语句组,直到遇到br
8、eak语句结束。如果没有相匹配的结果,则执行default之后的语句。可以将default看作是一个分支,即前面的条件均不满足时要执行的语句。switch语句中各CaSe之后的语句既可以是单语句,又可以是语句组。不论执行哪个分支,程序流都会顺序执行下去,直到遇到break语句为止。switch语句有以下注意几点:口switch语句中不能忘记break,否则会有贯穿现象。口switch的应用有所限制,其表达式只能应用于int,charswitch语句实例publicclassTestpublicstaticvoidmain(Stringargs)Scannerscanner=newScanner
9、();.printin(请输入数字”);intday=nt();switch(day)case 1: printin(今天是星期一“);break;case 2: printin(今天是星期二);break;case7:.printin(今天是星期日);break;default:.printin(抱歉,请重新输入“);break;循环语句循环语句的作用是反复执行一段代码,直到不满足循环条件为止。JaVa语言提供3种循环语句,分别是for语句、WhiIe语句和do语句。首先看for循环for语句的语法格式是:for(初始语句;条件表达式;迭代语句)循环体语句;* 初始语句和迭代语句中可以含有多
10、个语句,各语句间以逗号分隔,for语句括号内的3个部分都是可选的,条件表达式为空时,默认规定为恒真。for语句的语义是:先执行初始语句,判断条件表达式的值,当条件表达式为真时,执行循环体语句,再执行迭代语句,然后去判别条件表达式的值。for语句实例publicstaticvoidmain(Stringargs)for(inti=l;i=10;i+).printin(i);)该程序总共执行10,每次输出i的值,当i=ll时,循环条件为假,循环结束,如果条件表达式的值永远为真,则循环会无限制地执行下去,直到系统资源耗尽为止。while语句当程序中不能明确地指明循环的执行次数时,可以仅用条件表达式来
11、决定循环的执行与否。这样的循环可用While语句来实现。publicstaticvoidmain(Stringargs)inta=l;intb=2;初始化部分while(ab)ab为循环条件a=a+2;/循环体).printin(a+b);)* 如果ab);.printin(a+b);* 不论条件是否成立,do中的循环体都会运行一次。跳转语句标号可以放在任意语句之前,通常与for、While或do语句配合使用,其语法格式为:标号:语句;跳转语句breakbreak语句可用于3类语句中,第一类是在SWitCh语句中,第二类是在for、WhiIe及do等循环语句中,第三类是在语句块中。在SWitC
12、h语句及循环语句中,break的语义是跳过本块中余下的所有语句。可以和标号一起使用。publicstaticvoidmain(Stringargs)for(inti=l:i=10;i+)if(i=3)break;如果i等于3跳出循环.println(i);)* 如果是多层循环,break就终止当前循环以及包括的循环。break例题publicstaticvoidmain(Stringargs)inti,j=0,k=0,h;Iabelkfor(i=0;i100;i+,j+=2)label2:label3:switch(i%2)case1:h=1;break;default:h=0;break;i
13、f(i=50)breakIabell;.println(i+i);)continue在循环语句中,continue语句可以立即结束当次循环,开始执行下一次循环,当然执行前要先判断循环条件是否满足。ContinUe语句也可以和标号一起使用,其语法格式为:continue标号;publicstaticvoidmain(Stringargs)for(inti=l;i=10;i+)if(i=3)ContinUc;如果i等于3跳过当前循环.println(i);)continue例题out:for(inti=0;i10;i+)for(intj=0;ji).println();continueout;.p
14、rint(*);)第02讲输入/检出及处理异常03输入/输出输入-SCanner类程序运行期间交互式地读入用户的输入并将计算结果返回给用户是一个基本要求。SCanner类属于java.UtiI包.它提供了许多方法,可用来方便地读入不同类型的输入值。比如从键盘输入、从文件中输入等。要调用SCanner类的方法,必须先创建一个对象。JaVa中的对象使用new运算符来创建。下面的语句创建了一个SCanner类对象,它读入键盘输入:Scannerscan=newScanner(System,in);创建了一个变量SCan,它代表一个SCannCr对象。对象本身由new运算符来创建,并调用构造方法来建立
15、对象。SCanner类的构造方法接收一个参数,这个参数代表了输入源。System.in对象代表标准输入流,默认是指键盘。SCarmer对象用空白(空格、水平制表符及回车换行符)作为输入的分隔元素。这些空白称为分隔符。也可以指定用其他的符号作为分隔符。SCanner类的next()方法读入下一个输入对象,将它作为字符串返回。如果输入的是一串用空白分开的多个字,则每次调用nextO时都会得到下一个字。IiextLine()方法读入当前行的所有输入,直到行尾,然后作为字符串返回。输入示例publicstaticvoidmain(Stringargs)Stringmessage;SCannerSCan
16、=newSCanner();/创建从键盘输入的对象.printinCEnteralineoftext:);message=ineO;从键盘读入一行.printin(Youentered:+message);)读入数值数据示例publicstaticvoidmain(Stringargs)intage;doubleweight,height,bmi;Scannerscan=newScanner();/创建从键盘输入的对象.print(请输入您的年龄;age=nt();从键盘读入一个int型数据.print(请输入您的体重(公斤):“);weight=ouble();/从键盘读入一个double型
17、数据.print(请输入您的身高(米):”);height=scan.nextDouble();bmi=weight/(height*height);.printin(BMI:+bmi);数字处理类上述程序输出的结果中可能包含了多位小数(比如15位),而实际上并不需要这么多位小数(比如最多2位就可以了)。为此,可以使用Java提供的格式化输出功能,比如DeCimaIFOrInat类和NumberFormat类。使用这些类,可使打印或显示的信息看起来比较美观。DeCinIaIFOnnal类和NumberFormat类属于JaVa标准类库,定义在java,text包中。NumbcrFormatpu
18、blicstaticvoidmain(Stringargs)DoublemyNumber=12345.;stanceO.format(myNumber);返回当前默认语言环境的默认数值格式。rrencylnstance().format(myNumber);返回当前默认语言环境的通过格式。mberlnstance().format(myNumber);返回当前默认语言环境的通过数值格式。rcentlnstance().format(myNumber);返回当前默认语言环境的百分比格式。1NumberFormatformat=Stance();XimumFractionDigits(3);设置数
19、值的小数部分允许的最大位数。XimumIntegerDigits(5);设置数值的整数部分允许的最大位数。XinmmFraCtiOnDigitS(10);设置数值的小数部分允许的最小位数。ximumIntegerDigits(0);置数值的整数部分允许的最小位数。.printin(t(myNumber);DecimalFormatintage;doubleweight,height,bmi;Scannerscan=newScanner();/创建从键盘输入的对象.print(请输入您的年龄:);age=nt();从键盘读入一个int型数据.print(请输入您的体重(公斤):“);weight
20、=scan.nextDouble();/从键盘读入一个double型数据.print(请输入您的身高(米):”);height=scan.nextDouble();bmi=weight/(height*height);DecimalFormatformat=newDecimalFormat(0.#);.printin(BMI:+t(bmi);请输入您的年龄:20请输入您的体重(公斤):45请输入您的身高(米):160BMl:0.00204处理异常什么是异常JaVa语言把程序运行中可能遇到的错误分为两类,一类是非致命性的,通过某种修正后程序还能继续执行。这类错误称作异常(EXCePtiOn)。如
21、打开一个文件时,发现文件不存在。又比如除零溢出、数组越界等。这一类的错误可以借助于程序员的处理来恢兔。另一类是致命性的,即程序遇到了非常严重的不正常状态,不能简单地恢复执行,这就是错误。比如程序运行过程中内存耗尽。实际上,异常是程序执行期间发生的不常见的情况或事件,它们的出现会中断程序的执行,而有些异常表示代码中的错误,因此异常是程序员必须要处理的。异常示例publicstaticvoidmain(Stringargs)(inti=0;只含有3个元素的数组Stringgreetings=Helloworld!/No,Imeanit!MHELLOWORLD!”;whiIe(i4)/循环执行4次,
22、i=0/1/2/3.printin(greetingsi);i+;)发生异常的代码行,i:3时,程序执行到第4次循环时会发生异常,程序先是输出了部分结果,然后报告发生了异常;ArraylndcxoutofBoundsExccption,这个异常的含义是数组下标越界,越界值是3。下一行告知发生异常的代码所在的行数。异常Console2-ZK-Control(JavaApplicationEdkjdkL3dkL6.0/5WcjwmmDc,2017lil34PlloExceptioninthread,三ainja/ya-IanCJ.Array工IldeXOUt:OfBoUnd旦豆XceDtliQn:
23、3No,Imeanix!MHEIXOWORLDIIqu.zikao.Control.nain(8Irtroijva:17)为了解决异常问题,Java提供了异常处理机制,预定义了EXCePtion类。在EXCePtion类中定义了程序产生异常的条件。有些常见的异常可以统一处理,提高了效率,代码重用率高。同时还允许程序员自己编写特殊的异常处理程序,以满足更独特的需要。处理异常在一个方法的运行过程中,如果发生了异常,称程序产生了一个异常事件,相应地生成异常对象。该对象可能由正在运行的方法生成,也可能由JVM生成。这个对象中包含了该异常必要的详细信息,包括所发生的异常事件的类型及异常发生时程序的运行状
24、态。生成的异常对象传递给JaVa运行时系统,运行时系统寻找相应的代码来处理这一异常。生成异常对象并把它提交给运行时系统的这一过程称为酗(ThroW)一个异常。JaVa运行时系统从生成对象的代码块开始进行回溯,沿方法的调用栈逐层回溯,寻找相应的处理代码,直到找到包含相应异常处理的方法为止,并把异常对象交给该方法处理。这一过程称为捕获(CatCh)。当发现并响应异常时,就是处理(HandIe)了异常。异常分类JaVa语言在所有的预设包中都定义了异常类和错误类。EXCePtiOn类是所有异常类的父类,Error类是所有错误类的父类,这两个类同时又是ThroWable类的子类。虽然异常属于不同的类,但
25、所有这些类都是标准类ThrOwabIe的后代。ThrOWabIe在JaVa类库中,不需要import语句就可以使用。异常分为以下3种: 受检异常,必须被处理。 运行时异常,不需要处理。 错误,不需要处理。受检异常受检异常(CheckedException)是程序执行期间发生的严重事件的后果。例如,如果程序从磁盘读入数据,而系统找不到含有数据的文件,将会发生受检异常。这个异常所属类的类名是FileNotFoundExceptiono发生的原因可能是用户给程序提供了一个错误的文件名。写得好的程序应该能提前预见到这个事件,并要求程序使用者再次输入文件名,以便能从中恢复正常。这个异常类的名字正好描述了
26、异常的原因。这是通常的做法,Java类库中的所有异常类,都是使用名字来描述异常原因的。例如,可能会说发生了一个IoEXCePtiOn异常。受检异常的所有类都是类EXCePtiOn的子类,EXCePtion是ThrOWable的后代。JaVa类库中的下列类表示受检异常:ClassNotFoundExceptionFileNotFoundException、IOExceptionNOSUChMethodEXCePtiOn及WriteAbortedExceptiono运行时异常运行时异常(RuntimeException)通常是程序中逻辑错误的结果。例如,数组下标越界导致Array1ndcxutfB
27、ounds异常。被0除导致ArithmCtiCEXCePtion异常。虽然可以添加代码来处理运行时异常,但一般只需要修改程序中的错误即可。运行时异常的所有类都是类RUntimeEXCePtiOn的子类,它是Exception的后代。JaVa类库中的下列类表示运行时异常:AriIhnleIiCEXCePliOn、ArraylndeXOUtOfBoUndSEXCePtior1、ClassCastExceptionEmptyStackExceptionIlIegalArgumcntExceptionIIlegalStateExceptionIndexOutOfBoundsExceptionNoSuc
28、hElementExceptionNullPointerException和UnsupportedOperatiOnExceptionO)II.if(s=null)&(s.length()O)III.if(s=null)j(s.length()=O)IV.if(s=null)II(s.length()=0)A.IB.IIIIC.II和IVD.Ill正确答案B答案解析II和IV是逻辑运算,有短路状态,所以后面的表达式不会执行,不会发生异常。填空题如果想使用其他包中的类,则需要在程序的开头使用语句。正确答案引入/import答案解析引入语句用import,参考教材P52。简答题1.try及CatC
29、h语句的作用是什么?正确答案try:执行可能会出问题的语句。CatCh:捕获异常try代码块中可能抛出的异常。2.在什么情况下执行t”语句中finally后面的代码段?在什么情况下不执行?正确答案不论是否捕获到异常,都要执行finally后面的代码,只有在try中执行了O方法,将不执行finally后面的语句。第03讲第三章课后习题程序填空题1.某人以年利率r向银行存款Hi元,一年后存款额为m*(1+r),他想知道存多少年后,存款额会达到原来的k倍。以下方法已知m、r和k,计算至少多少年后存款额大于等于m*k。publicintCalYears(doublem,doubler,intk)dou
30、blemoney;intyears=0;money二m;while(InC)neym)return:System,out.printin(f3);fl=f2;f2=f3;)程序设计题1 .设n为自然数,n!=123.Xn称为n的阶乘,并且规定0!=K试编制程序计算2!,4!,6!,8!和10!,并显示计算结果。正确答案publicstaticvoidmain(Stringargs)(计算10!的阶乘intsum=1;for(inti=l;i=10;i+)sum=sum*i;).printin(sum);2 .已知变量n,请写出使用for语句计算S=l+12+13+ln的代码。正确答案doubl
31、en=20;doublesum=0;for(doublei=1;i=n;i+)sum=sum+li;).println(sum);)4 .编写程序打印下面的图案。程序设计题for(inti=0;i4;i+)for(intk=O;ki:k+).print;)for(intj=0;j7-2*i;j+).print(*);).println();)for(inti=0;i3;i+)for(intk=0;k2-i;k+).printC);)for(intj=0J2*i+3jj).print(*);).printin();)5.编写程序打印下面的图案。正确答案JterminatedControlJa*r
32、*.publicstaticvoidmain(Stringargs)for(inti=0;i10;i+)for(intj=0;j10i;j+).print(*);).printin();)*看行数和每行个数即列数的关系此题为j=10-i6.编写程序打印乘法口诀表。publicstaticvoidmain(Stringargs)for(inti=l;i=9;i+)for(intj=l;j=i;j+).print(+j+*+i+=+i*j+);.printin();10.编写程序,读入一个三角形的三条边长,计算这个三角形的面积,并输出结果。提示:设三角形的三条边长分别是a、b、c,则计算其面积的公
33、式为s=(a+b+c)/2面积=MSF)(SY)(SY)publicstaticvoidmain(Stringargs)inta=10,b=15,c=8;doubles=0.0,m=0.0;s=(a+b+c)/2;In=(s*(s-a)*(s-b)*(s-c);.printin(m);QComoleterminAA(JavaAppIicatKXi27.71261292110203513.请编写方法intrevlnt(inta),该方法的功能是返回与十进制正整数a的数字顺序相反排列的正整数。例如已知正整数是1234,方法的返回值是4321。publicclassAApublicstaticvoidmain(Stringargs)inta=123;intb=a/1000;个位intc=a%