while循环与for循环

1.基本框架

① 循环的初始化
while ( ②.循环继续的条件){
③循环体
④循环的步长
}
while(true){
①循环初始化
②循环继续的条件
③循环体
④循环的步长
}

要注意的是:用true写的循环体,在逻辑上是比较顺畅的,但是也是有一定的危险的,主要是因为它本身是一个死循环,需要在一些合适的时候跳出循环。

2、while循环的死循环

我们可以写代码举例如下:

public class Day02091 {

	public static void main(String[] args) {
		while (true) {
			System.out.println("年轻是美好的");
		}

	}

}

我们可以发现这是一个死循环,如果我们不认为的关闭,他会一直运行下去,不会跳出这个循环圈。

3、for循环的死循环

我们可以写代码举例如下:

public class Day02092 {

	public static void main(String[] args) {
		for (; ;) {
			System.out.println("年轻是美好的");
		}

	}

}

我们可以发现这是一个死循环,如果我们不认为的关闭,他会一直运行下去,不会跳出这个循环圈。

需要注意的是:这样的格式只适用于for循环,在while循环中并不适用。

第三章练习题

3.9

snakemake while语句_i++

代码如下:

import java.util.Scanner;

public class Day39 {

	public static void main(String[] args) {
		//提示用户输入x坐标与y坐标
		System.out.print("Enter a point's x- and y- coordinates :");
		Scanner in = new Scanner(System.in);
		double x = in.nextDouble();
		double y = in.nextDouble();
		if (x > 0 && x <200 && y < -0.5 * x + 100 && y > 0) {
			System.out.println("The point is in the triangle");
		}else {
			System.out.println("The point is not in the triangle");
		}
	}

}

这道题主要就是确定这个三角形的区域 ;if(x > 0 && x <200 && y < -0.5 * x + 100 && y > 0)每一个所指的具体范围如下图所示:

snakemake while语句_java_02

snakemake while语句_System_03

其代码如下:

import java.util.Scanner;

public class Day310 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		//提示用户输入大矩形的宽度和高度以及大矩形的点坐标
		System.out.print("Enter r1's center x-,y-coordinates,width,and height:");
		
		double x1 = in.nextDouble();
		double y1 = in.nextDouble();
		double w1 = in.nextDouble();
		double h1 = in.nextDouble();
		//提示用户输入小矩形的宽度和高度以及小矩形的点坐标
		System.out.print("Enter r2's center x-,y-coordinates,width,and height:");
		
		double x2 = in.nextDouble();
		double y2 = in.nextDouble();
		double w2 = in.nextDouble();
		double h2 = in.nextDouble();

		double rightmin = (w1 - w2) / 2 + x1 ;
		double leftmin = -(w1 - w2)  / 2-  x1 ;
		double upmin = (h1 - h2) / 2+ y1 ;
		double downmin = -(h1 - h2) / 2- y1 ;
		
		double rightmax = (w1 + w2) / 2 + x1 ;
		double leftmax = -(w1 + w2)  / 2-  x1 ;
		double upmax = (h1 + h2) / 2+ y1 ;
		double downmax = -(h1 + h2) / 2- y1 ;
		
		if (x2 < rightmin && x2 > leftmin && y2 < upmin && y2 > downmin) {
			System.out.print("r2 is inside r1");
		}else if (y2 > rightmax || y2 < leftmax || y2 > upmax || y2 < downmax) {
			System.out.print("r2 is overlaps r1");
		}else {
			System.out.print("r2 don't overlaps r1");
		}
		
	}

}

这个代码输入的数字过多,所以一定要注意输入的顺序。

snakemake while语句_i++_04

其中红色的矩形表示的是:小矩形在大矩形内。

蓝色矩形表示的是:小矩形与大矩形不相交。

3.11

snakemake while语句_snakemake while语句_05

代码可以写为:

import java.util.Scanner;

public class Day311 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入一些数字:");//提示用户输入一些数字
		int positives = 0;
		int negatives = 0;
		double sum = 0;
	
		while (true) {
			int num = in.nextInt();//定义输入的数字为num
			if (num != 0) {
				sum += num;
				if (num > 0) {
					positives ++;
				}else {
					negatives ++;
				}
			}else {
				break;
			}
		}
		if (positives + negatives == 0) {
			System.out.print("输入的数字只有零");
		}else {
			System.out.print("整数的个数 :" + positives);
			System.out.print("负数的个数 : " + negatives);
			System.out.print("总和为 : " +sum);
			System.out.print("平均数为 : "+ sum /(positives + negatives));
		}
	}

}

这里需要注意的是:输入的时候必须在while循环了,否则就只能输入一个数字不能继续进行下去了。

因为题中说为0的值不计入运算,因此当这个数字为0时就用break跳出循环区。

snakemake while语句_java_06

其代码如下:

import java.util.Scanner;
public class Day312{
public static void main(String[] args) {
    
		Scanner in = new Scanner(System.in);
		//输入两个数
		System.out.print("请输入两个整数 : ");
		int n1 = in.nextInt();
		int n2 = in.nextInt();
		int gcd = 1;
		for (int k = n1 < n2 ? n1: n2 ;k >= 1;k--) {
			if (n1 % k == 0 && n2 % k == 0) {
				 gcd = k;
				
				break;
			}
		}
		System.out.print(n1 +" 与 "+ n2 + "的最大公约数为 : " + gcd);
	}

}

