《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){
循环体;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?