Day003 Java流程控制

Java流程控制

Scanner

  • 作用:通过Scanner获取用户的输入

  • 基本语法:

Scanner s = new Scanner(System.in);
  • 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据

  • 凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉

Scanner scanner = new Scanner(System.in);
scanner.close();
  • next():
  1. 一定要读取到有效字符后才可以结束输入
  2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
  4. next()不能得到带有空格的字符串
public class Demo01 {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("使用next方式接收:");

        //判断用户有没有输入字符串
        if (scanner.hasNext()) {
            //使用next方式接收
            String str = scanner.next();			//hello world
            System.out.println("输出的内容为:" + str);//hello
        }

        //凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉
        scanner.close();
    }
}
  • nextLine():
  1. 以Enter为结束符,nextLine()方法返回的是输入回车之前的所有字符
  2. 可以获得空白
public class Demo02 {
    public static void main(String[] args) {
        //从键盘接收数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("使用nextLine方式接收:");

        //判断是否还有输入
        if (scanner.hasNextLine()) {
            String str = scanner.nextLine();		//hello world
            System.out.println("输出的内容为:" + str);//hello world
        }

        scanner.close();
    }
}
例子1
public class Demo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //从键盘接收数据
        int i = 0;
        float f = 0.0F;
        System.out.println("请输入整数:");
        if (scanner.hasNextInt()) {
            i = scanner.nextInt();
            System.out.println("整数数据:" + i);
        } else {
            System.out.println("输入的不是整数数据!");
        }
        System.out.println("请输入小数:");
        if (scanner.hasNextFloat()) {
            f = scanner.nextFloat();
            System.out.println("小数数据:" + f);
        } else {
            System.out.println("输入的不是小数数据!");
        }
        scanner.close();
    }
}
例子2
public class Demo02 {
    public static void main(String[] args) {
        //输入多个数字,求其总和与平均数,每输入一个数字用回车去人,通过输入非数字来结束输入并输出执行结果
        Scanner scanner = new Scanner(System.in);
        //和
        double sum = 0;
        //计算输入了多少个数字
        int m = 0;
        //通过循环判断是否还有输入,并在里面对每一次进行求和和统计
        while (scanner.hasNextDouble()) {
            double x = scanner.nextDouble();
            ++m;
            sum += x;
            System.out.println("你输入了第" + m + "个数字,当前的结果sum=" + sum);
        }
        System.out.println(m + "个数的和为:" + sum);
        System.out.println(m + "个数的平均值为:" + (sum / m));
        scanner.close();
    }
}

顺序结构

  • 一句一句执行
  • 顺序结构是最简单的算法结构
  • 它是任何一个算法都离不开的一种基本算法结构

If选择结构

单选择结构

  • 作用:判断一个东西是否可行,然后去执行
  • 基本语法:
if(布尔表达式){
	//如果布尔表达式为true将执行的语句
}
public class IfDemo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入内容:");
        String s = scanner.nextLine();

        //equals: 判断字符串是否相等
        if (s.equals("Hello")) {
            System.out.println(s);
        }

        System.out.println("end");

        scanner.close();
    }
}

双选择结构

  • 作用:用于表示”如果......否则......“

  • 语法:

if(布尔表达式){
	//如果布尔表达式为true将执行的语句
}else{
	//如果布尔表达式为false将执行的语句
}
public class IfDemo02 {
    public static void main(String[] args) {
        //考试分数大于60分及格,小于60分不及格

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入成绩:");
        int score = scanner.nextInt();

        if (score >= 60) {
            System.out.println("及格");
        } else {
            System.out.println("不及格");
        }

        scanner.close();
    }
}

多选择结构

  • 作用:有时两种选择不够,实际需要应对多钟情况,例如将成绩10090分评为A,9080评为B,80~70评为C,等等......

  • 语法:

if(布尔表达式 1){
	//如果布尔表达式1为true将执行的语句
}else if(布尔表达式 2){
    //如果布尔表达式2为true将执行的语句
}else if(布尔表达式 3){
    //如果布尔表达式3为true将执行的语句
}else{
	//如果以上布尔表达式都为false将执行的语句
}
public class IfDemo03 {
    public static void main(String[] args) {
        //考试分数大于60分及格,小于60分不及格
        Scanner scanner = new Scanner(System.in);

        /*
        if语句至多有1个else语句,else语句在所有的else if语句后面
        if语句可以有若干个else if语句,它们必须再else语句之前
        一旦其中一个else if语句检测为true,其他的else if以及else语句就会跳过执行
         */

        System.out.println("请输入成绩:");
        int score = scanner.nextInt();

        if (score == 100) {
            System.out.println("恭喜满分");
        } else if (score < 100 && score >= 90) {
            System.out.println("A级");
        } else if (score < 90 && score >= 80) {
            System.out.println("B级");
        } else if (score < 80 && score >= 70) {
            System.out.println("C级");
        } else if (score < 70 && score >= 60) {
            System.out.println("D级");
        } else if (score < 60 && score >= 0) {
            System.out.println("不及格");
        } else {
            System.out.println("成绩不合法");
        }

        scanner.close();
    }
}

嵌套结构

  • 作用:用于应对更为复杂的情况

  • 语法:

if(布尔表达式 1){
	//如果布尔表达式1为true将执行的语句
	if(布尔表达式 2){
    	//如果布尔表达式2为true将执行的语句
	}
}

Switch选择结构

  • 作用:判断一个变量与一系列值中某个值是否相等,每个值成为一个分支

  • 语法:

switch(expression){
	case value:
		//语句
		brreak;//可选
	case value:
		//语句
		brreak;//可选
	//可以有任意数量的case
	default:	//可选
		//语句
}
  • switch语句中的变量类型可以是:
    • byte,short,int,char
    • 从JavaSE 7开始,switch支持字符串String类型
    • case标签必须为字符串常量或字面量
