草庐IT

Java学习之路:流程控制

Mjill 2023-04-16 原文

2022-10-11 10:58:41 ?

前言

本文开始流程控制方面的学习,主要包括用户交互和流程控制语句,适合新手学习。


1 用户交互Scanner

1.1 Scanner对象

Java提供了一个可以获取用户输入的Scanner工具类

基本语法:

Scanner s = new Scanner(System.in);

通过Scanner类的next()nextLine()方法获取输入的字符串,读取之前使用hasNext()hasNextLine()判断是否还有输入的数据。

next()nextLine()方法代码示例:

public class Demo01 {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("使用next方式接收:");

        //判断用户有没有输入字符串
        if (scanner.hasNext()==true){
            //使用next方式接收
            String str = scanner.next();
            System.out.println("输出的内容为:"+str);
        }
        //凡是属于IO流的类,如果不关闭会一直占用资源,要养成良好习惯,用完就关
        scanner.close();

    }
}

结果:

使用next方式接收:
hello world
输出的内容为:hello

【注意】:无法输出空格之后的数据

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

hasNext()hasNextLine()方法代码示例:

public class Demo02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("使用nextLine方式接收:");

        //判断是否还有输入
        if (scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println("输出的内容为"+str);
        }

        scanner.close();
    }
}

结果:

使用nextLine方式接收:
hello world
输出的内容为hello world
  • 以enter为结束符
  • 可以获取空格

 ③hasNextInt()hasNextFloat() 方法示例:

import java.util.Scanner;

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

 结果:

请输入整数:
10
整数数据:10
请输入小数:
0.6
小数数据:0.6

1.2 Scanner进阶

【练习题】:输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        //输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果
        Scanner scanner = new Scanner((System.in));

        //从键盘接收数据
        double sum = 0;
        //计算输入了多少个数字
        int m = 0;

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

        //通过循环判断是否还有输入,并在里面对每一次进行求和和统计
        while (scanner.hasNextDouble()){
            double x = scanner.nextDouble();
            m = m + 1; //m++
            sum = sum + x;
            System.out.println("你输入了第"+m+"个数据,当前结果sum="+sum);
        }

        System.out.println(m + "个数的和为" + sum);
        System.out.println(m + "个数的平均数为" + (sum / m));


        scanner.close();
    }
}

结果:

请输入数据:
10
你输入了第1个数据,当前结果sum=10.0
22
你输入了第2个数据,当前结果sum=32.0

222
你输入了第3个数据,当前结果sum=254.0
X
3个数的和为254.0
3个数的平均数为84.66666666666667

 【注意】对msum需要在全局上指定数据类型和初值,不能只在while局部里面赋初值,否则程序在输出时候会报错。


2 顺序结构

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


3 选择结构

3.1 if但选择结构

判断一个事情是否可行,然后才去执行,这样一个过程在程序中用if语句来表示。

语法:

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

import java.util.Scanner;

public class IfDemo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入内容:");
        String s = scanner.nextLine();

        //equals:判断字符串是否相等
        if (s.equals("Hello")){
            System.out.println(s);
        }
        System.out.println("END");

        scanner.close();
    }
}

结果:

请输入内容:
Hello
Hello
END

3.2 if双选择结构

当单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();
    }
}

结果:

请输入成绩:
60
及格

3.3 if多选择结构

当出现的选项不止两个时,需要一个多选择结构来处理这类问题。

语法:

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

import java.util.Scanner;

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

结果:

请输入成绩:
100
恭喜满分

3.4 嵌套的if结构

可以在if或者else if语句中嵌套使用if或者else if语句。

语法:

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

3.5 switch多选择结构

多选择结构也可以用switch case语句实现。switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

switch语句的变量类型】

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

语法:

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

示例代码:

public class SwitchDemo01 {
    public static void main(String[] args) {
        char grade = 'C';

        switch (grade){
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
                System.out.println("良好");
                break;
            case 'C':
                System.out.println("及格");
                break;
            case 'D':
                System.out.println("不及格");
                break;
        }
    }
}

结果:

及格

 【注意】

  •  存在case穿透
  • 不加break就会输出全部结果

 4 循环结构

4.1 while循环

语法:

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

【注意】

  • 只要布尔表达式为true,循环就回一直执行下去
  • 需要一个表达式失效的方式结束循环
  • 少部分情况需要循环一直执行
  • 循环条件一直为true会造成无限循环,应该避免这种情况,容易造成程序崩溃

【练习】计算1+2+3+...+100=?

public class WhileDemo01 {
    public static void main(String[] args) {
        int i = 1;
        int sum = 0;
        while (i<=100){
            sum = sum + i;
            i++;
        }
        System.out.println(sum);
    }
}

