《java核心技术-第三章笔记》控制结构--循环
全文代码已测试完全可执行
手敲版本TAT
控制结构
if语句
顺序结构;按顺序执行的代码程序(一条路走到底)
if(判断条件){
语句体;
}else if(判断条件){ //else if 是可选的
语句体; }
if语句从if后面跟条件,这必须包在小括号里- 这个条件可以是任何有布尔值的表达式也就是
false或者true if语句后面的部分是这个表达式为true要执行的部分- 如果不只一个语句需要将其包括在花括号中
{ } - 如果条件为
false可以添加一个else部分这是 可选的 - 可以用
else if放置多个条件 - 如果以上所有条件都不为
true就执行这一部分
if (yourSales >= 2 * target){
performance = "Excellent" ;bonus = 1000;
} //后面的内容是可选的,可以省略这些部分,而只有一个if
else if (yourSales >= 1.5 * target){
performance = "Fine" ;bonus = 500; //如果第一个if的条件不满足,但满足第二个if的条件就执行这部分
}
else if (yourSales >= target){
performance = "Satisfactory" ;bonus = 100;
}
else{
System.out. println( "You' re fired" ) ;
}
while循环语句
初始化表达式;
while(布尔表达式){
循环体;
步进表达式;
}
- 首先是一个while然后把条件放在小括号里,条件检查放在最上端,先检查再执行
- 这个条件可以是任何有布尔值的表达式也就是
false或者true - 然后是想在循环中执行的一个或多个语句
- 如果不只一个语句需要将其包括在花括号中
{ } - 在这里进入循环,检查这个条件,如果条件为
true就执行循环中的这个代码 - 再回到最上面再次检查条件,当这个条件为
true时,就会一直循环,直到最终条件变为false此时退出循环执行后面的代码
int balance=0; //已经攒的钱
int goal=100_0000; //预期攒的金额
int years=0; //年份的初始化
int payment=1000; //每次攒的金额
int interestRate=5; //年利率
while (balance < goal){ //已攒的钱和预期目标
balance += payment; //每次攒多少钱
double interest = balance * interestRate / 100; //利息interestRate
balance += interest; //计算复利
years++;
}
System.out.println("You can retire in " + years + " years " ); //你可以在X年后退休 计算完成 X=80
do while语句
- 这个语句中条件检查放在最下面,先执行再检查,所以此循环首先会无条件执行一次
- 关键字
do放在最上面,关键字while放在最下面 - 同样这样的条件要放在小括号里
- 对于
do while语句,最上面没有任何条件,指示我们第一次进入循环,循环结束时才会检查这个条件 - 如果条件为
true就回到最上面,如此继续 do while语句不太常用,不过有一种情况会经常用到,这就是读输入时- 在这个例子中,我们希望打印输出之后询问用户,问他们是否还想继续,只要他们说还没准备退休,我们就要继续累加银行账户里的存款
- 不过为了合理起见,我们要直接执行一次,而不先问问题
- 之所以使用
do while循环,是因为需要先执行一次循环体,然后才可以计算循环条件
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in) ;
System.out.print("How much money will you contribute every year? "); //每年攒多少钱
double payment = in.nextDouble();
System.out.print( "Interest rate in %: "); //年利率
double interestRate = in.nextDouble();
double balance = 0;
int year = 0;
String input;
// update account balance while user isn't ready to retire
//当用户不准备退休时更新帐户余额
do{
// add this year's payment and interest 加上今年的付款和利息
balance += payment;
double interest = balance * interestRate / 100;
balance += interest; //计算复利
year++;
// print current balance 打印当前余额
System.out.printf("After year %d,your balance is %,.2f%n",year,balance);
// ask if ready to retire and get input
// 询问是否准备好退休并获取信息
System.out.print ( "Ready to retire? (Y/N)");//准备好退休了吗? Yes停止,oN继续
input = in. next();
}while (input.equalsIgnoreCase("N")); //equalsIgnoreCase不区分大小写
}
for循环
for(初始化表达式1;布尔表达式2;步进表达式3){//初始化只运行一次,布尔表达式执行判定,步进每次循环时运行
循环体; //具体的执行语句
}
for循环首先有一个关键字for- 然后有三个部分,这些部分包括在小括号里,用分号
;分隔 - 第一部分要初始化一个变量,这里为
i变量从1开始,这个初始化会在,第一次进入循环前完成 - 第二部分是一个条件,所以当
i<=10时,我们就要继续循环,每次进入循环都要检查这个条件,检查条件之后执行循环体 - 这个特定的循环只有一个语句,所以这里不需要大括号, 说明: 原文是这样讲的,但我习惯于加一个花括号
{ } - 可以看到他会打印
1,然后移到第三部分,for循环的更新部分,在这里表示这个i要加1,所有现在i变成2 - 然后回到循环最上面,检查
i是否仍然小于等于10,确实如此,所以我们要打印2 - 接下来变成
3如此继续,所以这是一个i从1变到10的循环,包括10,每一步都让i增1 - 在这个例子中
i是一个新变量,从这里的int可以看到,这个变量只在这个循环语句中合法,出了循环它就不复存在了 i为局部变量 - 如果
i之前就已经存在,而且你希望执行循环时使用同一个i,那就不要在这里指定类型,可以任意调整for循环的各个部分 - 例如可以让
i从0开始,或者运行循环直到i小于10,或者每次将i减1,或者是将i加2 - 实际上Java语言中并没有,要求你必须在初始化,测试和更新这三部分中都使用
i - 你可以初始化
i测试j然后更新k,当然这是很糟糕的凤格,不要这么做 for循环的本意是让一个变量在某个地方开始,到某个地方结束,并且在某个地方更新,这才是for循环正确的用法
for (int i = l; i <= 10; i++){
System.out.println(i);
}
举例:
Scanner in = new Scanner(System.in);
System.out.print("How many numbers do you nee to draw ? "); //你抽的彩票是有多少个数字的
int k = in.nextInt();
System.out.print("what is the highest number you can draw ? "); //你能抽的最高数是多少次
int n = in.nextInt();
/** 彩票概率公式:
*compute binomial coefficient n*(n-1)*(n-2) ...*(n-k+1)/(1*2*3*...*k)
* 大意是: 一个彩票一个有K个数,你从中抽N个数,你抽中目标数字赢的概率是?
*/
int lotteryOdds = 1;
for (int i = 1; i <= k; i++)
lotteryOdds = lotteryOdds * (n - i + 1) / i; //彩票赔率
System.out.println("彩票赔率 = "+"1:" + lotteryOdds);//若 K=6 N=6 比率为1:1 若K=4 N为=24 概率为1:134596
初始化的值也可以在外面,
for循环的三部分是可选的
int i = 1; for (; i <= 10; i++) System.out.println("I = "+ + i);
for each循环
如果有这样一个简单的循环你要做的只是访问所有元素,这种情况下可以使用for循环的一个替代版本
称为for each循环,同样for each循环也有关键字for和小括号(),不过在小括号里有一个冒号:
冒号后面是你要迭代处理的集合,在这里就是我们的数组a,冒号:前面要声明一个变量,轮流将它赋值为这个集合中的每一个元素
int a = new a[100]
for (int element : a)
System.out.println(element) ;
在这里,我们首先从第0个元素开始,然后是第1个元素,依次类推
注意:这里完全没有使用索引,element会在,第一次迭代时赋为a[0],然后是a[1],如此继续,
而且这里直接使用element,所以不需要使用a[i]构造,应当尽可能使用for each循环,
这意味着只要是想要轮流访问所有元素就应当使用for each循环,
switch语句
switch(表达式){
case 常量值1: //语句体的执行入口 不满足则进行下一个入口
语句体1;
break;//程序若满足case1即结束,将不再执行后续代码 break可以不加但若如此switch将穿透执行直到下一个break为止
case 常量值2:
语句体2;
break;
......
default: //结束 若所有case都不能执行将执行default收尾
语句体n+1
break;
}
switch是多分支的一种更紧凑的形式,这种情况下你的决定只涉及一个值- 在这里,在一个菜单系统里,让用户选择一个选项,
1,2,3或4我们要读入用户的响应,现在根据这个值建立一个switch - 如果是
1就执行一个分支,如果是2就执行另一个分支,以此类推 - 如果
choice是1我们想做些处理;如果是2我们想做另外一些处理 - 当然你也可以直接使用
if else if else if很多程序员确实会这么做,不过有些程序员更喜欢switch的这种紧凑性 - 可以看到这个语法有一组
case,case后面是让你进入这个case的值, - 然后这里还有一个
defaut,如果以上所有case都不匹配就会执行这个分支 - 关于
switch有一个古怪的地方,每个case之间需要用一个,有魔法的单词break分隔, - 如果没有加
break,会发生很糟糕的事情,会继续执行进入下一个case,这往往不是你想要的 switchi语句只适用于最好根据整数,枚举值或字符串做决定的情况,
Scanner in = new Scanner (System.in);
System.out.print ("Select an option (1,2,3,4) ");
int choice = in.nextInt( ) ;
switch (choice){
case 1:
... break;
case 2:
... break;
case 3:
... break;
case 4:
... break;
default:
// bad input. . .
break;
}
- 在
switchi语句中看到的这个break关键字也可以在循环中使用,在这种情况下它会终止循环
举例:
在这个循环中我,们需要做一些工作,最多做一百年,实际上就是累加利息,
但是如果在这100年结束之前,我们已经达到了自标于是我们想退出循环,就可以利用这个
break做到,所以一旦执行这个break就会继续运行循环语句后面的代码,现在break已经不再是必要的
while (years = 100){ balance += payment; double interest = balance * interestRate / 100;balance += interest; if (balance >= goal) break; yearS++; }
另一种逻辑,不使用
break,用不同的方式完成测试检查,实现业务在这里的做法是把条件反过来,如果我还没有达到目标,就要让
years加1还需要在这里测试条件很多人不是很喜欢
break,会使用boolean条件避兔break,break表示在这里跳出循环
while (years = 100 && balance < goal){ balance += payment; double interest = balance * interestRate / 100;balance += interest; if (balance < goal) years++; }
Continue会跳过循环体的剩余部分
Scanner in = new Scanner(System.in) ;
while (sum < goal){
system.out.print("Enter a number: ");
n = in.nextInt();
if (n< 0) continue;
sum += n; // not executed if n < 0
}
注意:
- 多个
case后面的值不可以重复,switch的表达式只能是byte、short、char、int,string字符串、enum枚举 case语句可以颠倒,break可以省略
三种循环的区别(复习):
- 若条件判断从来没有被满足过,那么
for和while将不执行,do while将执行一次 for循环的的变量在小括号中定义,只有在循环内部才可以使用。(局部变量)while和do-while循环初始化语句本身就在循环外,所以循环后还可以继续使用
----使用循环的建议:凡是次数已定的场景多用for循环,否则用while循环
【break】关键字的用法
1,可以用在switch语句中,一旦执行,整个switch语句立即结束
2,还可以用在循环语句中,一旦执行,整个循环语句立即结束打断循环。
【continue】关键字用法 // 一旦执行,立即跳过当次循环马上开始下次循环
死循环:一直执行不能结束的循环
标准格式
while(true){
循环体;
}

浙公网安备 33010602011771号