求两个数的最大公因数时:我们可以先比较出两个数中较小的那个数,将其赋值给min。

因为公因数需要最大的,所以我们可以将它从最大的数字开始循环,直到大于1为止。

求出最大的公约数之后就不用计算其它数值,则直接跳出循环,用break。 

代码运行的结果为:

请输入两个整数 : 5 15
 5 与 15的最大公约数为 : 5

snakemake while语句_snakemake while语句_07

编写代码如下:

import java.util.Scanner;
class Day313{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        while(true){
            for(int i=2;i<=num;i++){
                if(num%i==0){
                    System.out.print(i+" ");
                    num=num/i;
                    break;
                }
            }
            if(num==1){
                break;
            }
        }
    }
}

因为输入的数字可能为1,但1只有1 * 1 因此不满足条件。

需要在前面运用while循环让1也包含在这个循环内

snakemake while语句_java_08

其代码如下:

import java.util.Scanner;
class Day314{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入行数:");
        int line=scanner.nextInt();
        for(int i=1;i<=line;i++){
            for(int k=1;k<=(line-i);k++){
                if(line<10){
                    System.out.print("  ");
                }else{
                    System.out.print("   ");
                }
            }
            for(int x=-(i-1);x<=i-1;x++){
                if(line<10){
                    System.out.printf("%-2d",Math.abs(x)+1);
                }else{
                    System.out.printf("%-3d",Math.abs(x)+1);
                }
            }
            System.out.println();
        }
    }
}

snakemake while语句_i++_09

其代码如下:

class Day315{
    public static void main(String[] args){
        for(int i=1;i<=6;i++){
            for(int j=1;j<=i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int j=1;j<=7-i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int k=1;k<=6-i;k++){
                System.out.print("  ");
            }
            for(int j=i;j>=1;j--){
                System.out.print(j+" ");
            }
            System.out.println();
        }
        System.out.println("==========");
        for(int i=1;i<=6;i++){
            for(int k=1;k<=i-1;k++){
                System.out.print("  ");
            }
            for(int j=1;j<=7-i;j++){
                System.out.print(j+" ");
            }
            System.out.println();
        }
    }
}

3.16

snakemake while语句_i++_10

其代码如下:

class Day316{
    public static void main(String[] args){
        for(int i=1;i<=8;i++){
            for(int k=1;k<=8-i;k++){
                System.out.print("    ");
            }
            for(int x=-(i-1);x<=i-1;x++){
                System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
            }
            System.out.println();
        }
    }
}

snakemake while语句_snakemake while语句_11

先定义boolean 来确定是否是素数

让i来确定2~1000这些数字,j来做i的因子,如果满足i%j==0就不是素数

最后,别忘记让a的值重新定义为true。

其代码如下:

public class Day317 {

	public static void main(String[] args) {
		boolean a = true;
		int count = 0;
		for (int i = 2 ;i <= 1000;i++) {  	//确定2~1000之间的每个数
			for (int j = 2;j < i;j++) {//2~1000之间每次除的数字,是判断是否是素数
				if (i % j == 0) {
					a = false;
				}
			}
			if (true) {
				count++;
				System.out.print(i+" ");
			}
			a = true;
			if (count % 8 == 0) {
				System.out.println();
			}
			
		}

	}

}

snakemake while语句_i++_12

这道题需要先输入i ,然后需要定义一个取反的变量,再把它代入循环即可。

其代码为:

import java.util.Scanner;

public class Day318 {

	public static void main(String[] args) {
		Scanner in  = new Scanner(System.in);
		System.out.print("请输入一个数字 : ");
		int i = in.nextInt();
		double sum = 0.0;
		int k = 1;//取反
		double a = 0.0;
		for (int j = 1;j <= i;j += 2) {
			sum = 1.0 / j * k;
			a += sum;
			k = -k;
		}
		System.out.print(4 * a);
		
	}

}

snakemake while语句_System_13

十进制转换2进制的方法:对输入的这个数一直除以2,直到这个数变成零为止,每次除的余数自下向上的读取就是这个数转换为2进制的结果。

这里运用了一个binStr表示的是直接加上前面的数值

snakemake while语句_i++_14

代码如下:

import java.util.Scanner;
class Day323{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        String binStr="";
        while(true){
            binStr=num%2+binStr;//"1100"
            num/=2;
            if(num==0){
                break;
            }
        }
        System.out.println(binStr);
    }
}

3.24

snakemake while语句_snakemake while语句_15

 

因为要输入一些数字,切要对这些数字判断最大值。所以将num = in.nextInt();写道循环里面

如果为0,则直接break 跳出这个循环

如果这个数出现第一次,则将count = 1,第二次甚至多次出现,就对这个数出现的次数加一。

 

其代码如下:

import java.util.Scanner;

public class Day324 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入一些数字");
		int max = 0;//将最大的值赋给max
		int count = 0;//计算最大的数值循环多少次
		
		int num ;
		while (true) {
			num = in.nextInt();
			if (num == 0) {
				break;
			}else if (num > max) {
				max = num;
				count = 1;
			}else if (num == max) {
				count ++;
			}
		}
		System.out.print(max + "有" + count + "个" );

	}

}