Java流程控制——the next day

发布时间 2023-06-13 18:00:12作者: 许玉玉

用户交互Scanner

Next和NextLine

Java5的新特性,带来了java.util.Scanner类,提供了人机交互的作用。我们可以通过它获取用户的输入

 public class Demo2 {
     public static void main(String[] args) {
         Scanner s = new Scanner(System.in);//创建一个扫描器对象,用于接收键盘数据
         s.next();//获取数据
         s.nextLine();//获取多行数据
         s.hasNext();//判断还是否有下一个数据
         s.hasNextLine();//判断还是否有下一行数据
    }
 }
  • next():

    • 一定要读取到字符才能结束输入。(才能使程序继续运行)

    • 不会记录空白,并且以空格为结束符。

    • 不能得到带有空格的字符串。

  • nextLine():

    • 以Enter为结束符。

    • 可以获得空白。

Scanner的获取类型

image-20230605180534853

Scanner类提供了多种方法,支持获取不同数据类型的数据。

例如:

 Scanner s = new Scanner(System.in);
 int a = s.nextInt();//获取一个int类型,如果不是int型则弹出错误
 s.hasNextInt();//判断输入的是否为int类型,返回布尔数值。
 System.out.println(a);
 s.close();

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

 public class Demo02_practice {
     //练习:输入多个数字,求其总和与平均值;每输入一个数字用回车确认,
     // 通过输入非数字来结束输入并输出执行结果。
     public static void main(String[] args) {
         //创建扫描器
         Scanner scanner = new Scanner(System.in);
         //创建接收变量,double类型记得要加上L,不然会出现数据错误问题
         double sum = 0L;
         int count=0;
         //判断是否还有double数值输入,非double则跳出循环
         while (scanner.hasNextDouble()){
             sum += scanner.nextDouble();
             count++;
        }
         System.out.println("总数为:"+sum);
         System.out.println("平均数为:"+sum/count);
         //回收扫描器
         scanner.close();
    }
 }

 

顺序结构

image-20230607091451333

字面意思,除了特殊情况外,代码都是一行一行的执行,就像写字一样,一行一行写。

 

选择结构(IF语句)

单选择结构

image-20230607092249194

小练习:判断输入的数值是否为hello
  • .equals 方法和 str=="hello" 的区别在于:

    • .equals 方法是对比数值是否相同;

    • str=="hello"是对比两个变量之间的内存地址块是否是同一块。

 public class IFDemo01 {
     public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
         System.out.println("请输入内容:");
         String str = scanner.nextLine();
         if (str.equals("Hello")){
             System.out.println(str);
        }
         System.out.println("输入的值不是hello");
         scanner.close();
    }
 }

双选择结构

image-20230608102220265

小练习:考试分数大于等于60就是几个,小于60就不及格
 public class IFDemo2 {
     public static void main(String[] args) {
         //考试分数大于等于60就是几个,小于60就不及格
         //解决方案A
         Scanner scanner = new Scanner(System.in);
         int score = scanner.nextInt();
         scanner.close();
         if (score>=60){
             System.out.println("及格");
        }else {
             System.out.println("不及格");
        }
         //解决方案B:三元运算符
         String str = score>=60?"及格":"不及格";
         System.out.println(str);
    }
 }

多选择结构

image-20230608102434903

小练习:考试分数大于等于60就是几个,小于60就不及格,并且对及格成绩每10分进行定级,满分则显示满分。超出分值范围应当显示不合法。
 public class IFDemo03 {
     public static void main(String[] args) {
         //考试分数大于等于60就是几个,小于60就不及格
         Scanner scanner = new Scanner(System.in);
         int score = scanner.nextInt();
         scanner.close();
         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("成绩不合法");
        }
    }
 }

嵌套结构

image-20230608103638077

小练习:输入一个数1~100,猜出这个数值是多少?

小提示:采用二分查找法。

switch多选择结构

image-20230608183546908

  • case

    • 穿透关键词,可以根据switch上的变量,对比case后的数值,相同则执行case下的语句。

  • break

    • 中断语句,跳出循环或当前代码块。

拓展:反编译

通常我们Java文件在运行时,都需要编译为.class 文件才能执行。

IDEA 程序为我们提供了反编译的功能。将.class文件拖入IDEA程序中,即会自动进行反编译。

image-20230608191052402

实际上我们看到的switch语句,是通过编写为这种方式,进行运行的。

 

循环结构

while循环

image-20230608191435978

小练习:计算1+2....+100
 public class whileDemo1 {
     public static void main(String[] args) {
         int i=1;
         int sum=0;
         while (i<=100){
             sum+=i;
             i++;
        }
         System.out.println(sum);
    }
 }

do……while循环

image-20230612175258788

小练习:计算1+2....+100,观察do..while 和whlie的区别
 public class WhileDemo02 {
     public static void main(String[] args) {
         int i=1;
         int sum=0;
         do{
             sum+=i;
             i++;
        } while (i<=100);
         System.out.println(sum);
    }
 }

 

for循环(经常使用,十分重要)

image-20230613101206196

是最有效,最灵活的循环结构。

关于for循环有以下几点说明:

  • 最先执行初始化步骤。

  • 可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。

  • 之后,检测布尔值,如果是true则运行循环。false则循环终止。

  • 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)

//FOR语句的死循环写法
for(;;){

}
//FOR语句的是三个部分都可以是空语句。
练习1:计算0到100之间的奇数和偶数的和
public class ForDemo01 {
public static void main(String[] args) {
int oddSum = 0;
int evenSum = 0;
//快捷键100.for
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
oddSum += i;
} else {
evenSum += i;
}
}
System.out.println("奇数和为:" + oddSum);
System.out.println("偶数和为:" + evenSum);
}
}
练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
public class ForDemo02 {
public static void main(String[] args) {
int j = 0;
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
j++;
if (j % 3 == 0 && j != 0) {
System.out.println();
}
}
}
}
}
练习3:打印九九乘法表
public class ForDemo03 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (i * j)+"\t");
}
System.out.println();
}
}
}

增强型for循环

image-20230613111212364

 

public class ForDemo04 {
public static void main(String[] args) {
//定义数组的两种方式:不初始化,但是指定数组范围;
int[] number=new int[5];
//初始化数组
int[] number2={12,213,31,1213,14,5,54,23};
for (int i : number2) {//遍历数组
System.out.println(i);
}
}
}

break & continue

image-20230613111540213

简而言之:

  • break:跳出循环体;

  • continue:跳过单次循环;

    • 功能2:跳到指定标签的循环体如下;(不建议使用)

outer:for (int i = 11; i < 15; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0) {
continue outer;
}
}
}

 

练习

题目:输入一个数值,根据这个数值打印一个等边三角形

image-20230613113946533

代码:

public class TestDemo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextInt()) {
int n = scanner.nextInt();
for (int j = n; j > 0; j--) {
for (int i = j; i > 0; i--) {
System.out.print(" ");
}
for (int i = 0; i < (n - j) * 2 + 1; i++) {
System.out.print("*");
}
System.out.println();
}
} else {
System.out.println("输入信息有误,请输入整数");
}
//解题思路
//当N=5时,要输出1个*;以此类推得出如下思路;最后总结公式:(n-j)*2+1;可以解这个公式
// 5---1
// 4---3
// 3---5
// 2---7
// 1---9
}
}

输出如下:

image-20230613171845310

这种类型的算法题,对加深JavaSE代码的理解非常有帮助;有能力的小伙伴可以进阶的研究一下贪心算法中的背包问题。是一到经典的动态规划类型题目。

 

 ### 部分截图取自,B站UP:遇见狂神说;菜鸟教程