《第3章Java语言的流程控制课件.ppt》由会员分享,可在线阅读,更多相关《第3章Java语言的流程控制课件.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 Java语言的流程控制语言的流程控制 u 3.1【案例【案例8】星座与幸运花】星座与幸运花u 3.2【案例【案例9】求】求2!+4!+10!的值的值u 3.3【案例【案例10】解古代算术题】解古代算术题u 3.1【案例【案例8】星座与幸运花】星座与幸运花1什么是算法什么是算法对于计算机编程语言来说,算法是用于求解某个特定问题的一些指令的集合。对于计算机编程语言来说,算法是用于求解某个特定问题的一些指令的集合。具体地说,用计算机所能实现的操作或指令,来描述问题的求解过程,就得具体地说,用计算机所能实现的操作或指令,来描述问题的求解过程,就得到了这一特定问题的计算机算法。到了这一特定问
2、题的计算机算法。一般来说,所谓算法是指解决一个特定问题采用的特定的、有限的方法和步一般来说,所谓算法是指解决一个特定问题采用的特定的、有限的方法和步骤。利用计算机来解决问题需要编写程序,在编写程序前要对问题进行充分骤。利用计算机来解决问题需要编写程序,在编写程序前要对问题进行充分的分析,设计解题的步骤与方法,也就是设计算法。没有算法,编程者对要的分析,设计解题的步骤与方法,也就是设计算法。没有算法,编程者对要解决的问题就无从下手。有了算法,才有可能设计程序,最终让计算机执行解决的问题就无从下手。有了算法,才有可能设计程序,最终让计算机执行程序,完成所要求的任务。算法的好坏,决定了程序的优劣,因
3、此,算法的程序,完成所要求的任务。算法的好坏,决定了程序的优劣,因此,算法的设计是设计过程的核心任务之一。设计是设计过程的核心任务之一。一个算法的功能不仅与选用的操作命令有关,而且与这些操作命令之间的执一个算法的功能不仅与选用的操作命令有关,而且与这些操作命令之间的执行顺序有关。算法的控制结构给出了算法的执行框架,它决定了算法中各种行顺序有关。算法的控制结构给出了算法的执行框架,它决定了算法中各种操作命令的执行次序。博姆(操作命令的执行次序。博姆(Bohm)和雅可比维()和雅可比维(Jacopini)两位学者于)两位学者于1966年提出算法有年提出算法有3种控制结构:顺序结构、选择结构和循环结
4、构。这种控制结构:顺序结构、选择结构和循环结构。这3种基种基本结构都具有只有一个入口和一个出口的特点,不会出现死循环。对于本结构都具有只有一个入口和一个出口的特点,不会出现死循环。对于Java语言来说,一个程序通常可以相应地分为输入、处理和输出语言来说,一个程序通常可以相应地分为输入、处理和输出3个部分。个部分。(1)顺序结构是一种线性结构,也是设计过程中最简单、最常用的基本结构。)顺序结构是一种线性结构,也是设计过程中最简单、最常用的基本结构。顺序结构程序是把计算机要执行的各种操作命令依次排列起来。程序运行后,顺序结构程序是把计算机要执行的各种操作命令依次排列起来。程序运行后,便从左至右、从
5、上向下地顺序执行这些命令语句(在一个语句行中,从左至便从左至右、从上向下地顺序执行这些命令语句(在一个语句行中,从左至右顺序执行各条语句),直至执行完所有语句或者执行到终止程序的语句。右顺序执行各条语句),直至执行完所有语句或者执行到终止程序的语句。(2)选择结构是一种常用的控制结构,是计算机科学用来描述自然界和社会)选择结构是一种常用的控制结构,是计算机科学用来描述自然界和社会生活中分支现象的重要手段。在实际工作中,常常需要根据某个条件是否成生活中分支现象的重要手段。在实际工作中,常常需要根据某个条件是否成立,来决定下一步应做什么工作。编写程序让计算机工作,同样存在这种情立,来决定下一步应做
6、什么工作。编写程序让计算机工作,同样存在这种情况。在选择结构中,程序不再按照行号的顺序来执行各行的语句,而是根据况。在选择结构中,程序不再按照行号的顺序来执行各行的语句,而是根据给定的条件来决定选取哪条路径,执行哪些语句。选择结构的特点是在各种给定的条件来决定选取哪条路径,执行哪些语句。选择结构的特点是在各种可能的操作分支中,根据所给定的选择条件是否成立,来决定选择执行某一可能的操作分支中,根据所给定的选择条件是否成立,来决定选择执行某一分支的相应操作。并且任何情况下均有分支的相应操作。并且任何情况下均有“无论分支多少,仅选其一无论分支多少,仅选其一”的特性。的特性。在在Java语言中,可以采
7、用语言中,可以采用if语句和语句和switch语句来实现程序的选择结构。语句来实现程序的选择结构。(3)循环结构是算法中需要反复执行某组操作的命令。循环控制就是指由特)循环结构是算法中需要反复执行某组操作的命令。循环控制就是指由特定的条件决定某些语句重复执行多次的控制方式。它具有封闭型的单入单出定的条件决定某些语句重复执行多次的控制方式。它具有封闭型的单入单出性质,也就是说进入循环结构后,只要循环条件未达到结束状态,就始终执性质,也就是说进入循环结构后,只要循环条件未达到结束状态,就始终执行循环体内的操作。在行循环体内的操作。在Java语言中,可以采用语言中,可以采用while语句和语句和fo
8、r语句来实现程语句来实现程序的选择结构。序的选择结构。2算法的描述方法算法的描述方法算法有许多描述方法,例如,使用日常语言描述解决问题的步骤与方法的自算法有许多描述方法,例如,使用日常语言描述解决问题的步骤与方法的自然语言法。这种描述方法通俗易懂,但比较烦琐,且对条件转向等的描述欠然语言法。这种描述方法通俗易懂,但比较烦琐,且对条件转向等的描述欠直观。针对自然语言法描述的缺点,又产生了流程图、直观。针对自然语言法描述的缺点,又产生了流程图、N-S图和图和PAD图等方法。图等方法。下面介绍下面介绍3种在计算机算法中常用的描述方法。种在计算机算法中常用的描述方法。(1)流程图:流程图也称为框图,它
9、是用各种几何图形、流程线及文字说明)流程图:流程图也称为框图,它是用各种几何图形、流程线及文字说明来描述算法的框图。用流程图表示算法的优点是:用图形来表示流程,直观来描述算法的框图。用流程图表示算法的优点是:用图形来表示流程,直观形象,各种操作一目了然,不会产生形象,各种操作一目了然,不会产生“歧义性歧义性”,流程清晰。但缺点是:流,流程清晰。但缺点是:流程图所占面积大,而且由于允许使用流程线,使流程任意转移,容易使人弄程图所占面积大,而且由于允许使用流程线,使流程任意转移,容易使人弄不清流程的思路。表不清流程的思路。表3-1-1所示为用传统流程图描述算法时常用的符号。所示为用传统流程图描述算
10、法时常用的符号。流程图符号名 称含 义起始框用于表示程序的起始和终止数据输入输出框用于表示数据的输入和输出处理框描述基本的操作功能,例如,赋值、数学运算等表3-1-1 流程图常用符号用流程图描述程序的用流程图描述程序的3种基本结构如图种基本结构如图3-1-2所示。其中循环结构有两种形式:所示。其中循环结构有两种形式:当型循环和直到型循环。当型循环是先进行判断,再执行循环体内的操作。当型循环和直到型循环。当型循环是先进行判断,再执行循环体内的操作。直到型循环是先执行循环体内的操作,再进行判断。如果采用直到型循环结直到型循环是先执行循环体内的操作,再进行判断。如果采用直到型循环结构,则不论条件是否
11、成立,循环体内的操作都会至少被执行一次。构,则不论条件是否成立,循环体内的操作都会至少被执行一次。流程图符号名 称含 义判断框根据框中给定的条件是否满足,选择执行两条路径中的某一条路径流程线表示流程的路径和方向连接点表示两段流程图流程的连接点续上表 图3-1-2 流程图描述程序的3种基本结构下面举例说明如何使用流程图描述判断某年是否为闰年的算法。判断某年是下面举例说明如何使用流程图描述判断某年是否为闰年的算法。判断某年是否为闰年的方法是:如果某年能被否为闰年的方法是:如果某年能被4整除,但不能被整除,但不能被100整除,或者能被整除,或者能被400整除,则该年为闰年。该算法的流程图如图整除,则
12、该年为闰年。该算法的流程图如图3-1-3所示。所示。(2)N-S图:图:N-S结构化流程图的主要特点是取消了流程线,即不允许流程结构化流程图的主要特点是取消了流程线,即不允许流程任意转移,而只能从上到下顺序进行,从而使程序结构化。它规定了任意转移,而只能从上到下顺序进行,从而使程序结构化。它规定了3种基本种基本结构作为构造算法的基本单元,如图结构作为构造算法的基本单元,如图3-1-4所示。所示。图3-1-3 判断某年是否为闰年的算法流程图图3-1-4 N-S图描述程序的3种基本结构图中的图中的A和和B分别代表某些操作,例如,数据赋值、数据的输入或输出等,也分别代表某些操作,例如,数据赋值、数据
13、的输入或输出等,也可以是可以是3种基本控制结构中的某一种。顺序结构是最简单的一种结构,先执行种基本控制结构中的某一种。顺序结构是最简单的一种结构,先执行A然后再执行然后再执行B。选择结构则根据条件是否满足条件决定执行。选择结构则根据条件是否满足条件决定执行A或或B。循环结。循环结构中的构中的“直到型循环直到型循环”,是先执行一次,是先执行一次A,然后检查条件是否满足,如不满足,然后检查条件是否满足,如不满足则再执行一次则再执行一次A,直到某一次在执行完,直到某一次在执行完A后条件满足为止。循环结构中的后条件满足为止。循环结构中的“当当型循环型循环”,是先检查给定的循环条件是否满足,若满足则执行
14、,是先检查给定的循环条件是否满足,若满足则执行A,然后再检查,然后再检查一次条件是否满足,直到某一次条件不满足为止。一次条件是否满足,直到某一次条件不满足为止。N-S图的不足之处是,当算法存在着较多层嵌套的选择结构时,图中的每个选图的不足之处是,当算法存在着较多层嵌套的选择结构时,图中的每个选择结构框会越分越窄,可能难以写下所需要的操作内容。择结构框会越分越窄,可能难以写下所需要的操作内容。(3)PAD图:图:PAD是英文是英文Problem Analysis Diagram的缩写,其原意是问的缩写,其原意是问题分析图。它是近年来在软件开发中被推广使用的一种描述算法的图形方法。题分析图。它是近
15、年来在软件开发中被推广使用的一种描述算法的图形方法。它是一种二维图形,从上到下各框功能顺序执行,从左到右表示层次关系。它是一种二维图形,从上到下各框功能顺序执行,从左到右表示层次关系。这种描述算法的方法,层次清楚,逻辑关系明了,在有多次嵌套时,不易出这种描述算法的方法,层次清楚,逻辑关系明了,在有多次嵌套时,不易出错。用错。用PAD图描述程序的图描述程序的3种基本结构如图种基本结构如图3-1-5所示。所示。图3-1-5 用PAD图描述程序的3种基本结构在为具体问题设计算法时,选用何种算法描述工具并不重要,重要的是一定在为具体问题设计算法时,选用何种算法描述工具并不重要,重要的是一定要把算法描述
16、得简洁、正确,不会产生理解上的要把算法描述得简洁、正确,不会产生理解上的“歧义性歧义性”。3if语句语句if语句一共有语句一共有3种形式:种形式:if、ifelse和和ifelse ifelse,下面将通过流程图和,下面将通过流程图和实例来具体介绍。实例来具体介绍。(1)if语句形式语句形式if形式可以根据表达式的值来判断应该执行哪一条或者哪些条语句,其语句的形式可以根据表达式的值来判断应该执行哪一条或者哪些条语句,其语句的流程图如图流程图如图3-1-6所示。图中判断框内的所示。图中判断框内的“条件条件”是是if语句中的表达式,处理语句中的表达式,处理框框A是是if语句中的子语句体,处理框语句
17、中的子语句体,处理框B是是if语句下面所有的语句。语句下面所有的语句。格式:格式: 其中,其中,“表达式表达式”的值必须是布尔类型的,表达式可以是布尔类型的常量或的值必须是布尔类型的,表达式可以是布尔类型的常量或者变量、关系表达式或逻辑表达式。子语句体可以是一条语句或者多条语句,者变量、关系表达式或逻辑表达式。子语句体可以是一条语句或者多条语句,但是多条语句要用一对大括号括起来。子语句体中可以包含但是多条语句要用一对大括号括起来。子语句体中可以包含Java语言中的任语言中的任何语句。何语句。if(表达式表达式) 子语句体子语句体图3-1-6 if形式流程图功能:当程序执行到功能:当程序执行到i
18、f语句时,计算机首先计算表达式的值,如果值是语句时,计算机首先计算表达式的值,如果值是true,则执行则执行if语句中的语句中的“子语句体子语句体”,然后再执行,然后再执行if语句下面的一条语句;如果值语句下面的一条语句;如果值是是false,则不执行,则不执行if语句中的子语句体,直接执行语句中的子语句体,直接执行if语句下面的一条语句。语句下面的一条语句。举例:下面的举例:下面的if语句都是合法的。语句都是合法的。if (10*2=2*10) System.out.println(相等相等);int i=21*5;if(i=100) i+=20; System.out.println(i)
19、;int a=23*4,b=200/5,c=15*13,max;if(ab) if(ac)max=a; if(ac)max=c;if(ac)max=b; if(b=100) i=i+10; System.out.println(i);else i=i10;图3-1-8 ifelse ifelse形式流程图图中第图中第1个判断框内的个判断框内的“条件条件1”是是if语句中的表达式语句中的表达式1,第,第2个判断框内的个判断框内的“条条件件2”是是else if语句中的表达式语句中的表达式2。处理框。处理框A是是if语句中的子语句体语句中的子语句体1,处理框,处理框B是是else if语句中的子语
20、句体语句中的子语句体2,处理框,处理框C是是else语句中的子语句体,处理框语句中的子语句体,处理框D是是ifelse ifelse语句下面的语句。语句下面的语句。格式:格式:if(表达式表达式1) 子语句体子语句体1 else if(表达式表达式n) 子语句体子语句体nelse 子语句体子语句体n+1功能:当程序执行到功能:当程序执行到ifelse ifelse语句时,计算机首先计算语句时,计算机首先计算“表达式表达式1”的的值,如果值是值,如果值是true,则执行,则执行if语句中的子语句体语句中的子语句体A,然后跳过,然后跳过else if语句和语句和else语句,继续执行下面的语句语句
21、,继续执行下面的语句D。如果表达式。如果表达式1的值为的值为false,则执行,则执行else if语句。语句。如果如果else if语句中的表达式语句中的表达式2的值为的值为true,则执行,则执行else if语句中的子语句体语句中的子语句体B,然后跳过然后跳过else语句,继续执行下面的语句语句,继续执行下面的语句D。如果表达式。如果表达式2的值为的值为false,则执,则执行行else语句的字语句体语句的字语句体C,然后再继续执行下面的语句,然后再继续执行下面的语句D。在实际应用中,在实际应用中,else if语句可以多次使用,但是语句可以多次使用,但是else语句只有一个。语句只有一
22、个。举例:下面是计算运费的程序中的举例:下面是计算运费的程序中的ifelse ifelse语句部分,其中变量语句部分,其中变量weight为货品的重量。为货品的重量。if (weight=500) System.out.println(每公斤每公斤35元元);else if(weight=300) System.out.println(每公斤每公斤40元元);else if(weight=100) System.out.println(每公斤每公斤45元元);else System.out.println(每公斤每公斤50元元);4switch语句语句虽然使用虽然使用if语句可以实现多分支处理
23、,但是嵌套层数太多时,显得混乱而且容语句可以实现多分支处理,但是嵌套层数太多时,显得混乱而且容易出错。易出错。Java语句提供了语句提供了switch多分支开关语句,可以简化程序内容,使其多分支开关语句,可以简化程序内容,使其直观易于理解。直观易于理解。(1)switch语句格式:语句格式: 在使用时要注意以下几点。在使用时要注意以下几点。表达式的值必须是整型或者字符型数据,并且要与各个语句中表达式的值必须是整型或者字符型数据,并且要与各个语句中case之后的常之后的常量值类型相同。量值类型相同。switch(表达式表达式) case 常量常量1: 语句体语句体1;break; case 常量
24、常量2: 语句体语句体2;break; case 常量常量n: 语句体语句体n;break; default: 语句体语句体n+1;一个一个switch语句中,可以有任意多个语句中,可以有任意多个case语句,但是每个语句,但是每个case之后的常量值之后的常量值不能相同。不能相同。case语句中的子语句体可以是一条或者多条任意语句中的子语句体可以是一条或者多条任意Java语句。语句。一般情况下,每个一般情况下,每个case语句的最后是语句的最后是break语句,用来从整个语句,用来从整个switch语句中语句中跳出,继续执行跳出,继续执行switch语句下面的语句。如果没有使用语句下面的语句
25、。如果没有使用break语句,则继续执语句,则继续执行下面的行下面的case语句中的子语句体,直到遇到语句中的子语句体,直到遇到break语句,或者整个语句,或者整个switch语语句结束。句结束。当所有当所有case语句中的常量值都与表达式的值不同时,则执行语句中的常量值都与表达式的值不同时,则执行default语句中的语句中的子语句体,如果没有子语句体,如果没有default语句,则不执行任何内容。语句,则不执行任何内容。(2)switch语句执行顺序:当执行到语句执行顺序:当执行到switch语句时,首先计算表达式的值,语句时,首先计算表达式的值,然后依次与下面大括号中然后依次与下面大括
26、号中case语句中的常量作比较。当找到和表达式值相同语句中的常量作比较。当找到和表达式值相同的常量值后,将不再继续查找,并以此处作为进入大括号中的常量值后,将不再继续查找,并以此处作为进入大括号中case语句的子语语句的子语句体的插入点。插入点之前的子语句体不会再被执行,而插入点之后到第一句体的插入点。插入点之前的子语句体不会再被执行,而插入点之后到第一个个break语句之前的所有子语句体都会被执行。遇到语句之前的所有子语句体都会被执行。遇到break语句时,结束整个语句时,结束整个switch语句的执行,跳到其下面的语句,继续运行程序。语句的执行,跳到其下面的语句,继续运行程序。switch
27、语句执行顺序可以这样比喻:语句执行顺序可以这样比喻:switch语句中的表达式值是一把钥匙,语句中的表达式值是一把钥匙,每个每个case语句的常量值代表一个房间的门锁。只有当钥匙和门锁吻合时,才语句的常量值代表一个房间的门锁。只有当钥匙和门锁吻合时,才能打开门,进入房间。如果没有吻合的门锁,将直接进入能打开门,进入房间。如果没有吻合的门锁,将直接进入default房间。进入房间。进入某个房间后,执行房间中的命令,然后一直向下走,依次进入其后的每个房某个房间后,执行房间中的命令,然后一直向下走,依次进入其后的每个房间并执行其中的命令。直到遇到出口,也就是间并执行其中的命令。直到遇到出口,也就是b
28、reak语句,走出房间,完成整语句,走出房间,完成整个个switch语句的执行。语句的执行。从上面的描述中可以看出从上面的描述中可以看出break语句的重要性,语句的重要性,break语句的位置会影响到输语句的位置会影响到输出结果。例如,下面是某个程序的出结果。例如,下面是某个程序的switch语句部分,如果变量语句部分,如果变量i的值为的值为1,则,则会输出会输出“输入的数字是输入的数字是1”的文字,然后继续执行的文字,然后继续执行switch语句后边的语句。但语句后边的语句。但是如果是如果case 1中没有中没有break语句,则当变量语句,则当变量i的值为的值为1时,会执行时,会执行ca
29、se 1和和case 2中的打印语句,而不是只执行中的打印语句,而不是只执行case 1中的打印语句,输出结果为中的打印语句,输出结果为“输输入的数字是入的数字是1”和和“输入的数字是输入的数字是2”两行文本。两行文本。一般情况下,在编写一般情况下,在编写switch语句时,每个语句时,每个case语句的最后都会使用语句的最后都会使用break语语句。如果有句。如果有default语句,则放置在所有语句,则放置在所有case语句的最后,不需要使用语句的最后,不需要使用break语句。语句。(3)合并)合并case语句:如果不同语句:如果不同case语句中常量之后的语句体相同,则可以语句中常量之
30、后的语句体相同,则可以合并多个合并多个case语句,合并的形式如下。语句,合并的形式如下。switch (i) case 1: System.out.println(输入的数字是输入的数字是1); break; case 2: System.out.println(输入的数字是输入的数字是2); break; case 3: System.out.println(输入的数字是输入的数字是3); break; case 4: System.out.println(输入的数字是输入的数字是4); break; default: System.out.println(输入的数字无效输入的数字无效);
31、case 常量常量1: case 常量常量2: :case 常量常量n: 语句体语句体;例如,下面显示例如,下面显示2005年某个月份天数的程序中的年某个月份天数的程序中的switch语句就合并了某些语句就合并了某些case语句。因为语句。因为1、3、5、7、8、10和和12月的天数都是月的天数都是31天,天,4、6、9和和11月的天数都是月的天数都是30天,而天,而2月份为月份为28天,所以天,所以switch语句简化如下。语句简化如下。switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: Syste
32、m.out.println(31天天); break; case 4: case 6: case 9: case 11: System.out.println(30天天); break; case 2: System.out.println(28天天)u 3.2【案例【案例9】求】求2!+4!+10!的值的值1while语句语句while语句有两种形式:语句有两种形式:while和和dowhile。下面将通过流程图和实例来具体。下面将通过流程图和实例来具体介绍。介绍。(1)while循环语句的流程图:循环语句的流程图:while循环语句可以反复执行某些特定的子语循环语句可以反复执行某些特定的子
33、语句体,并根据表达式的值来判断什么时候结束循环,继续执行句体,并根据表达式的值来判断什么时候结束循环,继续执行while语句下面语句下面的语句,其语句的流程图如图的语句,其语句的流程图如图3-2-2所示。所示。图中判断框内的条件是图中判断框内的条件是while语句中的表达式,处理框语句中的表达式,处理框A是是while语句中的子语语句中的子语句体,也就是循环体。处理框句体,也就是循环体。处理框B是是while语句下面的语句。语句下面的语句。当程序执行到当程序执行到while语句时,首先计算其表达式的值,如果值是语句时,首先计算其表达式的值,如果值是true,则执行,则执行while语句中的循环
34、体语句中的循环体A,然后再次计算,然后再次计算while语句中表达式的值,如果值是语句中表达式的值,如果值是true,则再次执行,则再次执行while语句中的循环体语句中的循环体A,如此反复循环下去。当小括号中,如此反复循环下去。当小括号中表达式的值为表达式的值为false时,则不再执行时,则不再执行while语句中的循环体语句中的循环体A,而是直接执行,而是直接执行while语句下面的语句语句下面的语句B。图3-2-2 while形式流程图(2)while循环语句的格式:循环语句的格式: 其中,表达式的值必须是布尔类型的,可以是布尔类型的常量或者变量、关其中,表达式的值必须是布尔类型的,可以
35、是布尔类型的常量或者变量、关系表达式、或者逻辑表达式。循环体可以是一条或者多条语句。采用多条语系表达式、或者逻辑表达式。循环体可以是一条或者多条语句。采用多条语句时,要用大括号括起。句时,要用大括号括起。(3)功能:如果在程序执行过程中,)功能:如果在程序执行过程中,while语句中表达式的值始终为语句中表达式的值始终为true,则循环体会被无数次执行,进入到无休止的则循环体会被无数次执行,进入到无休止的“死循环死循环”状态中。这种情况在状态中。这种情况在编写程序时一定要避免。例如,表达式尽量不要使用布尔类型的常量。编写程序时一定要避免。例如,表达式尽量不要使用布尔类型的常量。如果在第一次执行
36、如果在第一次执行while语句时,表达式的值为语句时,表达式的值为false,则不执行循环体,直接,则不执行循环体,直接执行执行while语句下面的语句。语句下面的语句。在上面的程序中,在上面的程序中,“sum=sum+n;”语句中的变量语句中的变量sum又叫累加器,用来保存又叫累加器,用来保存变量变量n从从1一直累加到一直累加到200的和。一般来说,累加器的初始值为的和。一般来说,累加器的初始值为0。while (表达式表达式) 循环体循环体(4)举例:下面的程序是使用)举例:下面的程序是使用while语句求语句求1+2+199+200的和。的和。 2dowhile循环语句形式循环语句形式(
37、1)dowhile形式的流程图:形式的流程图:dowhile语句与语句与while语句很相似,它是先语句很相似,它是先执行循环体,然后再判断条件的循环语句,其语句的流程图如图执行循环体,然后再判断条件的循环语句,其语句的流程图如图3-2-3所示。所示。public class Sum public static void main(String args) int sum=0,n=1; while(n=200) sum=sum+n; /累加器累加器 n=n+1; System.out.println(1+2+199+200=+sum); 图3-2-3 dowhile形式流程图图中判断框内的条件
38、是图中判断框内的条件是dowhile语句中的表达式,处理框语句中的表达式,处理框A是是dowhile语语句中的子语句体,也就是循环体。处理框句中的子语句体,也就是循环体。处理框B是是dowhile语句下面的语句。语句下面的语句。当执行到当执行到dowhile语句时,先执行语句时,先执行dowhile语句的循环体语句的循环体A,然后判断,然后判断dowhile语句中表达式的值。如果值是语句中表达式的值。如果值是true,则再次执行循环体,则再次执行循环体A,然后再,然后再次计算表达式的值,如果其值是次计算表达式的值,如果其值是true,则继续执行循环体,则继续执行循环体A,如此反复循环下,如此反
39、复循环下去。去。当表达式的值为当表达式的值为false时,则不再执行循环体时,则不再执行循环体A,循环结束,直接执行下面的,循环结束,直接执行下面的语句语句B。(2)dowhile循环语句的格式:循环语句的格式:其中表达式的值必须是布尔类型的,可以是布尔类型的常量或者变量、关系其中表达式的值必须是布尔类型的,可以是布尔类型的常量或者变量、关系表达式或者逻辑表达式。循环体可以是一条或者多条语句。采用多条语句时,表达式或者逻辑表达式。循环体可以是一条或者多条语句。采用多条语句时,要用大括号括起。不论表达式的值是要用大括号括起。不论表达式的值是true还是还是false,循环体中的语句至少被,循环体
40、中的语句至少被执行一次。执行一次。do 循环体循环体while (表达式表达式);注意:在注意:在dowhile形式中,形式中,while(表达式)后边要有分号,而在(表达式)后边要有分号,而在while形式形式中,则不需要分号。中,则不需要分号。while语句和语句和dowhile语句没有本质的区别,在大多数情况下可以互相代替。语句没有本质的区别,在大多数情况下可以互相代替。(3)举例:下面的程序是使用)举例:下面的程序是使用do-while语句求语句求1+2+3+199+200的和。的和。public class Sum public static void main(String arg
41、s) sum=0;n=1; do sum=sum+n; n=n+1; while(n=200); System.out.println(1+2+199+200=+sum); 3for循环语句循环语句for循环语句是循环语句是Java语言中最常用、功能最强、使用最灵活的循环语句。它将语言中最常用、功能最强、使用最灵活的循环语句。它将循环语句的初始化、循环变量的增量和结束循环条件循环语句的初始化、循环变量的增量和结束循环条件3个最重要的内容,合并个最重要的内容,合并到一条到一条for语句中,简化程序,使程序更加易于理解。语句中,简化程序,使程序更加易于理解。(1)for语句的流程图:与语句的流程图
42、:与while语句类似,语句类似,for语句也可以反复执行某些特定语句也可以反复执行某些特定的子语句体,并根据表达式的值来判断什么时候结束循环,继续执行的子语句体,并根据表达式的值来判断什么时候结束循环,继续执行for语句语句下面的语句。所不同的是,下面的语句。所不同的是,for语句的形式更加简单明了,其语句的流程图如语句的形式更加简单明了,其语句的流程图如图图3-2-4所示。所示。当程序执行到当程序执行到for语句时,先给循环变量赋初值。如果在语句时,先给循环变量赋初值。如果在for语语 句之前没有声明循环变量,则该表达式可以声明循环变量并赋句之前没有声明循环变量,则该表达式可以声明循环变量
43、并赋 初值。循环变量与其他变量在使用上没有区别,只是该变量主初值。循环变量与其他变量在使用上没有区别,只是该变量主 要是用来控制要是用来控制for语句的循环次数,并且在某些情况下参与循环语句的循环次数,并且在某些情况下参与循环 体中的计算。完成初始化后,根据条件来进行判断,如果其值体中的计算。完成初始化后,根据条件来进行判断,如果其值 为为true,则执行循环体,则执行循环体A;如果其值为;如果其值为false,则跳出整个,则跳出整个for语语 句,执行其下面的语句句,执行其下面的语句B。执行完循环体。执行完循环体A后,根据增量的要求后,根据增量的要求 修改循环变量的值,然后重新根据条件来进行
44、判断,开始第二轮循环。修改循环变量的值,然后重新根据条件来进行判断,开始第二轮循环。图3-2-4 for语句流程图(2)for语句的格式:语句的格式:在图在图3-2-4中,处理框初始化循环变量是中,处理框初始化循环变量是for语句中的表达式语句中的表达式1,判断框内的条,判断框内的条件是件是for语句中的表达式语句中的表达式2,处理框增量是,处理框增量是for语句中的表达式语句中的表达式3,处理框,处理框A是是for语句中的子语句体,也就是循环体。处理框语句中的子语句体,也就是循环体。处理框B是是for语句下面的语句。语句下面的语句。循环体可以是一条或者多条语句。采用多条语句时,要用大括号括起
45、来。循环体可以是一条或者多条语句。采用多条语句时,要用大括号括起来。(3)表达式的说明:表达式)表达式的说明:表达式1是循环变量赋初值的表达式,循环体内使用的是循环变量赋初值的表达式,循环体内使用的变量也可以在此定义或者赋初值。表达式变量也可以在此定义或者赋初值。表达式1中可以并列多个表达式,但它们之中可以并列多个表达式,但它们之间要用逗号隔开。例如,在下面的间要用逗号隔开。例如,在下面的for语句的表达式语句的表达式1中,给变量中,给变量sum和和n赋初赋初值。值。for(表达式表达式1;表达式表达式2;表达式表达式3) 循环体循环体for(sum=0,n=1;n=200;n+) 循环体循环
46、体表达式表达式2必须为布尔类型的常量或者变量、关系表达式或者逻辑表达式。因为必须为布尔类型的常量或者变量、关系表达式或者逻辑表达式。因为表达式表达式2是循环结束的条件,所以编写表达式时要避免程序陷入是循环结束的条件,所以编写表达式时要避免程序陷入“死循环死循环”。当表达式的值为当表达式的值为true时,继续执行循环体;当表达式的值为时,继续执行循环体;当表达式的值为false时,结束循时,结束循环,执行环,执行for语句下面的程序内容。语句下面的程序内容。表达式表达式3一般是增量表达式,每次执行完循环体后,都要执行该表达式改变其一般是增量表达式,每次执行完循环体后,都要执行该表达式改变其中变量
47、的值。中变量的值。(4)举例:求)举例:求1+2+199+200的和可以简单的写为:的和可以简单的写为:(5)for语句与语句与while语句的互换:在大多数情况下,语句的互换:在大多数情况下,for语句与语句与while语句可语句可以互换。例如,下面的两个程序分别使用以互换。例如,下面的两个程序分别使用while语句和语句和for语句输出语句输出100以内所以内所有的奇数。有的奇数。for (int sum=0,n=1;n=200;n+) sum+=n;System.out.println(1+2+199+200=+sum);使用使用while语句的程序如下。语句的程序如下。 使用使用for
48、语句的程序如下。语句的程序如下。无论使用哪种形式,循环语句都必须具有初始化、循环变量的增量和结束循无论使用哪种形式,循环语句都必须具有初始化、循环变量的增量和结束循环条件环条件3个要素。个要素。在使用在使用for语句时,在其表达式语句时,在其表达式1中声明的任何变量,只能在该循环体中使用,中声明的任何变量,只能在该循环体中使用,不能在不能在for语句以外的任何语句中使用。如果需要在语句以外的任何语句中使用。如果需要在for循环语句之外使用该变循环语句之外使用该变量,则必须在量,则必须在for循环语句之外声明变量。循环语句之外声明变量。public class Exp1 public stati
49、c void main(String args) int n=1; while(n=100) System.out.print(n+); n=n+2; public class Exp2 public static void main(String args) for(int n=1;n=100;n=n+2) System.out.print(n+); 4for语句的特殊形式语句的特殊形式除了上面介绍的除了上面介绍的for语句的标准形式外,语句的标准形式外,for语句还具有一些特殊的形式。语句还具有一些特殊的形式。(1)空循环体:)空循环体:for语句可以没有循环体,也就是说循环过程什么都不执
50、行,语句可以没有循环体,也就是说循环过程什么都不执行,仅仅产生一个时间延迟的效果,其格式为:仅仅产生一个时间延迟的效果,其格式为:例如,下面的语句只会执行例如,下面的语句只会执行80 000次对表达式次对表达式n100 000的判断和的判断和“n+;”语语句。句。(2)减量表达式:)减量表达式:for语句中的表达式语句中的表达式3不仅可以是增量表达式,还可以是减不仅可以是增量表达式,还可以是减量表达式,也就是说循环变量的值不仅可以由小到大,还可以由大到小。例量表达式,也就是说循环变量的值不仅可以由小到大,还可以由大到小。例如,下面的程序是用来如,下面的程序是用来 输出从输出从991的所有奇数。