Java中的用户交互和流程控制

Java中的用户交互和流程控制

Scanner类

Scanner类全称是java.util.Scanner是Java5的新特征,包含许多方法用来保存和调用用户的输入。

next和hasnext

示例代码:

import java.util.Scanner;
​
public class Demo1 {
    public static void main(String[] args) {
        Scanner test = new Scanner(System.in);
        System.out.println("请输入文字:");
        if (test.hasNext()){
            String str = test.next();
            System.out.println("您输入的文字是:"+str);
        }
        test.close();
    }
}

 

运行结果:

 


nextLine和hasNextLine

示例代码:

import java.util.Scanner;
​
public class Demo1 {
    public static void main(String[] args) {
        Scanner test = new Scanner(System.in);
        System.out.println("请输入文字:");
        if (test.hasNextLine()){
            String str = test.nextLine();
            System.out.println("您输入的文字是:"+str);
        }
        test.close();
    }
}

 

运行结果:

 


简单用法和注意事项

  • hasNext和hasNextLine

    • 两者都是用来判断用户是否有输入数据。

    • 使用分别搭配next和nextLine使用。

    • Scanner类还有很多hasNext方法用来判断用户输入的字符类型。

  • next和nextLine(常用)

    • 两者都是用来将用户的输入保存下来,并且得到有效字符后才可以结束输入。

    • 区别是next以空格为结束符,nextLine以回车为结束符。

    • next不能得到带有空格的字符串,输入字符之前的空白next方法会将其自动去掉。

  • 除了nextLine以外,Scanner类还有很多方法供我们使用,比如nextInt用来判断用户输入的是否为一个整数,nextDouble用来判断用户输入的是否为小数等。与之对应的还有对应的has方法。

  • System.in

    • 真正接收用户输入的方法,以上示例中将用户的输入封装成Scanner类。

  • close

    • Scanner是一个IO流相关的类,凡是这种与IO流相关的类使用结束后必须关闭掉,否者会一直占用资源。

 

流程控制

顺序结构

最基本的运行结构,没有特别指明的情况下,所有代码从上至下一句一句运行。

顺序结构是最简单的算法结构,它是若干个依次执行的处理步骤组成的,也是任何一个算法或程序都离不开的基本结构。

示例代码:

public class Demo2 {
    public static void main(String[] args) {
        System.out.println("这是第一行代码");
        System.out.println("这是第二行代码");
        System.out.println("这是第三行代码");
        System.out.println("这是第四行代码");
        System.out.println("这是第五行代码");
        System.out.println("这是第六行代码");
    }
}

 

运行结果:

 

选择结构

if单选择结构

示例代码:

import java.util.Scanner;
​
public class Demo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入字符:");
        if (scanner.hasNextInt()) {
            int a = scanner.nextInt();
            System.out.println("您输入的数字是:" + a);
        }
        scanner.close();
    }
}

 

  • 只有当用户输入的是整数类型时scanner.hasNextInt为true才会执行if中的语句。

  • 只有if作为判断依据的布尔表达式为true才会执行if中的语句。

  • 注意:if中的语句在程序中有可能不执行

 


 

if双选择结构

示例代码:

import java.util.Scanner;
​
public class Demo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入字符:");
        if (scanner.hasNextInt()) {
            int a = scanner.nextInt();
            System.out.println("您输入的数字是:" + a);
        } else {
            String str = scanner.nextLine();
            System.out.println("您输入的字符是:" + str);
        }
    }
        scanner.close();
}

 

  • 当用户输入整型数据时scanner.hasNextInt为true,执行if中的语句。否则,执行else中的语句。

  • 注意:if-else结构的语句一定会被执行,满足if条件执行if,不满足则执行else。

 


 

if的嵌套和多选择结构

if嵌套(二分法)示例代码:

import java.util.Scanner;
​
/**
 * 判断学生的成绩,满分100分成绩80分以上(含80分)则成绩为A
 * 80分以下,60分以上(含60分)则成绩为B
 * 60分以下,40分以上(含40分)则成绩为C
 * 40分以下,则成绩为不及格,需要参加补考。
 */
