Java 基础--流程控制

169 阅读7分钟

这是我参与 {第三届青训营-后端场}笔记创作活动的第4篇笔记~

Java 基础--流程控制

1. Scanner 获取用户输入

Java提供了Scanner工具类可以获取用户输入,java.util.Scanner是JDK5的新特性。

  • 基本语法

Scanner sc = new Scanner(System.in);

  • 通过Scanner的next()与nextLine()获取输入,hasNext()与hasNextLine()判断是否还有输入的数据。

    1. next()与hasNext()方法的测试:

      package com.zhang.scanner;
      
      import java.util.Scanner;
      
      public class Demo01 {
          public static void main(String[] args) {
              // 实例化scanner对象
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入数据:");
      
              if(scanner.hasNext()){
                  String str = scanner.next();
      
                  System.out.println("获取到的用户输入为:"+str);
              }
      
              // scanner 为IO资源,用完之后记得要进行关闭,避免资源浪费
              scanner.close();
          }
      }
      
      
      

      输出结果:

    这里注意到:使用next()方法只能获取到 通过空格对输入进行切分,得到第一个非空格串

    1. hasNextLine()与NextLine()的方法测试

      package com.zhang.scanner;
      
      import java.util.Scanner;
      
      public class Demo02 {
          public static void main(String[] args) {
              // 实例化scanner对象
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入数据:");
      
              if(scanner.hasNextLine()){
                  String str = scanner.nextLine();
      
                  System.out.println("获取到的用户输入为:"+str);
              }
      
              // scanner 为IO资源,用完之后记得要进行关闭,避免资源浪费
              scanner.close();
          }
      }
      
      
      

      输出结果:

    这里注意到nextLine()方法获取到的内容为回车符前面的所有输入

  • Scanner进阶使用

    Scanner除了获取字符串,还能通过判断输入是否为int 、float、double类型数据,从而进行下一步操作,搭配使用方法为:nextInt()&hasNextInt()、nextFloat()&hasNextFloat()、nextDouble&hasNextDouble();

    package com.zhang.scanner;
    
    import java.util.Scanner;
    
    public class Demo03 {
        public static void main(String[] args) {
            // 实例化Scanner对象用于获取用户输入数据
            Scanner scanner = new Scanner(System.in);
            // 用于存储scanner接收到的数据
            int i;
            float f;
            System.out.println("请输入数据:");
    
            if(scanner.hasNextInt()) {
                i = scanner.nextInt();
                System.out.println("输入的整数数据是" + i);
            }else{
                System.out.println("输入的数据不是整数!");
            }
    
            if(scanner.hasNextFloat()){
                f = scanner.nextFloat();
                System.out.println("输入的浮点型数据是"+f);
            }else{
                System.out.println("输入的数据不是浮点型");
            }
            // IO资源使用结束后关闭
            scanner.close();
        }
    }
    
    

    输出的结果是:

    问题:通过Scanner实现输入多个数据int,并求其和、平均值。

    package com.zhang.scanner;
    
    import java.util.Scanner;
    
    public class Demo04 {
        public static void main(String[] args) {
            // 实例化一个Scanner对象,用于获取用户输入
            Scanner scanner = new Scanner(System.in);
            // num用于记录输入了多少个数据 ,temp用于存储当前输入 ,sum用于求和
            int num = 0;
            int temp = 0;
            double sum = 0.0;
            System.out.println("请输入整数,输入非整数结束");
            while(scanner.hasNextInt()){
                temp = scanner.nextInt();
                num++; // ++num   num = num + 1   num += 1
                sum += temp;
                System.out.println("当前输入的第"+num+"个数是"+temp+",现在总和为"+sum);
            }
    
            System.out.println("一共输入了"+num+"个数");
            System.out.println(sum+"的平均值为"+sum/num);
    
            // 关闭IO资源,避免资源浪费
            scanner.close();
        }
    }
    
    

    代码测试:

2. 流程控制

顺序结构

Java的基本结构就是顺序结构,代码一句一句执行。

语句与语句之间,框与框之间都是按照顺序进行的,它是由若干个依次执行的处理步骤组成,任何一个算法都无法离开顺序结构。

public class Demo01{
    public static void main(String[] args){
        // 观察输出结果
        System.out.println("1");
        System.out.println("2");
        System.out.println("3");
        System.out.println("4");
    }
}

选择结构

if 条件结构 有单选结构、双选结构和多选结构,亦存在嵌套结构。

if的单选结构语法:

if(条件为真){

​		执行该部分语句

}

比如在程序中判断某个条件是否成立时,可以使用单选结构。

if的双选结构语法:

if (条件为真){

​	执行该部分语句

}else{

​	条件不真

}

比如判断语句存在非此即彼的情况。

if的多选结构语法:

if(条件为真){

​	执行该部分语句

}else if(条件为真){

​	执行该部分语句

}.....

else{

​	以上情况都不成立

}

​ 在程序判断中,必须成绩的评级A、B、C、D级等多种情况可以考虑使用多选结构,并且多选结构语法只执行其中一个,若某个条件判断为真,执行该部分语句后,跳过其他 else if 、else判断,并且 else放在多选结构的最后面。

嵌套if的语法:

if(条件为真){

​ if(条件为真){

​ ..... 里面可以继续嵌套使用,可以嵌套的内容有单选结构、双选结构和多选结构。

}

}