结果:

5050

4.2 do while循环

对于while语句而言,如果不满足条件,则不能进入循环。当需要即使不满足条件,也至少执行一次。do while循环会至少执行一次。

语法:

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

【while和do while的区别】

  • while先判断后执行,do while是先执行后判断
  • do while总是保证循环至少被执行一次
public class DoWhileDemo01 {
    public static void main(String[] args) {
        int i = 0;
        int sum = 0;

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

        System.out.println(sum);
    }
}

结果:

5050

4.3 for循环

for循环可以让程序变得更简单。

public class ForDemo01 {
    public static void main(String[] args) {
        int a = 0; //初始化条件
        while (a<=100){ //条件判断
            System.out.println(a); //循环体
            a+=10; //迭代条件
        }
        System.out.println("while循环结束");

        for (int i=0;i<=100;i+=10){
            System.out.println(i);
        }

        System.out.println("for循环结束");
    }
}

结果:

0
10
20
30
40
50
60
70
80
90
100
while循环结束
0
10
20
30
40
50
60
70
80
90
100
for循环结束

【练习】

① 计算0到100之间的奇数和偶数的和。

public class ForDemo02 {
    public static void main(String[] args) {
        //计算0到100之间的奇数和偶数的和
        int oddsum = 0;
        int evensum = 0;
        for(int i = 0;i <= 100;i+=1){
            if (i%2!=0){
                oddsum += i;
            }else{
                evensum += i;
            }
        }
        System.out.println("奇数的和:"+oddsum);
        System.out.println("偶数的和:"+evensum);
    }
}

结果:

奇数的和:2500
偶数的和:2550

② 用while或for循环输出1-1000之间能被5整除的数,并且每行输出8个。

public class Test01 {
    public static void main(String[] args) {
        //用while或for循环输出1-1000之间能被5整除的数,并且每行输出8个。
        int i = 1;
        while (i <= 1000){

           double a = i % 5;
            if (a == 0){
                if (i % 8 == 0){
                    System.out.println(i+" ");
                }else{
                    System.out.print(i+" ");
                }
            }
        i++;
        }
    }
}

结果:

5 10 15 20 25 30 35 40 
45 50 55 60 65 70 75 80 
85 90 95 100 105 110 115 120 
125 130 135 140 145 150 155 160 
165 170 175 180 185 190 195 200 
205 210 215 220 225 230 235 240 
245 250 255 260 265 270 275 280 
285 290 295 300 305 310 315 320 
325 330 335 340 345 350 355 360 
365 370 375 380 385 390 395 400 
405 410 415 420 425 430 435 440 
445 450 455 460 465 470 475 480 
485 490 495 500 505 510 515 520 
525 530 535 540 545 550 555 560 
565 570 575 580 585 590 595 600 
605 610 615 620 625 630 635 640 
645 650 655 660 665 670 675 680 
685 690 695 700 705 710 715 720 
725 730 735 740 745 750 755 760 
765 770 775 780 785 790 795 800 
805 810 815 820 825 830 835 840 
845 850 855 860 865 870 875 880 
885 890 895 900 905 910 915 920 
925 930 935 940 945 950 955 960 
965 970 975 980 985 990 995 1000 

③ 打印九九乘法表

public class Test02 {
    public static void main(String[] args) {
        //打印九九乘法表
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                if (i==j){
                    System.out.println(" "+i+"x"+j+"="+i*j);
                }else{
                    System.out.print(" "+i+"x"+j+"="+i*j);
                }
            }
        }
    }
}

结果:

 1x1=1
 2x1=2 2x2=4
 3x1=3 3x2=6 3x3=9
 4x1=4 4x2=8 4x3=12 4x4=16
 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

4.4 增强for循环

主要用于数组或集合。

语法:

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

【注意】

  • 声明新的局部变量,该变量的类型必须和数组元素的类型匹配;
  • 表达式是要访问的数组名,或者是返回值为数组的方法。
public class ForDemo03 {
    public static void main(String[] args) {
        int[] num = {10,20,30,40,50}; //定义一个数组

        for (int i = 0;i<5;i++){
            System.out.println(num[i]);
        }
        System.out.println("==================");

        //遍历数组的元素
        for (int x:num){
            System.out.println(x);
        }
    }
}

结果:

10
20
30
40
50
==================
10
20
30
40
50

5 break和continue语句

【break】

在任何循环语句的主体部分,均可用break控制循环的流程,可以强行退出循环。

【continue】

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

【goto】

带标签的breakcontinue


本章节学习结束,接下来再接再厉,加油✊!!!

有关Java学习之路:流程控制的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

随机推荐