Java 流程控制04
循环结构
1. while 循环
-
while 是最基本的循环,它的结构为:
while (布尔表达式){ //循环的内容 }
-
只要布尔表达式为true,循环就会一直执行下去
-
我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。
-
少部分情况需要循环一直执行,比如服务器的请求响应监听等
-
循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程需要尽量避免死循环,这会影响程序性能或者造成程序卡死崩溃。
-
实例:
package com.Ym.struct; public class WhileDemo01 { public static void main(String[] args) { //输出1到100 long i = 0; while (i<100){ i++; System.out.println(i); } } }
-
计算1+2+3+...+100
package com.Ym.struct; public class WhileDemo03 { public static void main(String[] args) { //计算1+2+3+。。+100=? int i = 0; int sum = 0; while (i<=100){ sum = sum + i; i++; } System.out.println(sum); } }
2. do...while循环
-
对于while语句而言,如果不满足条件,则不能进入循环。
-
但有时候我们需要即使不满足条件,也至少执行一次。
-
这时就使用do...while循环,它与while循环相似但是它能够至少执行一次
do { //代码语句 }while(布尔表达式)
注:
-
while与do的区别在于while是先判断后执行,do while 是先执行后判断。
-
Do...while总是保证循环体会被至少执行一次,这是他们的主要差别。
package com.Ym.struct; public class DoWhileDemo02 { public static void main(String[] args) { int a = 0; while (a<0){ System.out.println(a); a++; }//没有输出 System.out.println("============="); do{ System.out.println(a); a++; }while(a<0);//输出了0 } }
3. for 循环(最重要的)
-
虽然所有的循环都能使用while与do...while表示,但是Java提供了另一种语句--for循环,使得循环结构变得更加简单。
-
for循环语句是支持迭代的一种通用结构,是最有效的、最灵活的循环结构。
-
for循环执行的次数是在执行前就确定的,语法格式如下
for(初始化;布尔表达式;更新){ //代码语句 }
-
while与for的使用区别
public class ForDemo01 { public static void main(String[] args) { int a = 1;//初始化条件 while (a<=100){//条件判断 System.out.println(a);//循环体 a += 2;//a = a + 2;(迭代) } System.out.println("while循环结束!"); //初始化;条件判断;迭代 for(int i = 1;i <= 100;i++){ System.out.println(i);//循环体 } System.out.println("for循环结束!"); //快捷方式100.for+回车 for (int i = 0; i < 100; i++) { System.out.println(i); }
-
注:
关于for循环有以下几点说明: 最先执行初始化步骤,可以说明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。//删除int i = 0; 然后,检测布尔表达式的值。如果为true,循环体被执行;如果为false,循环终止,开始执行循环体后面的语句//删除i < 100; 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)//删除i++ 再次检测布尔表达式。循环执行上面的过程
练习1 计算0-100之间偶数与奇数的和
-
我的做法
int evenSum = 0; for(int i = 0;i <= 100;i += 2){ evenSum = evenSum + i; } System.out.println(evenSum);//偶数2550 int oddSum = 0; for (int y = 1;y < 100;y += 2){ oddSum = oddSum + y; } System.out.println(oddSum);//奇数2500
-
狂神老师的做法
int oddSum1 = 0; int evenSum2 = 0; for (int i = 0; i <= 100; i++) { if(i%2!= 0){//%模运算,!=不等于,因此这是奇数 oddSum1+=i;//oddSum = oddSum + i; }else{//这是偶数 evenSum2+=i; } } System.out.println("奇数的和:"+oddSum1); System.out.println("偶数的和:"+evenSum2);
练习2 用while或for循环输出1-1000之间能被5整除的数字,并且每行输出3个
-
狂神老师做的for
for (int i = 1; i <= 1000; i++) { if (i%5==0){ System.out.print(i+"\t");//空格\t,删除了System.out.ptintln的ln if (i%(5*3)==0){//除了三个5后就换行 System.out.println();//换行\n:System.out.print("\n") } } }
-
我做的while
int x = 1; while (x <= 1000){ if (x%5==0){ System.out.print(x+"\t"); if (x%15==0){ System.out.println(); } } x++; }
-
注意点
-
如果System.out.print则它不会换行,如果带了ln它就会自动换行
-
转义字符\t 为空格;\n为换行
-
System.out.println()==System.out.print("\n")
练习3 打印九九乘法表
-
狂神老师的做法
package com.Ym.struct; public class ForPracticeDemo03 { public static void main(String[] args) { //1. 我们先打印第一列,将复杂的问题简单化,然后考虑接下来 //2. 将固定的1再用一个循环包起来 //3. 去掉重复项,i<j //4. 调整样式 for (int j = 1; j <= 9; j++) { for (int i = 1; i <= j; i++) { System.out.print(j+"*"+i+"="+(j*i) + "\t"); } System.out.println(); }
-
Ym的复盘
-
将九列的问题先只看成一列的问题
for (int i = 0; i < 9; i++) { System.out.println(1+"*"+i+"="+(1*i)); }
-
将一列的问题变成九列的问题,只要把上一把固定的1改成一个变量,而这个变量也用for循环来表示
将这俩个for循环嵌套起来就解决了
for (int j = 0; j < 9; j++) { for (int i = 0; i < 9; i++) { System.out.println(j+"*"+i+"="+(j*i)); } }
-
第二步跑起来会发现有重复的,因此需要去除重复项,于是就让i<j
for (int j = 0; j <= 9; j++) { for (int i = 0; i <= j; i++) { System.out.println(j+"*"+i+"="+(j*i)); } }
-
再调整一下样式
for (int j = 0; j <= 9; j++) { for (int i = 0; i <= j; i++) { System.out.print(j+"*"+i+"="+(j*i)+"\t"); } System.out.println(); }
4. 增强For循环
-
做个了解,在以后的数组会重点使用
public class ForDemo02 { public static void main(String[] args) { int [] numbers = {10,20,30,40,50};//定义了一个数组 for (int i = 0;i < 5;i++){ System.out.println(numbers[i]); } System.out.println("===================="); //遍历数组的元素 for (int x:numbers){ System.out.println(x); } } }
5. Break&Continue
-
Break 在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。
public class BreakDemo { public static void main(String[] args) { int i = 0; while (i<100){ i++; System.out.println(i); if (i==30){ break;//强行终止了循环的进行 } } System.out.println("123"); } }//强行的终止
-
Continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
public class ContinueDemo { public static void main(String[] args) { int i = 0; while (i<100){ i++; if (i%10==0){ System.out.println(); continue;//符合条件就回到循环 } System.out.print(i); }
6.定位符(不建议使用)
public class LabelDemo { public static void main(String[] args) { //打印101-150之间所有的质数 //质数是指大于1的自然数之中,除了1和它本身意外不再有其他因素的自然数 int count = 0; //不建议使用 outer:for (int i = 101 ; i <= 150 ; i++){ for (int j = 2 ; j < i/2 ; j++){ if (i % j == 0){ continue outer; } } System.out.print(i + " "); } } }
7. 练习
-
打印一个三角形
public class TextDemo01 { public static void main(String[] args) { //打印三角形 5行 for (int i = 1 ; i <= 5 ; i++){ for (int j = 5 ; j >= i ; j--){ System.out.print("@"); } for (int j = 1 ; j <= i ; j++){ System.out.print("*"); } for (int j = 1 ; j < i ; j++){ System.out.print("*"); } for(int j = 5 ; j >= i ; j--){ System.out.print("@"); } System.out.println(); }
注:
-
java是顺序运行,循环的嵌套它是按照从上往下进行的,进行完一次后才会递进再重复一次循环,所以生成的符号可以看作一行一行来。
-
for循环的嵌套十分有效,利用不同的变量的关系可以有很多不一样的效果,一定要将复杂的问题分解成一个一个小的问题,以此来寻找突破口。
2022.9.14 星期三
今天把java的流程控制学完了,while if for 这三个都好难哦,感觉现在学起来确实有点吃力,不过这才学了一个星期,后面多多练习应该是可以进步的,一定要加油。
来到课题组的第二个星期,没想到每个星期的组会我都老是要错过,第一个星期是班会,现在却和选修撞上了,啧啧啧我也想听一下组会,听听师兄们在干些什么。
健身了俩天,手和腿居然都不酸,看来后面得加大运动量了,要虐自己多点,不过好像是有瘦下来点哈哈,还有一个半月时间就是姐姐的婚礼咯,还有四个月就要见npy的家长了,一定要加油好好瘦下来!
ps.研究生开学到现在,每天都是不一样的一天,对未来真的十分憧憬,一定要加油坚持住,keep !