switch多选择结构

switch case 语句适用于判断一个变量与一系列值中的某个值是否相等,每个值称为一个分支。

语法:

switch(表达式){

	case value1:   

			语句

			break;		//可选
	case value2:
			语句
			break;		// 可选

...    可以有任意数量的case语句

default: 		可选
		// 语句
}

value支持 byte、short、int和char,但是从JDK7开始,支持String类型对象的比较。

如果不写break会出现case穿透现象,意思就是执行完该分支后继续向下执行

public class Demo{
    
    public static void main(String[] args){
        char grade = 'A';				
        switch(grade){
            case 'A': 
                System.out.println("A");
                break;
             case 'B': 
                System.out.println("B");
              case 'C': 
                System.out.println("C");
            default: 
                System.out.println("None");
            
        }
    }
}

grade = 'A'时,输出的值为 A,当 grade= 'B'时,输出的值有 B C None,这是因为case 'B'分支漏了写break,出现了case穿透现象。

2. 循环语句

1. while循环

语法结构

while(表达式){
    循环体语句
}

  • 只要表达式语句结果一直都为true,就会无休止的执行循环体语句,大多数情况下会选择在循环体内使得表达式失效;
  • 生活中服务器监听会一直循环执行;

思考使用while循环实现 1 + .... + 100=?

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

2. do-while循环

语法结构

do{
    循环体语句
}while(表达式)

  • do-while循环至少会执行循环体内的语句一次;
  • do-while循环是先执行循环体语句再执行表达式的判断
int a = 0;
while(a<0){
    System.out.println("hello");
}
==================================
do{
    System.out.println("world");
}while(a<0);

观察结果输出可以看出while循环与do-while循环的区别。

3. for循环

for循环使用起来比while和do-while更方便和简单,在编程中使用的更多

语法结构:

for(初始条件;判断表达式;更新){
    循环体语句
}

for循环执行规则:1、执行初试条件进行初始化;2、通过判断表达式进行判断;若结果为true则执行循环体语句,否则跳出for循环;3、更新表达式的值;4、重复2、3步骤。这个过程就好像心形一样,因此也叫做心形循环

再IDEA中 快速 输入 for(int i = 0; i < 100; i +++){} ----------------> 100.for

对比for与while循环:

public class Demo{
    public static void main(String[] args){
        int i = 0; 
        // 循环输出  0-99 的while方式
        while(i < 100 )
        {
            System.out.println(i++);
        }
        
        System.out.println("===============");
        // 循环输出 1-100 的for方式
        
        for(int i = 0; i < 100; i ++){
            System.out.println(i);
        }
    }
}

练习:

  1. 计算1-100所有奇数和偶数和并且输出;

  2. 实现99乘法表输出;

    package com.zhang.struct;
    
    import java.sql.SQLOutput;
    
    public class ForDemo01 {
        // 通过for循环实现0-100的奇数、偶数和
        public static void main(String[] args) {
            int evenNum = 0;    //偶数和
            int oddNum = 0;    //奇数和
    
            for (int i = 0; i <= 100; i++) {
                // 判断是否为偶数
                if(i%2==0){
                    // 统计偶数和
                    evenNum+=i;
                }else{
                    // 统计奇数和
                    oddNum+=i;
                }
            }
            System.out.println("1-100偶数和为:"+evenNum);
            System.out.println("1-100奇数和为:"+oddNum);
        }
    }
    
    
    
    package com.zhang.struct;
    
    public class ForDemo02 {
        // 通过嵌套for循环实现99乘法表
        public static void main(String[] args) {
            // 外层循环控制行数
            for (int i = 1; i < 10; i++) {
                // 内层循环控制列数
                for (int j = 1; j <= i; j++) {
                    // print & println 区别: print不会换行   println  equals to print("\n")
                    System.out.print(j + "*" + i + "=" + i * j+"\t");
                }
                
                System.out.println();
            }
        }
    }
    
    

    试想一个问题:for循环遍历数组里面的每一个元素

    int[] numbers = {1,2,3,4,5};  // 定义一个长度为5的int数组
    for(int i = 0; i < 5; i ++){
        System.out.println(numbers[i]);
    }
    
    

    这样子写起来比较麻烦也不方便比如需要知道数组长度,但是JDK5引入了新特性,增强型for循环。

    int[] numbers = {1,2,3,4,5};
    for(int x : numbers){
        System.out.println(x);
    }
    
    

    需要注意以下几点:

    1. 上式中的x数据类型要与数组类型相同;
    2. x是局部变量,作用域只在该循环体内;
    3. 增强型for重点是为了遍历数组和集合。

break&continue

break & continue 是Java保留的两个关键字,有特殊的含义。

  • break

    用于循环体内,控制循环体的流程,其目的是强制退出循环,剩余的循环语句全部不执行

  • continue

    用于循环体内,其目的是跳过本次循环,然后开始下一次循环

package com.zhang.struct;

public class Demo03 {
    public static void main(String[] args) {
        // break 结束循环
        for (int i = 0; i < 10; i++) {
            if(i == 5)break;
            System.out.print(i+"\t");
        }
        System.out.println();
        // continue 结束本次循环
        for (int i = 0; i < 10; i++) {
            if(i == 5)continue;
            System.out.print(i+"\t");
        }
    }
}


输出结果: