版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第四章第四章 J Javaava循环语句循环语句 学习目标学习目标 使用使用while循环编写循环编写“重复执行某些语句重复执行某些语句”的程序的程序 实训一:实训一:编写程序编写程序GuessNumber 遵循循环设计策略来开发循环遵循循环设计策略来开发循环 实训二:实训二:编写程序编写程序SubstractionQuizLoop 使用标志值控制循环使用标志值控制循环 使用输入重定向以获取大量输入数据使用输入重定向以获取大量输入数据 使用使用do-while语句编写循环语句编写循环 使用使用使用使用for语句编写循环语句编写循环 了解三种类型循环语句的相似处和不同点了解三种类型循环语句的
2、相似处和不同点 编写嵌套循环编写嵌套循环 从多种例子中学习循环从多种例子中学习循环 使用使用break和和continue来实现程序的控制来实现程序的控制 使用使用确定对话框确定对话框 控制循环控制循环 2 4 4.1 .1 引言引言 如果你想打印一个字符串如果你想打印一个字符串 “Welcome to Java!” 100次,就次,就 需要把下面的语句重复写上需要把下面的语句重复写上100100遍!遍! System.out.println(Welcome to Java!); System.out.println(Welcome to Java!); . System.out.printl
3、n(Welcome to Java!); Java提供了一种称为提供了一种称为循环循环 的结构的结构, , 用来控制一个语句块重复用来控制一个语句块重复 执行的次数。下面的代码就是使用执行的次数。下面的代码就是使用循环语句循环语句 来告诉计算机打印上面来告诉计算机打印上面 这个字符串这个字符串100100次:次: int count = 0; while( count 100 ) System.out.println(Welcome to Java!); count+; 其中的语句其中的语句 将被重复执将被重复执 行行100100遍遍 ! 3 4 4. .2 2 whilewhile循环循环
4、while语句的语法格式是:语句的语法格式是: while ( 布尔表达式布尔表达式 ) 语句块语句块 /“循环体循环体” while语句的执行流程如图语句的执行流程如图4-1所示所示。 循环结构中包含的语句块称为循环结构中包含的语句块称为 循环体循环体( (即需要重复执行的操作序列即需要重复执行的操作序列);); 循环体的每一次执行称为循环体的每一次执行称为一次循环迭代一次循环迭代; 每个循环结构都需要一个循环的继续条件,每个循环结构都需要一个循环的继续条件, 它是一个布尔表达式;它是一个布尔表达式; 每次循环迭代前,总是先计算这个每次循环迭代前,总是先计算这个 循环继续条件以决定是否执行循
5、环体。循环继续条件以决定是否执行循环体。 若为若为true,则执行循环体;否则,终止整个循环并将程序的控制,则执行循环体;否则,终止整个循环并将程序的控制 转移到转移到while语句之后的下一条语句。语句之后的下一条语句。 图图4 4-1-1 while语句的流程说明语句的流程说明 true false 布尔表达布尔表达 式式 语句块语句块 下一条语句下一条语句 4 图图4 4- -2 2 打印字符串打印字符串100100次的流程说明次的流程说明 true false count100 System.out.println(Welcome to Java); count+; 下一条语句下一条语
6、句 count=0 提示提示 当事先确切知当事先确切知 道循环次数时,可道循环次数时,可 以使用一个变量(以使用一个变量( 例如,例如,count)来)来 对执行次数进行计对执行次数进行计 数。这种类型的循数。这种类型的循 环称为环称为“计数器控计数器控 制的循环制的循环”。 5 下面是另外一个例子,有助于理解循环是如何工作的:下面是另外一个例子,有助于理解循环是如何工作的: int sum = 0 , i = 1; while ( i 100 ) sum = sum + i; i+; System.out.println( sum = + sum ); 如果循环被错误的写成如下所示,那会出现
7、什么情况?如果循环被错误的写成如下所示,那会出现什么情况? int sum = 0 , i = 1; while ( i 100 ) sum = sum + i; System.out.println( sum = + sum ); 警告警告 必须确保循环条件最终可以变为必须确保循环条件最终可以变为 false,以便循环能够结束。一个常见,以便循环能够结束。一个常见 的循环设计错误是无限循环(也叫做的循环设计错误是无限循环(也叫做 “死循环死循环”)。也就是说,由于循环)。也就是说,由于循环 条件的不当而使循环永远不可能结束。条件的不当而使循环永远不可能结束。 其中变量其中变量sum 被称为被
8、称为“累加器累加器” 每次的重复都是从每次的重复都是从 旧值的基础上旧值的基础上“迭代迭代” 出新值,并由新值替出新值,并由新值替 代旧值。代旧值。 6 另外,程序员经常会犯的错误,就是使循环多迭代一次或另外,程序员经常会犯的错误,就是使循环多迭代一次或 少迭代一次,这种情况称为少迭代一次,这种情况称为“出一错误出一错误 ”(off-by one error)。 例如,下面的循环会将字符串例如,下面的循环会将字符串 “Welcome to Java!” 打印打印101101次次: int count = 0; while ( count = 100 ) System.out.println(
9、Welcome to Java! ); count+; 这个错误出在什么地方呢?这个错误出在什么地方呢? 7 注意注意 1 1)只有当循环体内只包含一条语句或不包含语句时,循环体的花)只有当循环体内只包含一条语句或不包含语句时,循环体的花 括号括号 才可以省略;才可以省略; 2 2)当循环体不包含语句时,必须留一个分号)当循环体不包含语句时,必须留一个分号“ “ ;”,以表示,以表示“空空 操作操作”或叫做或叫做“空语句空语句”。 System.out.print( 开始计时开始计时 . ); final int GAP = 10; long startTime = System.curren
10、tTimeMillis()/1000; while( (System.currentTimeMillis()/1000- -startTime) GAP ) ; System.out.println( GAP + 秒钟时间到!秒钟时间到! ); int i = 0; while( i number ) System.out.println(你的猜测大了!你的猜测大了! ); else System.out.println(你的猜测小了你的猜测小了! ); while ( true ) while ( guess != number ) 虽然这个循环可以虽然这个循环可以 重复提示用户输入猜测重复
11、提示用户输入猜测 数并进行比较,但是它数并进行比较,但是它 永远都不会结束!正确永远都不会结束!正确 的做法应该是当的做法应该是当guess 与与number匹配时,该匹配时,该 循环就应该结束。所以循环就应该结束。所以 应该改写循环继续条件应该改写循环继续条件. . 11 下面给出该程序的完整代码:下面给出该程序的完整代码: /源程序清单源程序清单4-1 GuessNumber.java import java.util.Scanner; public class GuessNumber public static void main(String args) int number = (i
12、nt)( Math.random() * 101 ); Scanner input = new Scanner (System.in); System.out.println( 请你猜一个请你猜一个 0 100 的魔数的魔数 ); int guess = -1; / 初始化初始化 guess while ( guess != number ) System.out.print( 请你输入一个猜测数请你输入一个猜测数: ); guess = input.nextInt(); if ( guess = number ) System.out.println( 恭喜你猜对了!这个数是恭喜你猜对了!这
13、个数是 + number ); else if ( guess number ) System.out.println(你的猜测大了你的猜测大了! ); else System.out.println(你的猜测小了你的猜测小了! ); / 循环结束循环结束 注意注意 这里的这里的guess必须必须 进行初始化,否则会出进行初始化,否则会出 现编译错误。这里将它现编译错误。这里将它 初始化为初始化为-1-1。将它初始。将它初始 化为化为0100之间的数,之间的数, 就会影响程序的正确性。就会影响程序的正确性。 因为,它很可能就是要因为,它很可能就是要 猜测的数。猜测的数。 12 4.2.2 循环
14、设计策略循环设计策略 编写循环时,应该考虑如下四个步骤:编写循环时,应该考虑如下四个步骤: i) 确定需要重复执行的语句;确定需要重复执行的语句; ii) 将这些语句放在一个循环中。将这些语句放在一个循环中。 iii)编写循环条件,并为控制循环添加适当的语句。编写循环条件,并为控制循环添加适当的语句。 int count = 0; while ( ) System.out.println( Welcome to Java! ); count+; iv)为循环变量为循环变量( (如如, ,count) )选择适当的初始值。以免选择适当的初始值。以免“出一错误出一错误”。 count 100 in
15、t sum = 0 , i = 1; while( ) sum = sum + i; i+; / sum=1+2+.+99 累加器变量累加器变量 sum初始化初始化 i 100 循环控制循环控制 变量变量i初始化初始化 13 4.2.3 实例:高级数学学习工具实例:高级数学学习工具 程序清单程序清单3-43-4中的数学减法学习工具只能产生一道题目。中的数学减法学习工具只能产生一道题目。 现在我们使用循环来重复产生题目。如何编写能产生现在我们使用循环来重复产生题目。如何编写能产生5 5道题目道题目 的代码呢?的代码呢? 遵循循环设计策略:遵循循环设计策略: i) 确定需要重复的语句:确定需要重复
16、的语句: 获取两个随机数,提示用户对两数做减法,然后打分;获取两个随机数,提示用户对两数做减法,然后打分; ii) 将这些语句放入一个循环里。将这些语句放入一个循环里。 iii)增加一个循环变量和循环条件,并为控制循环添加适当的语句。增加一个循环变量和循环条件,并为控制循环添加适当的语句。 下面的程序清单下面的程序清单4-2 4-2 给出的程序可以产生给出的程序可以产生5 5道题目,在学生道题目,在学生 回答完所有回答完所有5 5道题目后,报告回答正确的题数。这个程序最后还道题目后,报告回答正确的题数。这个程序最后还 显示该测试所花的时间,并列出所有题目的回答情况。显示该测试所花的时间,并列出
17、所有题目的回答情况。 14 /源程序清单源程序清单4-2 SubstractionQuizLoop.java import java.util.Scanner; public class SubstractionQuizLoop public static void main(String args) final int NUMBER_OF_QUESTIONS = 5; /声明问题数量声明问题数量 int correctCount =0; /“回答正确回答正确”计数器初始化计数器初始化 int count =0; /“问题数量问题数量”计数器初始化计数器初始化 long startTime =
18、 System.currentTimeMillis(); /开始时间开始时间 String output = ; / “回答问题的情况汇总回答问题的情况汇总”字符串初始化字符串初始化 Scanner input = new Scanner (System.in); while ( count NUMBER_OF_QUESTIONS ) int number1 = (int)(Math.random()*10); int number2 = (int)(Math.random()*10); /确保确保number1不小于不小于number2 if ( number1 1e-6 ) sum +=
19、item; item = item - 0.1; System.out.println( 它们的和是它们的和是: + sum ); 21 另外,如果想要判断两个浮点数另外,如果想要判断两个浮点数x1x1、x2x2是否相等,是否相等, 那么,你就应该使用下面的方法来解决:那么,你就应该使用下面的方法来解决: while ( Math.abs( x1 - x2 ) 1e-6 ) . 而不能使用下面的代码:而不能使用下面的代码: while ( x1 = x2 ) . 22 *4.2.5 输入输出重定向输入输出重定向 如果你想避免在程序运行过程中输入大量的数据,可以将这些数据用空格如果你想避免在程序
20、运行过程中输入大量的数据,可以将这些数据用空格 隔开,保存在一个文本文件(例如,隔开,保存在一个文本文件(例如,input.txt)中,然后使用下面这个命令来)中,然后使用下面这个命令来 运行这个程序:运行这个程序: java SentinelValue output.txt 可以同一命令中同时使用输入输出重定向。例如,下面的命令会从文件可以同一命令中同时使用输入输出重定向。例如,下面的命令会从文件 input.txt中读取数据,并将输出结果发送到文件中读取数据,并将输出结果发送到文件output.txt中:中: java SentinelValue output.txt 请使用这个命令来运行
21、这个程序,查看一下请使用这个命令来运行这个程序,查看一下output.txt 中的内容是什么。中的内容是什么。 23 4 4. .3 3 do-whiledo-while循环循环 do-while语句是语句是while语句的变体。其语法格式是:语句的变体。其语法格式是: do 语句块语句块 while ( ( 布尔表达式布尔表达式 ) ); 它的执行流程如图它的执行流程如图4-34-3所示:所示: 首先执行循环体;首先执行循环体; 然后计算并判断循环条件:然后计算并判断循环条件: 如果为如果为true,则重复执行循环体;,则重复执行循环体; 否则,终止循环,转去执行下一条语句。否则,终止循环,
22、转去执行下一条语句。 do-while语句与语句与while语句的差别在于:语句的差别在于: 判断循环条件和执行循环体的顺序不同。判断循环条件和执行循环体的顺序不同。 图图4-3 do-while流程说明流程说明 下一条语句下一条语句 true false 布尔表达式布尔表达式 语句块语句块 24 do-while 语句和语句和 while 语句具有相同的表达能力。有时候,语句具有相同的表达能力。有时候, 选择其中一个会比另一个更方便。例如,可以使用选择其中一个会比另一个更方便。例如,可以使用do-while循环循环 来改写程序清单来改写程序清单4-34-3中的中的while循环。如下面的程序
23、清单循环。如下面的程序清单4-44-4所示。所示。 /源程序清单源程序清单4-4 TestDoWhile.java import java.util.Scanner; public class TestDoWhile /读取并计算个数不确定的整数之和。读取并计算个数不确定的整数之和。 public static void main(String args) Scanner input = new Scanner (System.in); int data, sum = 0; do /提示用户输入提示用户输入 System.out.print( 请输入一个整数请输入一个整数(0表示输入结束表示输
24、入结束):); data = input.nextInt(); sum += data; while( data != 0 ); System.out.println( 它们的和是它们的和是: + sum ); 25 提示提示 如果循环中的语句至少需要执行一次,那么,如果循环中的语句至少需要执行一次,那么, 建议使用建议使用do-while循环。因为,如果使用循环。因为,如果使用while循循 环,这些语句就必须在循环前和循环内都出现。环,这些语句就必须在循环前和循环内都出现。 (请对照程序清单(请对照程序清单4-34-3和程序清单和程序清单4-44-4) 26 do-while语句应用举例语
25、句应用举例 求解求解 利用牛顿迭代法求平方根的迭代公式为:利用牛顿迭代法求平方根的迭代公式为: ax 当当 | xn+1 xn | 时,时,xn+1 即为解的近似值。即为解的近似值。 (提示:(提示:x0 可以是任意猜测值。为方便起见,可以取可以是任意猜测值。为方便起见,可以取 a 的值。)的值。) 算法描述如下:算法描述如下: (i)x0=a; (ii)x1=x0; (iii)x0=(x1+a/x1)/2; (iv) | x0 x1 | 1E - 8 ) ; System.out.println( a + 的平方根是:的平方根是: + x0 ); (i)x0 = a; (ii)x1 = x0
26、; (iii)x0 = ( x1 + a / x1 ) / 2; (iv) | x0 x1 | 10-6 ?是,转至?是,转至 (v); 否则转至否则转至 (ii); (v)x0(或(或 x1)就是最后的解)就是最后的解。 28 “迭代法迭代法”也叫做也叫做“递推法递推法”,其基本思想是:,其基本思想是: 把一个复杂的计算过程转化为简单过程的多次重复,把一个复杂的计算过程转化为简单过程的多次重复, 每次重复都从旧值的基础上递推出新值,并由新值替每次重复都从旧值的基础上递推出新值,并由新值替 代旧值。代旧值。(最简单的例子就是(最简单的例子就是“累加器累加器”) 29 4 4. .4 4 for
27、for循环循环 经常会用到下面的通用形式来编写循环:经常会用到下面的通用形式来编写循环: i = 初值初值; while ( i 终值终值 ) . / 循环体循环体 i+; / 循环变量加循环变量加1 1 可以使用可以使用for语句来简化这个循环:语句来简化这个循环: for ( i = 初值初值 ; i 终值终值 ; i+ ) . / 循环体循环体 for语句的语法格式如下所示:语句的语法格式如下所示: for ( 初始操作初始操作 ; 循环条件循环条件 ; 每次迭代后的操作每次迭代后的操作 ) . / 循环体循环体 它的执行流程如右边图所示。它的执行流程如右边图所示。 true false
28、 循环条件循环条件 语句块语句块 下一条语句下一条语句 初始操作初始操作 每次迭代后的操作每次迭代后的操作 30 例如,下面的例如,下面的for循环打印字符串循环打印字符串100100次次: int i; for ( i = 0 ; i 100 ; i+ ) System.out.print( Hello! ); 其流程图如右图所示。其流程图如右图所示。 循环控制变量可以在循环控制变量可以在for语句中声明语句中声明 和初始化:和初始化: for ( int i = 0 ; i 100 ; i+ ) System.out.print( Hello! ); 如果像这个例子一样,循环体只有一条如果
29、像这个例子一样,循环体只有一条 语句,那么,花括号也是可以省略的。语句,那么,花括号也是可以省略的。 true false i 100 Hello! i = 0 i+ 提示提示 如果循环控制变量只在如果循环控制变量只在forfor循环内使用而不在循环内使用而不在 其他地方使用,那么,在其他地方使用,那么,在forfor语句内声明它是一个语句内声明它是一个 很好的习惯。但是,在循环外就不能使用它了。很好的习惯。但是,在循环外就不能使用它了。 因为,它的作用范围被限制于该因为,它的作用范围被限制于该forfor语句范围内!语句范围内! 31 又例如:求又例如:求1+2+100。 /SumWithF
30、or.java public class SumWithFor public static void main(String args) int sum=0; for ( int i=1; i=100; i+ ) sum+=i; System.out.println(1+2+100=+ sum ); true false i 100 sum += i i = 0 i+ sum = 0 32 在在String类类中,方法中,方法 charAt(i) 用用于返回字符串中第于返回字符串中第i个字符;个字符; 而方法而方法 length() 则用则用于返回字符串的长度。于返回字符串的长度。 下面是它们
31、的使用示例:下面是它们的使用示例: String line = input.nextLine(); int lengthOfline = line.length(); System.out.println( 该行字符的长度为该行字符的长度为: + lengthOfline ); System.out.println(第第 + 0 + 个字符是个字符是: + line.charAt(0) ); System.out.println(第第 + 1 + 个字符是个字符是: + line.charAt(1) ); System.out.println(第第 + 5 + 个字符是个字符是: + line
32、.charAt(5) ); 下面我们来编写一个用来统计从键盘输入的一行字符中英文字下面我们来编写一个用来统计从键盘输入的一行字符中英文字 母和数字字符的个数。母和数字字符的个数。 33 import java.util.Scanner; public class CharactersCount public static void main(String args) Scanner input = new Scanner (System.in); int letterCounter = 0, digitCounter = 0; char ch; System.out.print( 请输入一行字
33、符(回车结束)请输入一行字符(回车结束):); String line = input.nextLine(); int lengthOfline = line.length(); for( int i = 0; i = A System.out.println(该行字符的长度为:该行字符的长度为:+lengthOfline); System.out.println( 其中,英文字母的个数为其中,英文字母的个数为: + letterCounter); System.out.println( 其中,数字字符的个数为其中,数字字符的个数为: + digitCounter); 34 注意注意 for循
34、环中的循环中的初始操作初始操作 以及以及每次迭代后的操作每次迭代后的操作,都可以是用,都可以是用 0 0个或多个用个或多个用逗号逗号 隔开的表达式。例如:隔开的表达式。例如: for ( i = 0, j = 0 ; ( i + j 10 ); i+, j+ ) . 例子:判断一个键盘输入的字符串是否回文例子:判断一个键盘输入的字符串是否回文. String word = input.nextLine(); int lengthOfword = word .length(); for( i = 0, j = lengthOfword -1; i j; i+, j- ) if ( word .c
35、harAt( i ) != word .charAt( j ) ) break; if ( i j ) System.out.println( 该字符串不是回文该字符串不是回文! ); else System.out.println( 该字符串是回文该字符串是回文。 ); 35 public static boolean isPalindrome(String str) /判断判断str是否为回文字符串是否为回文字符串 int len = str.length(); /返回字符串长度返回字符串长度 for (int index = 0; index len / 2 - 1; index+) i
36、f (str.charAt(index) != str.charAt(len - index - 1) /对称的两个字符比较对称的两个字符比较 return false; return true; 36 注意注意 如果如果省略省略 for循环中的循环中的循环条件循环条件,则被默认为是,则被默认为是true。因此。因此 下面的语句是等价的:下面的语句是等价的: for ( ; ; ) . 等价与等价与 for ( ; true ; ) . 及及 while ( true ) . 37 4 4. .5 5 采用哪种循环采用哪种循环 while循环和循环和for循环称为循环称为预测试循环预测试循环,
37、因为循环条件是在循环,因为循环条件是在循环 体执行前被测试的,而体执行前被测试的,而do-while循环则称为循环则称为后测试循环后测试循环,因为其循,因为其循 环条件是在循环体执行后测试的。环条件是在循环体执行后测试的。 while循环总是可以转化为循环总是可以转化为for循环。如下所示:循环。如下所示: while ( 循环条件循环条件 ) / . for ( ; 循环条件循环条件; ) / 循环体循环体 . 38 除某种特殊情况外,除某种特殊情况外,for循环通常也都能转化为循环通常也都能转化为while循环:循环: for ( 初始操作初始操作 ; 循环条件循环条件 ; 每次迭代后的操
38、作每次迭代后的操作 ) / 循环体循环体 . 初始操作初始操作 ; while( 循环条件循环条件 ) / 循环体循环体 . 每次迭代后的操作每次迭代后的操作; 建议使用自己觉得最自然、最舒服的一种循环语句。通常,如果建议使用自己觉得最自然、最舒服的一种循环语句。通常,如果 已经提前知道重复次数,那就使用已经提前知道重复次数,那就使用for循环循环( (就像打印字符串就像打印字符串100100次次) )。 如果无法确定重复次数,就使用如果无法确定重复次数,就使用while循环(就像读入一些数直到读循环(就像读入一些数直到读 入入0 0为止)。如果在检验循环条件前需要执行循环体,那就使用为止)。
39、如果在检验循环条件前需要执行循环体,那就使用do- while循环。循环。 39 警告警告 在在for子句(或者子句(或者while)和循环体之间多写分号是一个常)和循环体之间多写分号是一个常 见的错误。因为,这都将表示循环体是见的错误。因为,这都将表示循环体是空语句块空语句块。如下所示:。如下所示: for ( . ; . ; . ) ;for ( . ; . ; . ) ; . . 或者或者 while( . ) ;while( . ) ; . . 使用使用行尾块风格行尾块风格 是避免这种错误的最好办法:是避免这种错误的最好办法: for ( . ; . ; . ) while( . )
40、. . 40 但是,在但是,在do-while循环中,却需要用分号来结束循环循环中,却需要用分号来结束循环: do . while (.) ; 41 4 4. .6 6 嵌套循环嵌套循环 在一个循环语句(在一个循环语句(while循环、循环、for循环、循环、do-while循环)内又循环)内又 包含另一个循环语句(包含另一个循环语句(while循环、循环、for循环、循环、do-while循环)称为循环)称为 循环语句嵌套循环语句嵌套。并且三种循环语句可以相互嵌套。并且三种循环语句可以相互嵌套。 程序清单程序清单4-54-5是使用嵌套是使用嵌套for循环打印一个乘法表的程序。其运循环打印一个
41、乘法表的程序。其运 行示例如下图。行示例如下图。 42 /源程序清单源程序清单4-5 MultiplicationTable.java import java.util.Scanner; public class MultiplicationTable public static void main(String args) System.out.println( n 乘乘 法法 表表n ); System.out.print( ); for ( int i = 1 ; i = 9 ; i+ ) System.out.print( + i ); System.out.println( n- )
42、; for ( int i = 1 ; i = 9 ; i+ ) System.out.print( i + | ); for ( int j = 1 ; j = 9 ; j+ ) System.out.printf( %4d, i * j ); System.out.println( ); 提示提示 循环嵌套中的内、外层循环嵌套中的内、外层 循环控制变量循环控制变量( (例如,例如,i、j) )不不 能同名。它们的意义以及它能同名。它们的意义以及它 们之间的关系,好比手表的们之间的关系,好比手表的 时针、分针和秒针:时针、分针和秒针: 时针走一格,分针走一圈;时针走一格,分针走一圈; 分针走
43、一格,秒针走一圈。分针走一格,秒针走一圈。 43 程序清单程序清单4-6是使用嵌套是使用嵌套for循环打印右边图案的程序。循环打印右边图案的程序。 /源程序清单源程序清单4-6 DigitalPattern.java import java.util.Scanner; public class DigitalPattern public static void main(String args) for( int i=1; i=6; i+ ) for( int j=1; j=i; j+ ) System.out.print( j + ); System.out.println( ); 1 1
44、1 21 2 1 2 3 1 2 3 1 2 3 41 2 3 4 1 2 3 4 51 2 3 4 5 1 2 3 4 5 61 2 3 4 5 6 1 2 3 4 5 61 2 3 4 5 6 1 2 3 4 51 2 3 4 5 1 2 3 41 2 3 4 1 2 3 1 2 3 1 2 1 2 1 1 44 程序清单程序清单4-6-1是使用嵌套是使用嵌套while循环打印上述图案的程序循环打印上述图案的程序。 /源程序清单源程序清单4-6-2 DigitalPattern2.java import java.util.Scanner; public class DigitalPatt
45、ern2 public static void main(String args) int i = 1, j; while ( i = 6 ) j = 1; while ( j = i ) System.out.print( j + ); j+; System.out.println( ); i+; 显然,对于计数型循环,显然,对于计数型循环, for语句更胜于语句更胜于while语句。语句。 45 4 4. .7 7 实例学习实例学习 循环语句是程序设计的基础,编写循环语句的能力对于学习程循环语句是程序设计的基础,编写循环语句的能力对于学习程 序设计是非常必要的、也是非常重要的。序设计是非常
46、必要的、也是非常重要的。 如果能够使用循环编写程序,你就懂得如何编程了!如果能够使用循环编写程序,你就懂得如何编程了! 正是由于这个原因,本节将提供三个实例,学习如何使用循环正是由于这个原因,本节将提供三个实例,学习如何使用循环 来解决问题。来解决问题。 值得再次提醒的是:值得再次提醒的是: 在编写解决问题的程序之前,不要立即就开始写代码,应该首在编写解决问题的程序之前,不要立即就开始写代码,应该首 先考虑一下在不涉及怎样编写代码的情况下,如何手工解决它的逻先考虑一下在不涉及怎样编写代码的情况下,如何手工解决它的逻 辑方案。一旦有了一个逻辑方案,再将它翻译成辑方案。一旦有了一个逻辑方案,再将它
47、翻译成Java语言的代码。语言的代码。 (当然,翻译方式不是唯一的。例如,可以选择使用(当然,翻译方式不是唯一的。例如,可以选择使用for语句,也可语句,也可 以选择以选择while语句。)语句。) 46 4.7.1 求最大公约数求最大公约数 其算法可以描述如下:其算法可以描述如下: (i) 输入两个整数输入两个整数 n1、n2。 (ii)(由于(由于1 1可能不是它们的最大公约数,所以可以检测可能不是它们的最大公约数,所以可以检测 2 2、3 3、4 4 . n1及及n2的整数)取的整数)取 k=2; (iii)当当k是是 n1及及n2的整数时,重复执行下面两步操作:的整数时,重复执行下面两
48、步操作: i)k 是是 n1、n2 的最大公约数吗?的最大公约数吗? 如果是的,则最大公约数如果是的,则最大公约数gcd就是就是k;(;(即即 gcd = k) ii)k加加1 1; (iv)显示显示“最大公约数是最大公约数是”gcd。 上面算法中的上面算法中的(ii)、()、(iii)可以翻译成下面的代码:可以翻译成下面的代码: 提示提示 一个问题常常有多种解决方案。最大公约数问题就有许多解一个问题常常有多种解决方案。最大公约数问题就有许多解 决方案。一个更有效的解决方案是使用经典的决方案。一个更有效的解决方案是使用经典的“欧几里得欧几里得”算法算法 (见习题)。(见习题)。 47 上面算法
49、中的上面算法中的(ii)、()、(iii)可以翻译成下面的代码:可以翻译成下面的代码: int gcd = 1; /假定最大公约数为假定最大公约数为1 for( int k = 2; k = n1 k+ ) if( n1 % k = 0 int gcd = 1; /假定最大公约数为假定最大公约数为1 int k = 2; while( k = n1 k+; 48 下面是这个算法的运行示例:下面是这个算法的运行示例: 49 程序清单程序清单4-74-7是完整的程序。是完整的程序。 /源程序清单源程序清单4-7 GCD.java import java.util.Scanner; import j
50、avax.swing.JOptionPane; public class GCD public static void main(Stringargs) Scanner input = new Scanner (System.in); System.out.print( 请输入第一个数请输入第一个数: ); int n1 = input.nextInt(); System.out.print( 请输入第二个数请输入第二个数: ); int n2 = input.nextInt(); int gcd = 1; for( int k = 2; k = n1 k+ ) if( n1 % k = 0
51、System.out.println( 最大公约数是最大公约数是: + gcd ); 算法说明:算法说明: 由于在本算法的循环中,由于在本算法的循环中, if 语句的作用是从每一个可语句的作用是从每一个可 能的能的k中筛选出最新的最大公中筛选出最新的最大公 约数。约数。 因此,这类循环体的算法因此,这类循环体的算法 也被称为也被称为“筛选器筛选器”算法。算法。 50 4.7.2 预测未来学费预测未来学费 假设某大学今年的学费是假设某大学今年的学费是10000美金,并以每年美金,并以每年7%的速度增加。的速度增加。 试问:多少年之后学费会翻倍?试问:多少年之后学费会翻倍? 首先考虑如何手工解决它
52、:首先考虑如何手工解决它: 第二年是第一年乘以第二年是第一年乘以1.07,. 未来的一年都是前一年乘以未来的一年都是前一年乘以1.071.07。 所以,每年的学费可以如下计算:所以,每年的学费可以如下计算: double tuition = 10000; int year = 1; tuition = tuition* *1.07; year+; tuition = tuition* *1.07; year+; tuition = tuition* *1.07; year+; . 不断地计算下去,直到学费不断地计算下去,直到学费tuition达到或者超过达到或者超过20000美金为止。美金为止
53、。 51 现在可以将这个逻辑翻译成使用循环结构实现的下面这段代码:现在可以将这个逻辑翻译成使用循环结构实现的下面这段代码: double tuition = 10000; int year = 1; while ( tuition = 20000 ) tuition = tuition * * 1.07; year+; 在本算法的循环体中,变量在本算法的循环体中,变量tuition的值也是由自身的的值也是由自身的 旧值迭代而得的。而旧值迭代而得的。而year则是一个计数器。则是一个计数器。 52 程序清单程序清单4-84-8是完整的程序。是完整的程序。 /源程序清单源程序清单4-8 Futur
54、eTuition.java public class FutureTuition public static void main(Stringargs) double tuition = 10000; int year = 1; while ( tuition = 20000 ) tuition = tuition * 1.07; year+; System.out.println( year + 后,学费将翻倍后,学费将翻倍! ); 53 4.7.3 枚举法枚举法 在某些问题中,需要对可能出现的大量情况进行一一测试,在某些问题中,需要对可能出现的大量情况进行一一测试, 以判断是否满足某些(或
55、某个)求解的条件。采用循环语句可以以判断是否满足某些(或某个)求解的条件。采用循环语句可以 方便地来解决。方便地来解决。 例如,例如,“百元买百鸡百元买百鸡”问题。假定小鸡每只问题。假定小鸡每只0.50.5元,公鸡每只元,公鸡每只 2 2元,母鸡每只元,母鸡每只3 3元。现在有元。现在有100100元钱,要求买元钱,要求买100100只鸡。编程列出只鸡。编程列出 所有可能的买鸡方案。所有可能的买鸡方案。 设,小鸡、公鸡和母鸡分别为设,小鸡、公鸡和母鸡分别为chickens、cocks、hens只。只。 根据题意,列出方程组如下:根据题意,列出方程组如下: chickens + cocks +
56、hens = 100 0.5 * * chickens + 2 * * cocks + 3 * * hens = 100 54 枚举法的基本思想,就是在所有可能的枚举法的基本思想,就是在所有可能的chickens、cocks、 hens值值中,找出满足方案的解。中,找出满足方案的解。 按照这个思想,按照这个思想,chickens、cocks、hens可能的取值如下:可能的取值如下: chickens:0100、 cocks:0100、 hens:0100. 那么,接下来的问题就是:那么,接下来的问题就是: 在上面这三个取值范围中,哪些值是满足解决方案的?在上面这三个取值范围中,哪些值是满足解决
57、方案的? 55 程序清单程序清单4-94-9是算法一:三重嵌套完整的程序是算法一:三重嵌套完整的程序。 /源程序清单源程序清单4-9 HundredYuanToBuyHundredChickens1.java import java.util.Scanner; public class HundredYuanToBuyHundredChickens1 public static void main(Stringargs) int chickens, cocks, hens; System.out.println( chickenstcocksthens ); for ( chickens =
58、0; chickens 100; chickens+ ) for ( cocks = 0; cocks 100; cocks+ ) for ( hens = 0; hens 100; hens+ ) if ( ( chickens + cocks + hens = 100 ) 56 程序清单程序清单4-104-10是算法二:优化为是算法二:优化为两重嵌套两重嵌套完整的程序完整的程序。 /源程序清单源程序清单4-10 /HundredYuanToBuyHundredChickens2.java import java.util.Scanner; public class HundredYuanT
59、oBuyHundredChickens2 public static void main(Stringargs) int chickens, cocks, hens; System.out.println( chickenstcocksthens ); for ( hens = 0; hens 33; hens+ ) for ( cocks = 0; cocks 50; cocks+ ) chickens = 100 - hens - cocks; if ( 0.5*chickens + 2*cocks + 3*hens = 100 ) System.out.println( chickens
60、 + , + cocks + , + hens ); 57 *4.7.4 蒙特卡洛模拟蒙特卡洛模拟 为了更多地学习编程解决问题,本节给出使用蒙特卡洛方法来估算为了更多地学习编程解决问题,本节给出使用蒙特卡洛方法来估算 的值。的值。 为了更好地理解这个方法,需要画出一个圆的外接正方形。如下图所示:为了更好地理解这个方法,需要画出一个圆的外接正方形。如下图所示: 1 1 -1 -1 1 1 假设这个圆的半径是假设这个圆的半径是1 1,那么圆面积就是,那么圆面积就是 而外接而外接 正方形的面积就是正方形的面积就是4 4。随机产生正方形中的一个点,该。随机产生正方形中的一个点,该 点落在这个圆内的概率
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级数学(小数除法)计算题专项练习及答案汇编
- 2024智慧城市整体解决方案与合作协议
- 2024年贸易融资借款合同
- 能源互联网平台建设协议
- 2024旅游活动组织者安全责任保证合同及免责条款3篇
- 二零二五年度彩钢瓦建筑保温隔热工程合同2篇
- 2024年终运动鞋促销活动合作协议3篇
- 电商平台金融服务协议
- 2024版全新履约担保保证合同下载
- 物流行业物流大数据分析与应用方案
- 2024版智能硬件产品研发合作协议3篇
- 国家电网招聘之财务会计类题库含完整答案(必刷)
- 2024年手术室带教工作计划样本(5篇)
- 保安服务招投标书范本(两篇)2024
- 辽宁省沈阳市五校协作体2024-2025学年高二上学期11月期中考试语文试题(含答案)
- 保密知识培训
- 江西省稳派教育2025届数学高二上期末教学质量检测模拟试题含解析
- 2022-2023学年北京市海淀区高二(上)期末英语试卷(含答案解析)
- 2021-2022学年统编本五四制道德与法治五年级上册期末检测题及答案(共6套)
- (BRB)屈曲约束支撑施工专项方案
- 期末达标测试卷(试题)-2024-2025学年人教PEP版英语四年级上册
评论
0/150
提交评论