public class Demo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生的分数:");
        if (scanner.hasNextInt()) {
            int score = scanner.nextInt();
            if (score <= 100) {
                if (score >= 80) {
                    System.out.println("您的成绩为A");
                } else {
                    if (score >= 60) {
                        System.out.println("您的成绩为B");
                    } else {
                        if (score >= 40) {
                            System.out.println("您的成绩为C");
                        } else {
                            System.out.println("您的成绩不及格,请参加补考。");
                        }
                    }
                }
            } else {
                System.out.println("您的成绩异常,请联系该科目老师检查!");
            }
        } else {
            System.out.println("您的输入有误,程序退出!!");
        }
        scanner.close();
    }
}

 

以上代码为if嵌套,可以将以上代码改为if-else-if。

if-else-if示例代码:

import java.util.Scanner;
​
/**
 * 判断学生的成绩,满分100分成绩80分以上(含80分)则成绩为A
 * 80分以下,60分以上(含60分)则成绩为B
 * 60分以下,40分以上(含40分)则成绩为C
 * 40分以下,则成绩为不及格,需要参加补考。
 */
public class Demo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生的分数:");
        if (scanner.hasNextInt()) {
            int score = scanner.nextInt();
            if (score <= 100) {
                if (score >= 80 && score <= 100) {
                    System.out.println("您的成绩为A");
                } else if (score >= 60) {
                    System.out.println("您的成绩为B");
                } else if (score >= 40) {
                    System.out.println("您的成绩为C");
                } else {
                    System.out.println("您的成绩不及格,请参加补考。");
                }
            } else {
                System.out.println("您的成绩异常,请联系该科目老师检查!");
            }
        } else {
            System.out.println("您的输入有误,程序退出!!");
        }
        scanner.close();
    }
}

 

  • 注意:一个if语句可以有若干个else if语句,但是最多只能有一个else语句,else语句在所有else if语句之后。一旦有一个else if语句被执行则所有else if和else语句跳过执行。

 


 

switch多选择结构

switch case,多选择结构的另一种实现方式。

因为JDK7的新特性,表达式的结果可以是字符串。

示例代码:

import java.util.Scanner;
​
/**
 * 使用Switch做一个简易的成绩查询系统。
 * 输入学生的姓名,如果匹配成功则返回对应的成绩
 */
public class Demo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生的姓名:");
        if (scanner.hasNextLine()) {
            String name = scanner.nextLine();
            switch (name) {
                case "寅大猛":
                    System.out.println("您的成绩为"+76);
                    break;
                case "李二狗":
                    System.out.println("您的成绩为"+42);
                    break;
                case "吴三桂":
                    System.out.println("您的成绩为"+100+",恭喜满分!");
                    break;
                default:
                    System.out.println("该生成绩未录入或输入有误,如需要帮助请联系负责老师:136xxxxxx");
            }
        }
        scanner.close();
    }
}
  • break在switch结构中表示结束switch结构,执行break后程序不会再执行剩下的case甚至default。

  • Switch结构经常用来比对一些数据是否符合我们需要的值。

 

循环结构

不同于顺序结构和选择结构这种只能被执行一次,循环结构在循环条件满足前可以循环多次。

while循环

在程序中while是最基本的循环。

示例代码:

import java.util.Scanner;
​
/**
 * 让用户输入两个整数,计算两个整数的和。
 */
