【Java学习】5.Java流程控制

1、用户交互Scanner

Scanner对象

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

基本语法

Scanner s = new Scanner(System.in);//创建scanner对象

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

next()方法

  1. 一定要读取到有效字符后才可以结束输入。
  2. 对输入有效字符之前遇到的空格,next()方法会自动将其去掉。
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  4. next()不能得到带有空格的字符串。
public static void main(String[] args){
    //创建一个扫描器对象,用于接收键盘数据
    Scanner scanner = new Scanner(System.in);
    System.out.println("使用next方式接收:");
    
    //判断用户有没有输入字符串
    if(scanner.hasNext()){
        //使用next方式接收
        String str = scanner.next();
        System.out.println("输入的内容为:"+str);//输入:hello world,输出:hello
    }
    
    //凡是属于IO流的类,如果不关闭,会一直占用资源,要养成良好的习惯,用完就关掉
    scanner.close();
}

nextLine()方法

  1. 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
  2. 可以获取空格。
public static void main(String[] args){
    //创建一个扫描器对象,用于接收键盘数据
    Scanner scanner = new Scanner(System.in);
    System.out.println("使用nextLine方式接收:");
    
    //判断用户有没有输入字符串
    if(scanner.hasNextLine()){
        //使用hasNextLine方式接收
        String str = scanner.hasNextLine();
        System.out.println("输入的内容为:"+str);//输入:hello world,输出:hello world
    }
    
    //凡是属于IO流的类,如果不关闭,会一直占用资源,要养成良好的习惯,用完就关掉
    scanner.close();
}

补充:

  1. 获取更精确的数据类型

    Scanner scanner = new Scanner(System.in);
    int i = scanner.nextInt();//获取整数
    float f = scanner.nextFloat();//获取浮点数
    double d = scanner.nextDouble();//获取浮点数
    
  2. 输入数字,并求其总和与平均数

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        //定义变量:输入个数n、总和sum
        int n = 0;
        double sum = 0;
        System.out.println("请输入数字(按x可结束输入):");
        //通过循环判断是否还有输入,并在里面对每一次进行求和和统计
        while(scanner.hasNextDouble()){
            double x = scanner.nextDouble();
            n = n + 1;
            sum = sum + x;
            System.out.println("你输入了第"+n+"个数,当前总和为:"+sum);
        }
        System.out.println(n + "个数的和为:" + sum);
        System.out.println(n + "个数的平均值为:" + (sum/n));
        //关闭对象
        scanner.close();
    }
    

2、顺序结构

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

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

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

3、选择结构

if选择结构

if单选择结构

我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用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将执行的语句
    }else{
        //如果布尔表达式2为false将执行的语句
    }
}else{
    //如果布尔表达式1为false将执行的语句
    if(布尔表达式3){
    //如果布尔表达式3为true将执行的语句
    }else{
        //如果布尔表达式3为false将执行的语句
    }
}

switch多选择结构

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

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

语法:

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

switch语句中的变量类型和注意点:

  • byte、short、int或者char
  • 从JavaSE7开始,switch支持字符串String类型了
    字符串的本质还是数字,此处是通过hashCode来实现的
  • case标签必须为字符串常量或者字面量

补充:

  1. case穿透
    switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果没有break语句,那么就会从表达式的值相匹配的case标签处开始执行,一直执行到switch语句的末尾,这种从其中的一个case处开始,忽略后面的值的匹配,直接运行case的内容的现象就是穿透的现象。
    简单点说,就是case后没有break,执行完一个case并不退出switch,而是继续下一个case。

  2. 使用IDEA反编译
    反编译过程: java文件 — class(字节码文件)— 反编译为java文件
    操作步骤:

    1. 将需要反编译的class文件拷到目录下面,这里主要需要从文件夹的层面拷贝。

    2. 然后在IDEA界面双击打开即可。

      在这里插入图片描述补充:

      • IDEA同时查看两个文件:在这里插入图片描述

4、循环结构

while循环

最基本的循环,结构如下:

while(布尔布尔表达式){
    //循环内容
}
  • 只要表达是为true,循环就会一直执行下。
  • 我们大多数情况下,是会让循环停止下来,我们需要一个让表达式为false的方式来结束循环。
  • 少部分情况下,需要让循环一直执行,比如服务器的请求响应监听等。
  • 循环条件一直为true就会造成无限循环【死循环】,正常业务应该避免使用,会影响程序性能或者造成程序卡死崩溃!
  1. 计算1+2+3+…+100=?
