《java核心技术-第三章笔记》控制结构--循环

全文代码已测试完全可执行
手敲版本TAT

控制结构

if语句

顺序结构;按顺序执行的代码程序(一条路走到底)

if(判断条件){                      
	语句体;                                     
}else if(判断条件){        	//else if 是可选的                                
	语句体;                                                                                                }                                                                                    
  1. if语句从if后面跟条件,这必须包在小括号里
  2. 这个条件可以是任何有布尔值的表达式也就是false或者true
  3. if语句后面的部分是这个表达式为true要执行的部分
  4. 如果不只一个语句需要将其包括在花括号中{ }
  5. 如果条件为false可以添加一个else部分这是 可选的
  6. 可以用else if放置多个条件
  7. 如果以上所有条件都不为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(布尔表达式){                        
    循环体;                                                
    步进表达式;                                        
}                                                                        
  1. 首先是一个while然后把条件放在小括号里,条件检查放在最上端,先检查再执行
  2. 这个条件可以是任何有布尔值的表达式也就是false或者true
  3. 然后是想在循环中执行的一个或多个语句
  4. 如果不只一个语句需要将其包括在花括号中{ }
  5. 在这里进入循环,检查这个条件,如果条件为true就执行循环中的这个代码
  6. 再回到最上面再次检查条件,当这个条件为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语句

  1. 这个语句中条件检查放在最下面,先执行再检查,所以此循环首先会无条件执行一次
  2. 关键字do放在最上面,关键字while放在最下面
  3. 同样这样的条件要放在小括号里
  4. 对于do while语句,最上面没有任何条件,指示我们第一次进入循环,循环结束时才会检查这个条件
  5. 如果条件为true就回到最上面,如此继续
  6. do while 语句不太常用,不过有一种情况会经常用到,这就是读输入时
  7. 在这个例子中,我们希望打印输出之后询问用户,问他们是否还想继续,只要他们说还没准备退休,我们就要继续累加银行账户里的存款
  8. 不过为了合理起见,我们要直接执行一次,而不先问问题
  9. 之所以使用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){//初始化只运行一次,布尔表达式执行判定,步进每次循环时运行
循环体;    //具体的执行语句
}
  1. for循环首先有一个关键字for
  2. 然后有三个部分,这些部分包括在小括号里,用分号;分隔
  3. 第一部分要初始化一个变量,这里为i变量从1开始,这个初始化会在,第一次进入循环前完成
  4. 第二部分是一个条件,所以当i<=10时,我们就要继续循环,每次进入循环都要检查这个条件,检查条件之后执行循环体
  5. 这个特定的循环只有一个语句,所以这里不需要大括号, 说明: 原文是这样讲的,但我习惯于加一个花括号{ }
  6. 可以看到他会打印1,然后移到第三部分,for循环的更新部分,在这里表示这个i要加1,所有现在i变成2
  7. 然后回到循环最上面,检查i是否仍然小于等于10,确实如此,所以我们要打印2
  8. 接下来变成3如此继续,所以这是一个i1变到10的循环,包括10,每一步都让i1
  9. 在这个例子中i是一个新变量,从这里的int可以看到,这个变量只在这个循环语句中合法,出了循环它就不复存在了 i为局部变量
  10. 如果i之前就已经存在,而且你希望执行循环时使用同一个i,那就不要在这里指定类型,可以任意调整for循环的各个部分
  11. 例如可以让i0开始,或者运行循环直到i小于10,或者每次将i1,或者是将i2
  12. 实际上Java语言中并没有,要求你必须在初始化,测试和更新这三部分中都使用i
  13. 你可以初始化i测试j然后更新k,当然这是很糟糕的凤格,不要这么做
  14. 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:        //语句体的执行入口    不满足则进行下一个入口
    	语句体1break//程序若满足case1即结束,将不再执行后续代码  break可以不加但若如此switch将穿透执行直到下一个break为止
    case 常量值2:
   		语句体2break;
    ......
    default:  //结束            若所有case都不能执行将执行default收尾
   		 语句体n+1
    break;
}            
  1. switch是多分支的一种更紧凑的形式,这种情况下你的决定只涉及一个值
  2. 在这里,在一个菜单系统里,让用户选择一个选项,1,2,34我们要读入用户的响应,现在根据这个值建立一个switch
  3. 如果是1就执行一个分支,如果是2就执行另一个分支,以此类推
  4. 如果choice1我们想做些处理;如果是2我们想做另外一些处理
  5. 当然你也可以直接使用if else if else if很多程序员确实会这么做,不过有些程序员更喜欢switch的这种紧凑性
  6. 可以看到这个语法有一组case,case后面是让你进入这个case的值,
  7. 然后这里还有一个defaut,如果以上所有case都不匹配就会执行这个分支
  8. 关于switch有一个古怪的地方,每个case之间需要用一个,有魔法的单词break分隔,
  9. 如果没有加break,会发生很糟糕的事情,会继续执行进入下一个case,这往往不是你想要的
  10. 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,用不同的方式完成测试检查,实现业务

在这里的做法是把条件反过来,如果我还没有达到目标,就要让years1还需要在这里测试条件

很多人不是很喜欢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
}

注意:

  1. 多个case后面的值不可以重复,switch的表达式只能是byteshortcharint ,string字符串、enum枚举
  2. case语句可以颠倒,break可以省略

三种循环的区别(复习):

  1. 若条件判断从来没有被满足过,那么forwhile将不执行,do while将执行一次
  2. for循环的的变量在小括号中定义,只有在循环内部才可以使用。(局部变量)
  3. whiledo-while循环初始化语句本身就在循环外,所以循环后还可以继续使用

----使用循环的建议:凡是次数已定的场景多用for循环,否则用while循环

break】关键字的用法
1,可以用在switch语句中,一旦执行,整个switch语句立即结束
2,还可以用在循环语句中,一旦执行,整个循环语句立即结束打断循环。
continue】关键字用法 // 一旦执行,立即跳过当次循环马上开始下次循环

死循环:一直执行不能结束的循环
标准格式

while(true){
循环体;
}
posted @     阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示