Java学习7--循环结构

循环结构(while/do while/for)

    • while循环
    • do while循环
    • for循环

while 循环结构

while(boolean)
{
//循环内容
}

while 循环举例

package struct;

public class whileDemo01 {

    public static void main(String[] args) {
        int i =0;
        while (i<100){
            i++;
            System.out.println(i);
       }
    }
}


do while结构格式(注意 do while是先执行,后判断,所以一定不管条件成立不成立,会执行至少一次)

do 你的loop;
while (你的condition);

do while结构举例

计算1到100的总和,并输出结果

package struct;

public class do_whileDemo01 {
    public static void main(String[] args) {
        int i =0;
        int sum=0;
        do {sum=sum+i;i++;} while (i<=100);
        System.out.println(sum);
    }
}

结果显示:

sum_even= 2500
sum_odd= 2550

For循环的通用结构

for(初始化;布尔表达式;更新)
{
//代码语句
}

在IDEA里输入100.for会快速自动生成下面的代码

        for (int i = 0; i < 100; i++) {
            
        }
 

作业一:计算1-100之间 奇数的和 与 偶数的和

 public static void main(String[] args) {
        int sum_even = 0;
        int sum_odd = 0;
        int i=0;
        for(i=0;i<=100;i++)
            if (i%2!=0) sum_even += i;
        else sum_odd += i;
        System.out.println("sum_even= "+sum_even);
        System.out.println("sum_odd= "+sum_odd);
    }

作业二:用while或for循环输出1-1000之间能被5整除的数,并且每行输出三个

程序举例

public class testjan05 {
    public static void main(String[] args) {
        int m=0;
        for (int i = 1; i <= 1000; i++) {

            if (i%5==0)
                {
                    if (m<2) {
                        System.out.print(i+"\t");
                        m=m+1;
                        //System.out.println("m="+m);
                        }
                    else if (m==2){
                        System.out.print(i);
                        m=0;
                        System.out.println();
                        //System.out.println("m="+m);
                    }

                }


        }
    }
    

}

输出结果:

5	10	15
20	25	30
35	40	45
50	55	60
65	70	75
80	85	90
95	100	105
110	115	120
125	130	135
140	145	150
155	160	165
170	175	180
185	190	195
200	205	210
215	220	225
230	235	240
245	250	255
260	265	270
275	280	285
290	295	300
305	310	315
320	325	330
335	340	345
350	355	360
365	370	375
380	385	390
395	400	405
410	415	420
425	430	435
440	445	450
455	460	465
470	475	480
485	490	495
500	505	510
515	520	525
530	535	540
545	550	555
560	565	570
575	580	585
590	595	600
605	610	615
620	625	630
635	640	645
650	655	660
665	670	675
680	685	690
695	700	705
710	715	720
725	730	735
740	745	750
755	760	765
770	775	780
785	790	795
800	805	810
815	820	825
830	835	840
845	850	855
860	865	870
875	880	885
890	895	900
905	910	915
920	925	930
935	940	945
950	955	960
965	970	975
980	985	990
995	1000	
Process finished with exit code 0


注意
\t是制表符,相当于tab
\n是换行符
这里用的是 System.out.print而不是 System.out.println,因为 System.out.println是输出自带换行的。

作业三:打印九九乘法表

使用 for循环嵌套

运行结果需要类似这样

1X1=1;
1X2=2;2X2=4;
1X3=3;2X3=6;3X3=9;
1X4=4;2X4=8;3X4=12;4X4=16;
1X5=5;2X5=10;3X5=15;4X5=20;5X5=25;
1X6=6;2X6=12;3X6=18;4X6=24;5X6=30;6X6=36;
1X7=7;2X7=14;3X7=21;4X7=28;5X7=35;6X7=42;7X7=49;
1X8=8;2X8=16;3X8=24;4X8=32;5X8=40;6X8=48;7X8=56;8X8=64;
1X9=9;2X9=18;3X9=27;4X9=36;5X9=45;6X9=54;7X9=63;8X9=72;9X9=81;

public class testjan05 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {

                System.out.print(j+"X"+i+"="+(i*j)+"\t");
                if (i==j) System.out.println();
            }
        }
    }
    

}

增强for循环

