Scanner 与 流程控制

Scanner 与 流程控制

狂神说Java BV12J41137hu

Scanner对象

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入

下面是创建 Scanner 对象的基本语法:

Scanner s = new Scanner(System.in);

通过 Scanner 类的 next()nextLine() 方法获取输入的字符串,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据:

  1. next()
import java.util.Scanner;

public class JavaScannerDemo {

    public static void main(String[] args) {
        // 扫描器对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("input:");
        //判断用户有没有输入字符串
        if (scanner.hasNext()) {
            // 使用nex接收输入
            String str = scanner.next();
            System.out.println("output:" + str);
        }

        //凡是属于IO流的类不关闭会一只占用资源,用完就要关闭
        scanner.close();
    }
}

    //input:
    //Hello, World!
    //output:Hello,
  1. nextLine()
import java.util.Scanner;

public class JavaScannerDemo02 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("input:");
        if (scanner.hasNextLine()) {
            // 当然,这里不if也是正常的行读取
            String str = scanner.nextLine();
            System.out.println("output:" + str);
        }
        scanner.close();

    }
}
    //input:
    //Hello, World!
    //output:Hello, World!

next() 与 nextLine() 区别

next():

  • 1、一定要读取到有效字符后才可以结束输入
  • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。(空格之后的全部舍弃掉
  • next() 不能得到带有空格的字符串

nextLine():

  • 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符
  • 2、可以获得空白。

输入 int 或 float

输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

import java.util.Scanner;

public class JavaScannerDemo03 {
    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();
    }
}

//请输入整数:
//8
//整数数据:8
//请输入小数:
//1.02
//小数:1.02


//请输入整数:
//10.1
//输入的不是整数数据
//请输入小数:
//小数:10.1

小练习

// 输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出结果

代码

由于有一点点 C 基础和 Python 基础,这类小代码还是很好写的 XD

package scanner.exercise;

import java.util.Scanner;

public class ScannerExerciseWithNumber {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 这里认为输入的数字有符号且有小数位
        // 并且认为每一行都是输入了合法的数字
        double sum = 0.0;
        double average = 0.0;
        double thisDoubleNumber = 0.0;
        int numberCounter = 0;
        System.out.println("请输入数字,回车接收,输入非数字则停止接收");
        while (scanner.hasNextDouble()) {
            thisDoubleNumber = scanner.nextDouble();
            sum += thisDoubleNumber;
            numberCounter ++;
        }
        scanner.close();
        if (numberCounter != 0) {
            // 该分支表明用户输入了至少一个数字,
            // 可以取均值
            average = sum / numberCounter;
        }
        System.out.println("输入的数字有\t" + numberCounter + "个" + "\n总和为:" + sum + "\n平均值为:" + average);
    }
}
//15.1
//10
//11.2
//【
//输入的数字有	3个
//总和为:36.3
//平均值为:12.1

流程控制

跟C 和 Python 基本一样,没啥好说的,记一下基本的书写规范

顺序结构

从上而下依次执行代码,基本算法结构

选择结构

if单选

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

if双选

if (布尔表达式) {
   //如果布尔表达式的值为true
}else{
   //如果布尔表达式的值为false
}

if多选

if (布尔表达式 1) {
   //如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2) {
   //如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3) {
   //如果布尔表达式 3的值为true执行代码
}else {
   //如果以上布尔表达式都不为true执行代码
}

嵌套if

if (布尔表达式 1) {
   ////如果布尔表达式 1的值为true执行代码
   if (布尔表达式 2) {
      ////如果布尔表达式 2的值为true执行代码
   }
}

switch多选

switch (expression) {
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}

*字符串匹配

Java SE7 开始,switch支持字符串匹配,这个过程是Java编译时将需要匹配的字符串转换成hash来做的

可以单击IDEA右上角的齿轮,选择Project Struc(Ctrl + Alt + Shift + S),找到Compiler output 后的路径

源码

package FluentControlDemo;

public class SwitchCaseDemo01 {
    public static void main(String[] args) {
        String name = "文字";
        switch (name) {
            case "PDF":
                System.out.println("是PDF文档");
                break;
            case "表格":
                System.out.println("是表格表当");
                break;
            case "演示":
                System.out.println("是演示文档");
                break;
            case "文字":
                System.out.println("是文字文档");
                break;
            default:
                System.out.println("啥都不是");

        }
    }
}

反编译源码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package FluentControlDemo;

public class SwitchCaseDemo01 {
    public SwitchCaseDemo01() {
    }