public class SwitchDemo01 {
    public static void main(String[] args) {
        //case穿透:没有break的话会继续执行后面的case
        //switch 匹配一个具体的值
        char grade = 'C';

        switch (grade) {
            case 'A':
                System.out.println("优秀");
                break;//可选
            case 'B':
                System.out.println("良好");
                break;
            case 'C':
                System.out.println("及格");
                break;
            case 'D':
                System.out.println("再接再厉");
                break;
            case 'E':
                System.out.println("挂科");
                break;
            default:
                System.out.println("未知等级");
        }
    }
}
public class SwitchDemo02 {
    public static void main(String[] args) {
        String name = "莉莉卡";

        //jdk7特性,表达式结果可以使是符串
        //字符的本质还是数字
        switch (name) {
            case "杰达鲁":
                System.out.println("杰达鲁");
                break;
            case "莉莉卡":
                System.out.println("莉莉卡");
                break;
            default:
                System.out.println("未知名字");
                break;
        }
    }
}

反编译

  • java->class(字节码文件)->反编译(IDEA)

将out文件夹中的.class文件移入代码路径,在IDEA中打开即可查看反编译后的文件

While循环

  • 作用:用于重复执行命令
  • 基本语法 :
while(布尔表达式){
	//循环内容
}
  • 先判断条件,再进入循环执行内容

  • 只要布尔表达式为true,就会一直执行下去

  • 大多数情况会让循环停止下来,需要一个让表达式失效的方式来结束循环

  • 少部分情况 需要循环一直执行,例如服务器的请求响应监听

    正常业务编程中应该尽量避免死循环,会影响程序性能或者造成程序卡死崩溃

计算1+2+3+...+100:

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

Do...While循环

  • 先执行一遍内容,再判断条件
  • 至少会执行一次内容
  • 基本语法:
do{
	//循环内容
}while(布尔表达式)
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);//输出0
            a++;
        } while (a < 0);
    }
}

For循环

  • 作用:是支持迭代的一种通用结构,是最有效、最灵活的循环结构
  • 基本语法:
for(初始化;布尔表达式;更新){
	//魂环内容
}
public class ForDemo01 {
    public static void main(String[] args) {
        int a = 1;//初始化条件

        while (a <= 100) {
            System.out.println(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++) {}
         */
    }
}

增强For循环

  • 作用:主要用于数组或集合的增强型For循环
  • 基本语法:
for(声明语句:表达式){
	//循环代码
}
  • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
  • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法
public class ForDemo05 {
    public static void main(String[] args) {
        //定义一个数组
        int[] numbers = {10, 20, 30, 40, 50};

        //遍历数组的元素
        for (int x : numbers) {
            System.out.print(x+" ");//10 20 30 40 50
        }
        System.out.println("\n"+"------------");
        for (int i = 0; i < 5; i++) {
            System.out.print(numbers[i]+" ");//10 20 30 40 50
        }
    }
}

练习

  • 计算0到100之间的奇数和偶数的和
public class ForDemo02 {
    public static void main(String[] args) {
        int oddSum = 0;//奇数和
        int evenSum = 0;//偶数和

        for (int i = 0; i <= 100; i++) {
            if (i % 2 != 0) {
                oddSum += i;
            } else {
                evenSum += i;
            }
        }
        System.out.println("奇数和:" + oddSum);//2500
        System.out.println("偶数和:" + evenSum);//2550
    }
}
  • 用while或for循环是输出1~100之间能被5整除的数,并且每行输出3个
public class ForDemo03 {
    public static void main(String[] args) {
        for (int i = 1; i <= 1000; i++) {
            if (i % 5 == 0) {
                System.out.print(i + "\t");
            }
            if (i % (5 * 3) == 0) {
                System.out.println();
                //System.out.print("\n");
            }
        }

        int j = 1;
        while (j <= 1000) {
            if (j % 5 == 0) {
                System.out.print(j + "\t");
            }
            if (j % (5 * 3) == 0) {
                System.out.println();
            }
            j++;
        }
    }
}
  • 打印九九乘法表
public class ForDemo04 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + (j * i) + "\t");
            }
            System.out.println();
        }
    }
}

break continue goto

break

  • 在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。
public class BreakDemo {
    public static void main(String[] args) {
        //i等于30时退出循环
        int i = 0;
        while (i < 100) {
            i++;
            System.out.println(i);
            if (i == 30) {
                break;
            }
        }
        System.out.println("结束");
    }
}

continue

  • continue用于循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
public class ContinueDemo {
    public static void main(String[] args) {
        //不输出10的倍数
        int i = 0;
        while (i < 100) {
            i++;
            if (i % 10 == 0) {
                System.out.println();
                continue;
            }
            System.out.print(i + "\t");
        }
    }
}

goto

  • goto是Java的一个保留字,但并未在语言中得到正式使用。但在break和continue上仍然能看出一些goto的影子---带标签的break和continue
  • “标签”是指后面跟一个冒号的标识符,例如:label
  • 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue通常只中断当前循环,但若随同标签使用,他们就会中断到存在标签的地方
public class LabelDemo {
    public static void main(String[] args) {
        //打印101~150之间所有的质数
        int count = 0;
        outer:
        for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    continue outer;
                }
            }
            System.out.print(i + " ");
        }
    }
}

练习

  • 打印5行三角形
public class TestDemo {
    public static void main(String[] args) {
        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("*");
            }
            System.out.println();
        }
    }
}
posted @ 2021-03-11 15:49  杰达鲁  阅读(25)  评论(0编辑  收藏  举报