Java流程控制

Scanner对象

  • 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是 Java5的新特征,我们可以通过Scanner类来获取用户的输入。

  • 基本语法

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

  • next()

    • 一定要读取到有效字符后才可以结束输入。

    • 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。

    • 只有输入有效字符后才能将其后面输入的空白作为分隔符或者结束符

    • next()不能得到带有空格的字符串

  • nextline()

  • 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。

  • 可以获得空白

  • close();

  • close只能关闭一次。

package com.scanner;

import java.util.Scanner;

public class Demo03 {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入数据:");

        //用户输入字符串
        String str = scanner.nextLine();

        System.out.println("输入的内容为:"+str);

        //凡是属于IO流的类如果不关闭会一直占用资源。
        scanner.close();
    }
}

简单计算实例:

import java.util.Scanner;

public class Demo05 {
    public static void main(String[] args) {
        //我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果.
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数字,输入字母结束");
        //和
        double sum = 0;
        //计算输入了多少个数字.
        int m = 0;
        //通过循环判断是否还有输入,并在里面对每一次进行求和和统计。
        while (scanner.hasNextDouble()){
            double x = scanner.nextDouble();
            m++;
            sum = sum+x;
            System.out.println("已经输入了"+m+"个数,其和为"+sum);
        }
        System.out.println(m+"个数的和为"+sum);
        System.out.println(m+"个数的平均值是"+(sum/m));
        scanner.close();
    }
}

注意点

next()方法和nextLine()方法的连用

package day06;

import java.util.Scanner;

public class Test01 {
	public static void main(String[] args) {
		String s1,s2;
		Scanner sc=new Scanner(System.in);
		System.out.print("请输入第一个字符串:");
		s1=sc.next();
		//sda
		System.out.print("请输入第二个字符串:");
		s2=sc.nextLine();
		System.out.println("输入的字符串是:"+s1+" "+s2);
		//请输入第二个字符串:输入的字符串是:sda 
	}



​ 可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int,nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。
​ 可以改成

package day06;

import java.util.Scanner;

public class Test01 {
	public static void main(String[] args) {
		
	
		String s1,s2;
		Scanner sc=new Scanner(System.in);
		System.out.print("请输入第一个字符串:");
		s1=sc.next();
		//sda
		System.out.print("请输入第二个字符串:");
		sc.nextLine();//每次使用前清空
		s2=sc.nextLine();
		System.out.println("输入的字符串是:"+s1+" "+s2);
		//请输入第二个字符串:输入的字符串是:sda 
	}
}

三大流程结构

顺序结构

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

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

    顺序结构

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

选择结构

if单选择结构

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

  • 语法

    单选择结构

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

if双选择结构

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

  • 语法

    双选择结构

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

    import java.util.Scanner;
    
    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();
        }
    }
    
    

