Java流程控制

111 阅读8分钟

Java流程控制

Scanner对象

在流程控制前,java给个我们提供了一个工具类,让我们可以获取用户的输入。java,util.Scanner事Java5的新特性,我可以通过Scanner类来获取用户的输入

基本使用:

Scanner s=new Scanner(System.in);  //System.in  和  System.out 相反,一个输入一个输出
s.close()  // 最后一定要关闭,因为所有的输入输出流都要进行关闭不然就会浪费资源的,一定记住

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

public class Scanners {
    public static void main(String[] args) {
        //Scanner 是用来控制和用户交互的,可以用来获取用户的输入
//        首先需要创建一个扫描器对象,用来接受键盘数据
        Scanner scan=new Scanner(System.in);
​
        //判断有没有下一个输入 用hasNext()
        if(scan.hasNextLine()){   //hasNextLine() 就是一行了
            //如果有下一个输入就用Next接受
            String str=scan.nextLine(); //等待用户输入后接受
            System.out.println("用户的输入是:"+str);  //以输入的空格结束
//            nextLine() 以enter键结束,可以接受空格的
            //当然可以你不用if判断也是可以的,直接等待用户输入
        }
        //所有的输入输出流都要进行关闭不然就会浪费资源的,一定记住
        scan.close();
    }
}
​
//运行结果为:
//    hello world
//用户的输入是:hello world

next() 与 nextLine()的区别

next():

  1. 一定要读取到有效字符后才可以结束输入
  2. 对输入的有效字符之前遇到的空白,next()方法会自动将其去掉, 例如:Hello world 那么读取到的就只有Hello
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
  4. next() 不能得到带空格的字符串

nextLine():

  1. 以enter 键为结束符,也就是说nextLine() 方法返回的是输入回车之前的所有字符
  2. 可以获得空白,就是不会以获取到空格结束

高级用法--规定输入数据的类型

//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车键确认,通过输入非数字
// 来结束输入并输出执行的结果
public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
​
    double sum=0; //总和
    int m=0; //个数
    while (scanner.hasNextDouble()){  //用循环判断是否还有double类型的输入,不满足就退出循环
       double mak= scanner.nextDouble();
       ++m;
       sum=sum+mak;
        System.out.println("你输入了第"+m+"个数据");
    }
    System.out.println("输入的总和为:"+sum);
    System.out.println("输入的平均数为:"+sum/m);
​
    scanner.close();
}

当然可以不止是nextDouble(),还有nextInt()等等

顺序结构

java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句的执行

顺序结构是最简单的算法结构

顺序结构1.png

语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构

选择结构

if单选择结构

我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示

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

if11.png

if双选择结构

那现在就有个需求,公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发,这样一个需求用一个if那就很难搞定了,就是需要有两个判断,一个双选择结构,所以就有了if ---else 结构

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

if222.png

if多选择结构

当然在生活中我们的很多选择都不仅仅是只有两个的,所以我们还需要一个多选择结构来处理这类问题

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

if33.png

注意的是:if语句至多有1个else语句,else语句在所有的else if语句之后。if语句可以有若干个else if语句,他们必须早else语句之前

一旦其中一个else if语句检测为true,其他的else if以及else 语句都将跳过执行

嵌套if结构

使用嵌套if....else 语句是合法的,也就是说可以在另外一个if 或者else if语句中使用if 或者else if 语句,这就是前台if

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

Switch多选择结构

多结构还有一个实现方式就是Switch case 语句

Switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支

switch(expression){
    case value:
        //语句
        break; //可选
    case value:
        //语句
        break; //可选
    default :  //可选,就是默认执行的
        //语句 
}

Switch语句中的变量类型可以是

  1. byte、short、int 或者是char
  2. 从javaSE7开始的
  3. Switch支持字符串String类型
  4. case标签必须为字符串常量或字面量

补充:反编译 java---class -------反编译(idea)

把class文件放入到idea

所以switch 是通过哈希值来比较的

if44.png

循环结构

while循环

white是最基本的循环,它的结构为

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

注意点:

  1. 只要布尔表达式为true,循环就会一直执行下去

  2. 我们大多数情况都是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环

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

  4. 循环条件一直为true就会造成无线循环(死循环),我们应该避免这种死循环发生,会影响程序的性能或者让程序卡死崩溃

           //while 的基本使用
             int i=0;
             int sum=0; //负责加数
    //         while(i<100){  //循环输出1-100
    //             i++;
    //             System.out.println(i);
    //         }
            while (i<=100){  //求出1加到100 的和
                sum+=i;
                i++;
            }
            System.out.println(sum); //5050
        }
    

do....while

对于while语句来说,如果不满足条件,就不能进入循环,但有时候我们需要即是不满足条件也至少执行一次

do...while 循环和while循环很相似,不同的是,do...while循环至少会执行一次

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

do...while 循环和while循环的区别

  1. while先判断在执行,do ....while是先执行后判断
  2. do....while总是保证循环体会被至少执行一次,这是主要的差别

for循环

for循环相较于white,结构变得更加简单

for循环语句是支持迭代的一种通用结构,是最有效的最灵活的循环结构

for循环的执行次数是在执行前就确定的:

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

一些小案例:

计算 0-100 之间奇数 和偶数的和:

public class fordemo {
    public static void main(String[] args) {
//        100.for +enter 可以快速的写出for循环
        //计算 0-100 之间奇数 和偶数的和
        int odd=0; //奇数
        int even=0;  //偶数
        for (int i = 0; i <=100; i++) {
            if(i%2==0){
                even+=i;
            }
            else{
                odd+=i;
            }
        }
        System.out.println("偶数的和为:"+even);
        System.out.println("奇数的和为:"+odd);
        //偶数的和为:2550
        //奇数的和为:2500
        System.out.println("====================");
​
​

用循环输出1-1000之间可以被5整除的数,并且每行输出3个

  for (int i = 0; i <= 1000; i++) {
            if(i%5==0){
                System.out.print(i+"\t");
            }
            if(i%(5*3)==0){
                System.out.println();
                // println 输出完后会自动换行
//                print  输出完后不会自动换行
            }
      /*
        0   
5   10  15  
20  25  30  
35  40  45  
    ......
980 985 990 
995 1000
         */

九九乘法口诀表:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <=i; j++) {
        System.out.print(i+"*"+j+"="+i*j+"\t");
    }
    System.out.println();
}
​
      /*
            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  
​
         */

增强for循环

java5引入一种主要用于数组或集合增强型for循环

格式如下:

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

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

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

public static void main(String[] args) {
​
    int[] sum={1,3,5,67,845,4};
​
    for (int key : sum){
        System.out.println(key);
    }
    /*输出结果
        1
        3
        5
        67
        845
        4
     */
}

break 与 continue

break: 在任何循环语句的主体部分,都可以用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句(通常和Switch语句一起使用)

continue: 用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定