public class Demo1 {
    public static void main(String[] args) {
        int num1 = 0;       //定义一个整型用来接收用户的第一个数字。
        int num2 = 0;       //定义一个整型用来接收用户的第二个数字。
        Demo1 demo = new Demo1();       //实例化Demo1类,用以调用方法。
        Scanner scanner = new Scanner(System.in);       
        //实例化Scanner类,用以调用方法。
​
        while (true) {      //While循环,强制要求用户输入。
            System.out.println("请输入第一个整数:");
            if (scanner.hasNextInt()) {     //判断用户输入的数据是否为整型。
                num1 = scanner.nextInt();       //用户输入数据类型正确,赋值给num1。
                break;      //赋值结束后跳出循环。
            } else {        //用户输入数据类型不正确的情况下,进入else分支。
                System.out.println("数据类型错误,请重新输入:");        
                //反馈用户信息,让用户重新输入数字。
                scanner.next();     //开始重新等待用户输入。
            }
        }
        
        //第二个数字的While循环,所有代码参照第一个数字。
        while (true) {
            System.out.println("请输入第二个整数:");
            if (scanner.hasNextInt()) {
                num2 = scanner.nextInt();
                break;
            } else {
                System.out.println("数据类型错误,请重新输入:");
                scanner.next();
            }
        }
​
        System.out.println("您输入的两个数和为:" + demo.sum(num1, num2));        //调用方法计算两数之和。
        scanner.close();        //程序结束,释放内存。
    }
​
    /**
     * @param a 整数a
     * @param b 整数b
     * @return a与b的和
     */
    public int sum(int a, int b) {      //方法,两个形参,接收主程序传进来的参数。
        int sum = a + b;        //计算两个形参的和。
        return sum;     //返回该值。
    }
}

以上代码中while在用户没有按照要求输入时让用户重新输入,直到用户输入正确为止。

  • 当while循环条件的布尔表达式为true时执行循环内语句。

  • 执行到最后一句代码后返回while语句重新判断循环条件。

  • 只有当while的循环条件为flase时或在循环内执行到break时才会结束循环。

  • 我们绝大多数情况是需要循环满足某个条件后停止下来的,以让程序不至于卡死。

 


 

do-while循环

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

while循环示例代码:

/**
 * 计算整数1-100的和,每计算一个数生成当前结果。
 */
public class Demo3 {
    public static void main(String[] args) {
        int i = 0;
        int sum = 0;
​
        while (i < 100 && i!=0) {
            i++;
            sum = sum + i;
            System.out.println("i的值为:" + i + ",sum的值为" + sum);
        }
    }
}

因为i的初始值为0,不满足循环条件,所以以上代码什么都不会输出。

 

do-while循环示例代码:

package com.rsp2012.continuation;
​
/**
 * 计算整数1-100的和,每计算一个数生成当前结果。
 */
public class Demo3 {
    public static void main(String[] args) {
        int i = 0;
        int sum = 0;
​
        do {
            i++;
            sum = sum + i;
            System.out.println("i的值为:" + i + ",sum的值为" + sum);
        } while (i < 100 && i!=0);
    }
}

因为i在循环判断的时候值为1,所以程序正常运行。

运行结果:

 

由以上两个示例得出while和do-while最重要的区别:

  • do-while循环是先执行循环内的语句,再判断循环条件。

  • while循环是先判断循环条件,满足再执行循环内的语句。

 


 

for循环

虽然所有循环结构都可以用while和do-while来表示,但Java提供了第三种循环方式,即for循环,for循环的出现使得一些循环结构变得简单。

for循环对比while循环示例代码:

/**
 * 在控制台打印1-100的所有的整数(包含1和100)。
 */
public class Demo4 {
    public static void main(String[] args) {
        int a = 1;      //初始化
        while(a<=100){       //循环条件
            System.out.println(a);      //循环体
            a++;        //迭代
        }
        
            //初始化;循环条件;迭代
        for (int i=1;i<=100;i++){
            System.out.println(i);      //循环体
        }
    }
}

 