if多选择结构

  • 我们发现刚才的代码不符合实际情况,真实的情况还可能存在ABCD,存在区间多级判断。比如90-100就是A,80-90 就是B..等等,在生活中我们很多时候的选择也不仅仅只有两个,所以我们需要一个多选择结构来处理这类问题!

  • 语法
    多选择结构

    if(布尔表达式1){
        //如果布尔表达式1为true将执行的语句
    }else if(布尔表达式2){
        //如果布尔表达式2为true将执行的语句
    }else if(布尔表达式3){
        //如果布尔表达式3为true将执行的语句
    }else{
        //如果以上布尔表达式都为false将执行的语句
    }
    
  • 实例

    import java.util.Scanner;
    
    public class IFDemo03 {
        public static void main(String[] args) {
            //根据分数给成绩分级
            Scanner scanner = new Scanner(System.in);
            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结构

  • 使用嵌套的if...else语句是合法的。也就是说你可以在另一个if 或者else if语句中使用if或者else if 语句。你可以像if语句一样嵌套else if...else。

  • 语法

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

    package day03;
    //猜拳游戏
    import java.util.Random;
    import java.util.Scanner;
    
    public class Demo03 {
    	public static void main(String[] args) {
    		//用户输入
    		System.out.println("石头,剪刀,布,选一个");
    		Scanner sc = new Scanner(System.in);
    		String guss = sc.nextLine();
    		int gussInt=0;
    		switch (guss) {
    		case "石头":
    			gussInt= 0;
    			System.out.println("你出的是石头");
    			break;
    		case "剪刀":
    			gussInt= 1;
    			System.out.println("你出的是剪刀");
    			break;
    		case "布":
    			gussInt= 2;
    			System.out.println("你出的是布");
    			break;
    		default:
    			System.out.println("输入错误");
    			System.exit(0);
    			break;
    		}
    		
    		//电脑随机出拳
    		Random r = new Random();
    		int realint = r.nextInt(3);
    		switch (realint) {
    		case 0:
    			System.out.println("电脑出拳是石头");
    			break;
    		case 1:
    			System.out.println("电脑出拳是剪刀");
    			break;
    		case 2:
    			System.out.println("电脑出拳是布");
    			break;
    		}
    		
    		// 判断输赢
    		if (gussInt==0) {
    			if (realint==0) {
    				System.out.println("平局");
    			}else if (realint==1) {
    				System.out.println("你赢了");
    			}else {
    				System.out.println("电脑赢了");
    			}
    		}
    		if (gussInt==1) {
    			if (realint==1) {
    				System.out.println("平局");
    			}else if (realint==2) {
    				System.out.println("你赢了");
    			}else {
    				System.out.println("电脑赢了");
    			}
    		}
    		if (gussInt==2) {
    			if (realint==2) {
    				System.out.println("平局");
    			}else if (realint==1) {
    				System.out.println("你赢了");
    			}else {
    				System.out.println("电脑赢了");
    			}
    		}
    		System.out.println("游戏结束");
    		sc.close();
    	}
    

switch多选择结构

  • 多选择结构还有一个实现方式就是switch case语句。

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

  • switch语句中的变量类型可以是:

    • byte、short、int或者char。
    • 从Java SE 7开始,switch支持字符串String类型了。
    • 同时case标签必须为字符串常量或字面量。
  • 语法

    switch(表达式){
        case value :
            //语句
            breaK;//可选
        case value :
            //语句
            breaK;//可选
        //你可以有任意数量的case语句
        default://可选
            //语句
    }
    

循环结构

while循环

  • while是最基本循环,他的结构为:

    while(布尔表达式){
        //循环内容
    }
    
  • 只要布尔表达式为true,循环就会一直执行下去。

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

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

  • 循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死奔溃!

  • 实例1

    public class WhileDemo01 {
        public static void main(String[] args) {
            //计算1~100的和
            int i = 1;
            int sum = 0;
            while (i<=100){
                sum = sum + i;
                i++;
            }
            System.out.println(sum);
        }
    }
    
  • 实例2

    public class WhileDemo02 {
        public static void main(final String[] args) {
            while (true){
                System.out.println("每隔1秒输出一次");
            try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

do...while循环

  • 对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

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

  • 语法

do{
    //代码语句
}while(布尔表达式);
  • while和do...while的区别

  • while先判断后执行。dowhile是先执行后判断!

  • 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);
                a++;
            }while (a<0);
        }
    }
    //while先判断后执行。dowhile是先执行后判断!
    

For循环

  • 虽然所有循环结构都可以用while或者do...while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。

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

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

  • 语法

for(初始化;布尔表达式;更新){
    //代码语句
}
  • 关于for循环的说明

最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。再次检测布尔表达式。循环执行上面的过程。

for(;;){
    //这也是种死循环
}
  • 实例

    • 计算1~100的奇数和和偶数和

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

      public class ForDemo03 {
          public static void main(String[] args) {
              for (int i=1;i<=1000;i++){
                  if (i%5==0){
                      if (i%15==0){
                          System.out.print(i+" ");
                          System.out.println(" ");
                      }else{
                          System.out.print(i+" ");
                      }
                  }
              }
          }
      }
      
    • 打印九九乘法表

      public class ForDemo04 {
          public static void main(String[] args) {
              for (int i = 1; i <= 9; i++) {
                  for (int j = 1; j <= 9 & i>=j; j++) {
                      System.out.print(i+"*"+j+"="+(i*j)+" ");
                  }
                  System.out.println(" ");
              }
          }
      }
      
      
  • 增强for循环

    • Java5引入了一种主要用于数组或集合的增强型for循环。

    • 语法

      for(声明语句:表达式){
          //代码句子
      }
      
    • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。

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

    • 实例

      public class ForDemo05 {
          public static void main(String[] args) {
              int[] numbers = {10,20,30,40,50};//定义了一个数组
      
              for (int i = 0;i<5;i++){
                  System.out.println(numbers[i]);
              }
              
              System.out.println("====================");
              
              //遍历数组的元素
              for (int x : numbers){
                  System.out.println(x);
              }
          }
      }
      
      

break、continue

  • break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)

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

  • 关于goto关键字

  • goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。

  • “标签”是指后面跟一个冒号的标识符,例如: label:

  • 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另-个循环,由于break和continue关键字通常只中断当前循环。但若随同标签使用,它们就会中断到存在标签的地方。

  • 实例

    public class BreakDemo01 {
        public static void main(String[] args) {
            int i = 0;
            while (i < 100){
                i++;
                System.out.print(i+" ");
                if (i==10){
                    break;
                }
            }
        }
    }
    /* 输出结果为
    1 2 3 4 5 6 7 8 9 10 30
     */
    
    public class ContinueDemo01 {
        public static void main(String[] args) {
            int i = 0;
            while (i<100){
                i++;
                if (i%10==0){
                    System.out.println();
                    continue;
                }
                System.out.print(i+" ");
            }
        }
    }
    /* 输出结果为
    1 2 3 4 5 6 7 8 9
    11 12 13 14 15 16 17 18 19
    21 22 23 24 25 26 27 28 29
    31 32 33 34 35 36 37 38 39
    41 42 43 44 45 46 47 48 49
    51 52 53 54 55 56 57 58 59
    61 62 63 64 65 66 67 68 69
    71 72 73 74 75 76 77 78 79
    81 82 83 84 85 86 87 88 89
    91 92 93 94 95 96 97 98 99
     */
    
  • 标签实例

    public class LabelDemo01 {
        public static void main(String[] args) {
            //打印101-150之间所有的质数
            int count = 0;
            outer:for (int i = 101; i < 150; i++) { 
                //outer:为一个标签
                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
     */
    

练习

  • 打印三角形 n行

    public class Triangle {
        public static void main(String[] args) {
            System.out.println("请输入打印几行三角形");
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            for (int i = 1; i <= n; i++) {
                for (int j = n; j >= i; j--) {
                    System.out.print(" ");
                    //打印最左侧n个空白
                }
                for (int j = 1; j <= i; j++) {
                    System.out.print("*");
                    //打印左侧至中间i个三角形
                }
                for (int j = 1; j <= i-1; j++) {
                    System.out.print("*");
                    //打印右侧i-1个三角形
                }
                System.out.println();
            }
        }
    }
    
    

附加

package day04;

public class Demo03 {
	public static void main(String[] args) {
		int i = 10;
		if (i!=10)//if、while可以控制之后一行代码,但是不能控制两行。
			System.out.println("aaa");
		System.out.println("bbb");
		while (i<15) 
			System.out.println(i);
		i++;
		
		//bbb
		//死循环 10
	}
}
posted @ 2021-08-06 17:13  beamsoflight  阅读(30)  评论(0)    收藏  举报