    public static void main(String[] args) {
        String name = "文字";
        byte var3 = -1;
        switch(name.hashCode()) {
        case 79058:
            if (name.equals("PDF")) {
                var3 = 0;
            }
            break;
        case 829104:
            if (name.equals("文字")) {
                var3 = 3;
            }
            break;
        case 912550:
            if (name.equals("演示")) {
                var3 = 2;
            }
            break;
        case 1109204:
            if (name.equals("表格")) {
                var3 = 1;
            }
        }

        switch(var3) {
        case 0:
            System.out.println("是PDF文档");
            break;
        case 1:
            System.out.println("是表格表当");
            break;
        case 2:
            System.out.println("是演示文档");
            break;
        case 3:
            System.out.println("是文字文档");
            break;
        default:
            System.out.println("啥都不是");
        }

    }
}

循环结构

while循环

while( 布尔表达式成立 ) {
  //循环内容
}

只要布尔表达式为 true,循环就会一直执行下去。需要在循环过程中让表达式失效以停止循环(通常)

do...while循环

为了满足:即使不满足布尔表达式,也要执行一次循环,这种奇葩的需求,提出了do..while循环

do {
       //代码语句
}while(布尔表达式成立);

while 和 do...while 布尔表达式的区别

没有区别! while怎么写 do while 就怎么写,这两个结构的区别仅仅在于不满足条件while不需要执行循环体,do...while需要执行一次循环体!

for循环

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

关于 for 循环有以下几点说明:

  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。

  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。

  • 执行一次循环后,更新循环控制变量。

  • 再次检测布尔表达式。循环执行上面的过程。

for (;;){}//死循环

for的IEAD快捷方法

100.for
    //fori 迭代条件为 i++
    //forr 迭代条件为 i++

循环结构练习

5的倍数

输出1-1000之间的能被5整除的数,并且每行输出3个

package FluentControlDemo;

public class ExerciseMode5LineIn3 {
    public static void main(String[] args) {
        //输出1-1000**之间**的能被5整除的数,并且**每行输出3个**

        for (int i = 1; i < 1000; i++) {
            if (i % 5 == 0) {
                System.out.print(i + "\t");
            }
            if (i % ( 5 * 3) == 0){
                System.out.print("\n");
            }
        }
    }
}

System.out.print() 输出完不换行

System.out.println() 输出完换行

九九乘法表

两重循环,还行比较简单

package FluentControlDemo;

public class MultiTable {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + "*" + j + "=" + i * j + "\t");
                if (i == j) {
                    System.out.print("\n");
                }
            }
        }
    }
}
//1*1=1	
//2*1=2	2*2=4	
//3*1=3	3*2=6	3*3=9	
//4*1=4	4*2=8	4*3=12	4*4=16	
//5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
//6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
//7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
//8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
//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	
//
//Process finished with exit code 0

增强for循环

主要为了遍历数组或是集合对象的,这里只是简单过一遍

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

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

表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

例子

public class Test {
   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};
 
      for(int x : numbers ){
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names ={"James", "Larry", "Tom", "Lacy"};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}

//10,20,30,40,50,
//James,Larry,Tom,Lacy,

可用于循环的关键字

break

break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。

break 跳出最里层的循环,并且继续执行该循环下面的语句。

break;

continue

continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。(还在当前循环)

在 for 循环中,continue 语句使程序立即跳转到更新语句。

在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

continue;

*goto

被时代抛弃的语句,java没有goto

暂时不需要去理解

想了解goto的抛弃历史可以参考 清华大学出版社-软件设计方法-王选

打印101-150之间的所有质数

package FluentControlDemo;

public class ContinueLabel {
    public static void main(String[] args) {
        outer: for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i / 2; j++) {
                if (i % j == 0) {
                    continue outer;
                }
            }
            System.out.print(i + " ");
        }
    }
}
//101 103 107 109 113 127 131 137 139 149 

流程控制练习题

打印三角形

package FluentControlDemo;

public class PrintTriangle {
    public static void main(String[] args) {
        int numberOfTriangleLength = 6;
        for (int i = 0; i < numberOfTriangleLength; i++) {
            for (int j = numberOfTriangleLength; j >= i ; j --) {
                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();
        }
    }
}
//       *
//      ***
//     *****
//    *******
//   *********
//  ***********
//
//Process finished with exit code 0
posted @ 2021-12-11 21:55  jentreywang  阅读(59)  评论(0)    收藏  举报