for循环的特点:

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

  • for循环的循环次数和循环条件的迭代是在执行前就确定的。而while循环的循环次数和循环条件的迭代都在循环体中。

  • for循环的执行步骤:

    1. 程序执行到for循环的时候,for循环的初始化会最优先执行。初始化可以是一个或多个循环控制的变量,也可以是空语句。

    2. 初始化执行结束后,检测布尔表达式的值。如果值为true,则循环体执行。

    3. 执行一次循环后,循环控制变量迭代。

    4. 再次检查布尔表达式的值,如果值依然为true,则循环体继续执行。

  • for的死循环:

    public class Demo5 {
        public static void main(String[] args) {
            for (; ; ) {
    ​
            }
        }
    }
  • 热知识:在IDEA中输入循环次数.for可以直接调出for循环的框架

 


 

break和continue

break

示例代码:

/**
 * 打印1-10的所有整数(包含1和10)
 */
public class Demo13 {
    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            if (i == 5) {
                i++;
                break;
            }
            System.out.println(i);
            i++;
        }
    }
}

以上示例打印结果0、1、2、3、4,因为在5的时候跳出了该循环。

break可以用在任何循环的循环体部分,用来强行跳出循环

跳出循环后不执行循环中的剩余语句,也在switch中用来结束switch结构。

 


 

continue

示例代码:

/**
 * 打印1-10的所有整数(包含1和10)
 */
public class Demo13 {
    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            if (i == 5) {
                i++;
                continue;
            }
            System.out.println(i);
            i++;
        }
    }
}

以上示例打印结果0、1、2、3、4、6、7、8、9、10,因为在5的时候终止了这次循环,没有执行后面的语句。

continue同break一样,它可以用在任何循环的循环体部分,用来终止这次循环

终止循环后会跳过本次循环未执行的语句,直接执行循环判定开始下一次循环。

 


 

goto拓展(万恶之源)

本章节仅用于拓展了解,实际工作中不建议使用

本章节仅用于拓展了解,实际工作中不建议使用

本章节仅用于拓展了解,实际工作中不建议使用

代码示例:

/**
 * 计算201-300之间的所有质数
 */
public class Demo14 {
    public static void main(String[] args) {
        outer:for (int i = 201; i <= 300; i++) {
        //遍历201-300之间的每一个数
            for (int j = 2; j < i/2; j++) {
                //用当前i的值依次与j的值进行取余
                if(i%j==0){
                    //当i的值能被j整除时,结束本次循环
                    continue outer;
                    //continue结束后跳到标签处
                }
            }
            System.out.println(i);
        }
    }
}

goto语句很早就在程序设计语言中出现和使用,尽管goto仍然是Java的一个保留关键字,但并未在语言中得到正式使用。

然而,在break和continue这两个关键字上,我们仍能看出一些goto的影子,即带标签的break和continue。

标签指后面跟着一个冒号的标识符,例如:label:

对Java来说唯一能用到标签的地方是循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue语句通常只会中断当前循环,但如果和标签一起使用,则会中断到存在标签的地方。

 


 

循环练习作业

分别计算1-100中所有奇数和偶数的和(包含1和100)
/**
 * 分别计算1-100中所有奇数和偶数的和(包含1和100)
 */
public class Demo5 {
    public static void main(String[] args) {
        int oddSum = 0;
        int evenSum = 0;
​
        for (int i = 0; i <= 100; i++) {
            if (i % 2 != 0) {
                oddSum += i;      //oddSum = oddSum + i;
            } else {
                evenSum += i;     //evenSum = evenSum +i;
            }
        }
        System.out.println("1-100中所有奇数的和为:" + oddSum);
        System.out.println("1-100中所有偶数的和为:" + evenSum);
    }
}

 


 

用while输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
/**
 * 用while输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
 */
public class Demo6 {
    public static void main(String[] args) {
        int a = 0;      //控制循环的变量,主要输出结果。
        int i = 1;      //控制换行的变量
        while (a <= 1000) {     //while循环1-1000的所有数
            if ((a % 5 == 0) && (a != 0)) {     //判断当前数能被5整除并不为0
                if ((i % 3 != 0)) {     //判断当前行输出是否足3
                    System.out.print(a + "\t");     //输出结果不换行
                } else {
                    System.out.println(a);      //输出结果并换行
                }
                i++;        //不管是否换行,每次输出后i++
            }
            a++;        //循环迭代
        }
    }
}

 


 

