JAVA流程控制——循环结构
循环结构
相同操作执行多次
- while循环结构
- do...while循环
- for循环
- 数组增强型for循环(Java5引入)
一、while循环
最基本的循环结构
while (布尔表达式){
//循环内容
}
- 只要布尔表达式为true,循环就一直会执行下去
- 大多数情况下,想停止循环需要以表达式失效的方式
- 少部分循环需要一直执行,如服务器的请求响应监听
- 循环条件一直为true会造成无限循环(死循环),正常编程应尽量避免,会影响程序性能或造成程序卡死奔溃
package com.Shelton.struct;
public class WhileDemo02 {
public static void main(String[] args) {
//输出1~100
int i = 0;
while(i<100){
System.out.println(++i);
}
}
}
package com.Shelton.struct;
public class WhileDemo03 {
public static void main(String[] args) {
//1+2+3+...+100= ?
int i = 0;
int sum = 0;
while (i<100){
sum = ++i + sum;
}
System.out.println(sum);
}
}
二、 do...while
1. 语法
do {
//代码语句
}while();
- 效果同while
- while若不满足条件,不进入循环,而do...while不满足条件会执行一次
package com.Shelton.struct;
public class DoWhileDemo01 {
public static void main(String[] args){
//1+2+3+...+100= ?
int i = 0;
int sum = 0;
do {
sum = sum + i;
i++;
}while(i<100);
System.out.println(sum);
}
}
package com.Shelton.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
*/
三、for※
能使循环结构变得更简单,for是支持迭代的一种通用结构,是最有效、最灵活的循环结构
1. 语法
for(初始化;布尔表达式;更新){
//代码语句
}
- 最先初始化的步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可是空语句
- 然后检测布尔值,如果true执行循环体,false直接执行循环体后面的语句
- 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)
- 再次检测布尔表达式,循环执行上述过程
package com.Shelton.struct;
public class ForDemo01 {
public static void main(String[] args) {
int a = 1;//初始化条件
while (a<=6){
System.out.println(a);//循环体
a+=2;//迭代——每一次循环a = a + 2都会将a的值刷新
}
System.out.println("while循环结束!");
// 初始化 条件判断 迭代
for (int i=1;i<=6;i++){
System.out.println(i);
}
System.out.println("for循环结束!");
}
}
/*
1
3
5
while循环结束!
1
2
3
4
5
6
for循环结束!
*/
2. 死循环
for (; ;){}
3. 练习
练习1
package com.Shelton.struct;
public class ForDemo02 {
public static void main(String[] args) {
//计算0~100v之间奇数和偶数的和
int i = 1;
int ji = 0;
int ou = 0;
//0 2 4 6 8 .......98 100
//1 3 5 7 9 .......97 99
for (i=1;i<=50;i++){
ji = 2*i-1 + ji;
ou = 2*i + ou;
}
System.out.println("奇数和为"+ji);
System.out.println("偶数和为"+ou);
}
}
改进
package com.Shelton.struct;
public class ForDemo03 {
public static void main(String[] args) {
int oddSum = 0;//even number 是偶数 odd number 是奇数
int evenSum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) {//将奇数偶数分开,偶数/2余数为0,不为0的分另一组
oddSum += i;
} else {
evenSum += i;
}
}
System.out.println("奇数的和:"+oddSum);
System.out.println("奇数的和:"+evenSum);
}
}
练习2
package com.Shelton.struct;
public class ForDemo04 {
public static void main(String[] args) {
//用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
int i = 0;
for(i=0;i<=1000;i++){
if(i%5==0){
System.out.println(i);
}
}
}
}
/*
0
5
10
15
...
990
995
1000
*/
改进
package com.Shelton.struct;
public class ForDemo08 {
//用for循环输出1-1000之间能被5整除的数,并且每行输出3个数
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) {
if (i%5==0){
System.out.print(i+"\t");//"\t"相比” “可以把空格对齐
} // print不换行输出
if (i%15==0){//0能被15整除会直接换行相当于print("\n");
System.out.println();
}
}
}
}
/*
5 10 15
20 25 30
35 40 45
50 55 60
... ... ...
980 985 990
995 1000
*/
练习3
package Com.Shelton.struct;
public class ForDemo09 {
//打印99乘法表
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
count = i*j;
System.out.print(i+"*"+j+"="+count+"\t");
if (j%9==0){
System.out.println();
}
}
}
}
}
/*
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
*/
改进
public class ForDemo10 {
public static void main(String[] args) {
int count = 0;
for (int j = 1; j <= 9; j++) {
for (int i = 1; i <= 9; i++) {
count = i*j;
if(i<=j){//舍去 1*1=1后面的1*2=2 1*3=3 1*4=4 1*5=5......
//1*2=2 2*2=4后面的2*3=6 2*4=8 2*5=10......
System.out.print(i + "*" + j + "=" + count + "\t");//i*j=count
}
if(i%9==0){//在输出9个数时换行
System.out.println();
}
}
}
}
}
/*
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
*/
改进
package Com.Shelton.struct;
public class ForDemo11 {
public static void main(String[] args) {
for (int j = 1; j <= 9; j++) {
for (int i = 1; i <= j; i++) {//将if (i<j)放进for的判断条件里
System.out.print(j+"*"+i+"="+(j*i)+"\t");
}
System.out.println();//内层不会输出大于j的数,因此不用判断是否输出了9个数直接换行
}
}
}
- 先打印一列
- 把固定的1再用一个循环包裹起来
- 去掉重复项 i<j
- 调整样式
4. 增强for循环
格式
for(声明语句 :表达式)
{
\\代码语句
}
- Java5引入的一种主要用于数组或集合的增强型for循环
例子
package Com.Shelton.struct;
public class ForDemo12 {
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);
}
}
}
/*
10
20
30
40
50
=============================
10
20
30
40
50
*/
5. break
- break用于跳出循环(中止整个循环)、不终止程序
package Com.Shelton.struct;
public class BreakDemo {
public static void main(String[] args){
int i = 0;
while (i<100){
i++;
System.out.println(i);
if (i==5){
break;
}
}
}
}
/*
1
2
3
4
5
*/
package Com.Shelton.struct;
public class ContinueDemo {
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
if (i%10==0){
System.out.println();
continue;//遇到能整除10的数直接结束循环,不执行
}
System.out.print(i);
}
}
}
/* 123456789
111213141516171819
212223242526272829
313233343536373839
414243444546474849
515253545556575859
616263646566676869
717273747576777879
818283848586878889
919293949596979899
*/
package Com.Shelton.struct;
public class ContinueDemo {
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
if (i%10==0){
System.out.println();
break;
}
System.out.print(i);
}
}
}
/*
123456789
*/
6. coutinue
- continue用于终止本次循环,接着进行下一次循环判定
package Com.Shelton.struct;
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);
}
}
}
/*
123456789
111213141516171819
212223242526272829
313233343536373839
414243444546474849
515253545556575859
616263646566676869
717273747576777879
818283848586878889
919293949596979899
*/
goto关键词
package Com.Shelton.struct;
public class LabelDemo {
public static void main(String[] args) {
//打印101-150之间的所有质数
outer:for (int i = 101; i <= 150; i++) { //跳转到指定地点
for (int j = 2; j<=i/2; j++){
if (i%j==0){
continue outer;//跳出循环,把所有能整除的数排除
}
}
System.out.println(i+"");
}
}
}
/*
101
103
107
109
113
127
131
137
139
149
*/
关于质数的算法
- 因为一自然数的约数是对称分布的,最小值1,最大值自己,中间的所有约数都是两两成对出现的
- 所以判断整除的时候不需要从1遍历到自己,只要遍历到自己的一半就可以了,
- 因为如果一个数x存在约数n,且n<=x/2,那么一定存在另一个约数m,且m>=x/2,使得m*n=x.
四、流程控制练习题
练习1
package Com.Shelton.struct;
public class TestDemo01 {
/*
打印三角形 5行
*
***
*****
*******
*********
*/
public static void main(String[] args) {
for (int j = 0; j < 5; j++){
for (int i = 4; i >= 0; i--) {
if (i>=j){
System.out.print(" ");
}
}
/*
-----
----
---
--
-
*/
for (int i = 0; i <= 4; i++) {
if (i<=j){
System.out.print("*");
}
}
/*
*
**
***
****
*****
*/
for (int i = 0; i <= 4; i++) {
if (i<j){
System.out.print("*");
}
}
/*
*
**
***
****
*/
System.out.println();
}
}
}
/*
*
***
*****
*******
*********
*/
改进
package Com.Shelton.struct;
public class TestDemo02 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 5; j > i; j--) {
System.out.print(" ");
}
/*
for (int j = 5; j > 0; j--) { //for里的嵌套if可以改成for的循环判断条件
if (j>i){
System.out.print(" ");
}
}
*/
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
Debug调试

- 可以看见程序运行到断点的情况

浙公网安备 33010602011771号