for(声明语句:表达式)
{ //代码句子 }

遍历数组元素
例如,将num里面的数字遍历给b
int num[]={10,20,30,40,50};
for (int b:num){
System.out.print(b);
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用区域限定在循环语句块

将数组的元素依次输出:


public class testjan05 {
    public static void main(String[] args) {
        int a[]={1,2,3,4,5,6,7,8,9,10};
        for (int i = 0; i < 10; i++) {
            System.out.print("a["+i+"]="+a[i]+"; ");
        }
        System.out.println("========>");
        for (int m : a) {
            System.out.print(m+"\t");
        }

    }
    
}


运算结果:


a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; a[5]=6; a[6]=7; a[7]=8; a[8]=9; a[9]=10; ========>
1	2	3	4	5	6	7	8	9	10	
Process finished with exit code 0

break & continue

break用于强制退出循环,不执行循环剩余的语句
continue用于终止某次循环,跳过循环中尚未执行的语句,接着进行下一次是否执行循环的判定。

break举例


public class testjan05 {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(i);
            if (i==30){break;}
        }

    }

}

输出结果:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Process finished with exit code 0

continue举例

要求:0-100输出,每行输出10个数:


public class testjan05 {
    public static void main(String[] args) {
        for (int i = 0; i <= 100; i++) {

            if(i!=0 && i%10==0) {
                System.out.println(i);
                continue;
            }
            System.out.print(i+"\t");

        }

    }

}

运行结果:


0	1	2	3	4	5	6	7	8	9	10
11	12	13	14	15	16	17	18	19	20
21	22	23	24	25	26	27	28	29	30
31	32	33	34	35	36	37	38	39	40
41	42	43	44	45	46	47	48	49	50
51	52	53	54	55	56	57	58	59	60
61	62	63	64	65	66	67	68	69	70
71	72	73	74	75	76	77	78	79	80
81	82	83	84	85	86	87	88	89	90
91	92	93	94	95	96	97	98	99	100

Process finished with exit code 0

练习:计算出101-150之间所有的质数(素数),就是除了1和其本身,不能被别人整除的数字。

思路:把被除数从2一直换到(这个数-1),发现除完每一个数,余数都不是零,全都除不尽,这个数就是我们要找的数。

再思考:是否一定要遍历整个N=2-150的范围呢?其实是不是遍历到N/2就可以了?
(【因为N==(N/2)*(2)】2是最小的一个除数,对应的N/2就是这个数字最大的一个除数,如果可以被N/2整除,那么这个数字肯定不是我们要的数,直接排除掉)

继续思考:是不是除数还能再简化?

public class testjan05 {
    public static void main(String[] args) {
        boolean label=false;
        for (int i = 101; i <= 150; i++) {
            for (int j = 2; j < i/2; j++) {
                if(i%j==0)
                {label=false;break;
                }
                else {label=true;continue;}
            }
            if (label==true) System.out.print(i+"\t");
        }


    }

}

运算结果:


101	103	107	109	113	127	131	137	139	149	
Process finished with exit code 0
  • 使用label紧跟着break/continue改善程序
    (注意:这其实不是一个很好的处理办法,容易让程序变得混乱且难以阅读)

continue/break除了单独使用,也可以在continue/break后面跟一个自定义label,系统见到continue label或者break label,则会即刻搜索程序中label的位置,然后立即跳到那里去。
比如下面的例子label叫做flag_1 和 flag_2。

重要重要重要,label必须在loop条件下才能使用,这包括while,for等
但不包括单一的if else因为它不算loop
实在要在if else里面用,可以用while(true)将if else程序块都包裹起来

public class testjan05 {
    public static void main(String[] args) {
        boolean label=false;
       flag_1: for (int i = 101; i <= 150; i++) {
        flag_2:    for (int j = 2; j < i/2; j++) {
                if(i%j==0)
                    continue flag_1;
                else if (i%j!=0 && j==(i/2)-1 )
                    System.out.print(i+"\t");
                else
                    continue flag_2;
            }
        }
    }
}


运算结果:

101	103	107	109	113	127	131	137	139	149	
Process finished with exit code 0


流程控制练习

练习打印出一个三角形,以5行为例,在想要的三角形处打印*或者1,其余地方打印零或者空格

类似这样
000010000
000111000
001111100
011111110
111111111

参考做法

import java.util.Scanner;

public class testjan05{
    public static void main(String[] args) {
   
        System.out.println("please enter how many lines u'd like to generate:"+"\t");
        Scanner x = new Scanner(System.in);
        int l =0;
        if(x.hasNextInt()){l=x.nextInt();}
        else System.out.println("invalid input;");
        
     
        for (int i = 0; i < l; i++) {
            for (int j = 0; j < 2*l-1; j++) {
                if(j<(l-1)-i || j>=l+i)
                    System.out.print("0");
                else
                    System.out.print("1");
            }
            System.out.println();
        }


    }
}



实际输出:

please enter how many lines u'd like to generate:	
6
00000100000
00001110000
00011111000
00111111100
01111111110
11111111111

你可能感兴趣的:(java,学习,python)