用for输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
/**
 * 用for输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
 */
public class Demo7 {
    public static void main(String[] args) {
        for (int i = 0, a = 0; i < 1000; i++) {     //变量i控制循环,a控制打印数量
            if ((i != 0) && (i % 5 == 0)) {     //判断当前数是否为0与能否被5整除
                if ((a != 0) && (a % 3 == 0)) {     //判断当前输出数量是否为0能否被3整除
                    System.out.print(i+"\t");        //当前打印数量不能被3整除的情况
                } else {
                    System.out.println(i);      //当前打印数量能被3整除的情况
                }
                a++;        //不管能否被3整除,只要打印了数据则a++;
            }
        }
    }
}

 


 

使用for打印九九乘法表
/**
 * 使用for打印九九乘法表
 */
public class Demo8 {
    public static void main(String[] args) {
        for (int i = 1, b = 1; i <= 9; ) {      //i为乘数1,b为乘数2
            if (b < 9) {        //乘数2小于9的情况,打印后不换行。
                System.out.print(b + "x" + i + "=" + i * b + "\t");
                b++;
            } else if (b == 9) {        //乘数2等于9的情况,打印后换行。
                System.out.println(b + "x" + i + "=" + i * b);
                b++;
            } else {        //乘数2大于9的情况。
                i++;        //乘数1自增。
                b = 1;      //乘数2回到1。
            }
        }
    }
}

运行结果:

 


 

修改排版

/**
 * 使用for打印九九乘法表
 */
public class Demo9 {
    public static void main(String[] args) {
        for (int i = 1, b = 1, n = 1; i <= 9; ) {       //i为乘数1,b为乘数2,n为换行变量。
            if (b < 9) {        //乘数2小于9的情况,打印后不换行。
                System.out.print(i + "x" + b + "=" + i * b + "\t");
                b++;
            } else if (b == 9) {        //乘数2等于9的情况,打印后换行。
                System.out.println(i + "x" + b + "=" + i * b);
                b++;
                n++;        //每换行一次n+1。
            } else {        //乘数2大于9的情况。
                i++;        //乘数1自增。
                b = n;      //乘数2回到n,第几行b就从几开始。
            }
        }
    }
}

打印结果:

 


 

使用for循环嵌套:

/**
 * 使用for打印九九乘法表
 */
public class Demo10 {
    public static void main(String[] args) {
        for (int i = 9; i >= 1; i--) {
            for (int b = 1; b <= i; b++) {
                System.out.print(b + "x" + i + "=" + i * b + "\t");
            }
            System.out.println();
        }
    }
}

运行结果:

 


 

结构拓展

增强for循环

Java5引入的主要用于数组或集合的增强型for循环,简化了遍历数组和集合的代码量。

for循环代码示例:

public class Demo12 {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50, 60, 70, 80};
​
        for (int i = 0; i < numbers.length; i++) {
            System.out.println(numbers[i]);
        }
        //返回结果为数组中的所有元素。
    }
}

i为数组的索引,length是一个属性,表示集合或数组的长度。

索引总是从0开始的。

numbers[i]其实就是通过索引取集合中的数据。

 

增强for循环代码示例:

public class Demo11 {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50, 60, 70, 80};
​
        for (int x : numbers) {
            System.out.println(x);
        }
        //返回结果为数组中的所有元素。
    }
}

x必须与数组或集合的类型相匹配。

增强for中其实就是把集合或数组中的每个元素都赋值给x

 

for和增强for的区别

  • 任何循环都可以用for循环运行,但不一定能用增强for运行。

  • 增强for循环内部其实是使用了Iterator迭代器遍历的,只能遍历数组和实现了Interable接口的集合。

  • 普通for循环可以获取元素索引,增强for循环无法获取元素索引

  • 增强for循环比普通for循环代码更简洁。

posted @   乌鸦の学习  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示