public static void main(String[] args) {
    //计算1+2+3+...+100=?
    int i = 0;
    int sum  = 0;

    while (i<=100){
        sum = sum + i;
        i++;
    }
    System.out.println("1+2+3+...+100="+sum);
}
  1. 高斯的故事
    高斯有一个很出名的故事:用很短的时间计算出了小学老师布置的任务:对自然数从1到100的求和。他所使用的方法是:对50对构造成和101的数列求和(1+100,2+99,3+98……),同时得到结果:5050。这一年,高斯9岁。

do…while循环

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

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

do{
    //代码语句
}while(布尔表达式);//不满足条件,不再执行循环

while与do…while的区别:

  • while先判断后执行,do…while是先执行后判断。
  • do…while总是保证循环体被至少执行一次。
 public static void main(String[] args) {
     //计算1+2+3+...+100=?
     int i = 0;
     int sum  = 0;

     do{
         sum = sum + i;
         i++;
     }while (i<=100);//不满足条件,不再执行循环
     System.out.println("1+2+3+...+100="+sum);
 }

for循环

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

for循环的执行次数是在执行前就确定的。语法结构如下:

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

练习题:

  1. 计算0-100之间的奇数和与偶数和

    public static void main(String[] args) {
        //计算0-100之间的奇数和与偶数和
        //1、定义奇数和与偶数和
        int oddSum = 0;
        int evenSum = 0;
        //2、循环
        for (int i = 0; i <= 100; i++) {
            //3、判断数字奇偶
            if (i % 2 != 0) {//奇数
                oddSum += i;
            } else {//偶数
                evenSum += i;
            }
        }
        System.out.println("奇数和为:" + oddSum);//输出:奇数和为:2500
        System.out.println("偶数和为:" + evenSum);//输出:偶数和为:2550
    }
    
  2. 用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个

    public static void main(String[] args) {
        //用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个
        for (int i = 1; i <= 1000; i++) {
            if(i%5==0){//能被5整除
                System.out.print(i+"\t");//不换行输出
            }
            if (i%(5*3))==0){
                System.out.println();//换行输出
            }
        }
    }
    
  3. 打印九九乘法表

    public static void main(String[] args) {
        //打印九九乘法表
        //定义两个因数a、b
        int a;
        int b;
        for (int i = 1; i <= 9; i++) {
            a = i;
            for (int j = 1; j <= i; j++) {//这里布尔表达式j<=i中的i,可以改成9,即j<=9,就会打印一个完整的乘法表
                b = j;
                System.out.print(a + "*" + b + "=" + (a * b)+"\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
        */
    }
    

补充:

  1. IDEA中,快捷生成一个for循环

    //输入100.for,可以直接生成如下代码
    for (int i = 0; i < 100; i++) {
                
    }
    //输入fori,可以直接生成如下代码
    for (int i = 0; i < ; i++) {
                
    }
    

增强型for循环

主要作用:遍历数组和集合

Java5引入,主要用于数组或者集合的增强型for循环。Java增强型for循环语法格式如下:

for(声明语句:表达式){
    //代码句子
}
//举例:
public static void main(String[] args) {
    int[] arrs = {1,2,3,4,5};//定义一个数组
    //遍历数组
    for (int x:arrs) {
        System.out.print(x + "\t");//输出:1   2   3   4   5   
    }
}
  • 声明语句:
    声明新的局部变量,改变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块,其值与此时数组元素的值相等。
  • 表达式:
    表达式是要访问的数组名,或者是返回值为数组的方法。

5、break & continue

break

在任何循环语句的主体部分,均可以用break控制循环的流程。break用于强行退出整个循环,不执行循环中剩余的语句。

continue

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

goto

未在Java中得到正式使用。

6、练习

问题:使用*号,打印5行的三角形。

    *
   ***
  *****
 *******
*********
  • 思路1:
    图形是由空格*号拼起来,根据每行分成三段,第一部分为空格,第二部分为*,第三部分也是*号。

    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 = i; j > 0; j--) {//第二部分*号
                System.out.print("*");
            }
            for (int j = 1; j < i; j++) {//第三部分*号
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
  • 思路2:
    图形是由空格*号拼起来,根据每行分成两段,第一部分为空格,第二部分为*号。

    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*2 -1); j++) {//第二部分*号
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦游人布拿拿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值