Scanner 与 流程控制
Scanner 与 流程控制
狂神说Java BV12J41137hu
Scanner对象
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
下面是创建 Scanner 对象的基本语法:
Scanner s = new Scanner(System.in);
通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据:
- next()
import java.util.Scanner;
public class JavaScannerDemo {
public static void main(String[] args) {
// 扫描器对象
Scanner scanner = new Scanner(System.in);
System.out.println("input:");
//判断用户有没有输入字符串
if (scanner.hasNext()) {
// 使用nex接收输入
String str = scanner.next();
System.out.println("output:" + str);
}
//凡是属于IO流的类不关闭会一只占用资源,用完就要关闭
scanner.close();
}
}
//input:
//Hello, World!
//output:Hello,
- nextLine()
import java.util.Scanner;
public class JavaScannerDemo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("input:");
if (scanner.hasNextLine()) {
// 当然,这里不if也是正常的行读取
String str = scanner.nextLine();
System.out.println("output:" + str);
}
scanner.close();
}
}
//input:
//Hello, World!
//output:Hello, World!
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。(空格之后的全部舍弃掉)
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
输入 int 或 float
输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:
import java.util.Scanner;
public class JavaScannerDemo03 {
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();
}
}
//请输入整数:
//8
//整数数据:8
//请输入小数:
//1.02
//小数:1.02
//请输入整数:
//10.1
//输入的不是整数数据
//请输入小数:
//小数:10.1
小练习
// 输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出结果
代码
由于有一点点 C 基础和 Python 基础,这类小代码还是很好写的 XD
package scanner.exercise;
import java.util.Scanner;
public class ScannerExerciseWithNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 这里认为输入的数字有符号且有小数位
// 并且认为每一行都是输入了合法的数字
double sum = 0.0;
double average = 0.0;
double thisDoubleNumber = 0.0;
int numberCounter = 0;
System.out.println("请输入数字,回车接收,输入非数字则停止接收");
while (scanner.hasNextDouble()) {
thisDoubleNumber = scanner.nextDouble();
sum += thisDoubleNumber;
numberCounter ++;
}
scanner.close();
if (numberCounter != 0) {
// 该分支表明用户输入了至少一个数字,
// 可以取均值
average = sum / numberCounter;
}
System.out.println("输入的数字有\t" + numberCounter + "个" + "\n总和为:" + sum + "\n平均值为:" + average);
}
}
//15.1
//10
//11.2
//【
//输入的数字有 3个
//总和为:36.3
//平均值为:12.1
流程控制
跟C 和 Python 基本一样,没啥好说的,记一下基本的书写规范
顺序结构
从上而下依次执行代码,基本算法结构
选择结构
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执行代码
}
}
switch多选
switch (expression) {
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
*字符串匹配
Java SE7 开始,switch支持字符串匹配,这个过程是Java编译时将需要匹配的字符串转换成hash来做的
可以单击IDEA右上角的齿轮,选择Project Struc(Ctrl + Alt + Shift + S),找到Compiler output 后的路径
源码
package FluentControlDemo;
public class SwitchCaseDemo01 {
public static void main(String[] args) {
String name = "文字";
switch (name) {
case "PDF":
System.out.println("是PDF文档");
break;
case "表格":
System.out.println("是表格表当");
break;
case "演示":
System.out.println("是演示文档");
break;
case "文字":
System.out.println("是文字文档");
break;
default:
System.out.println("啥都不是");
}
}
}
反编译源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package FluentControlDemo;
public class SwitchCaseDemo01 {
public SwitchCaseDemo01() {
}
public static void main(String[] args) {
String name = "文字";
byte var3 = -1;
switch(name.hashCode()) {
case 79058:
if (name.equals("PDF")) {
var3 = 0;
}
break;
case 829104:
if (name.equals("文字")) {
var3 = 3;
}
break;
case 912550:
if (name.equals("演示")) {
var3 = 2;
}
break;
case 1109204:
if (name.equals("表格")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("是PDF文档");
break;
case 1:
System.out.println("是表格表当");
break;
case 2:
System.out.println("是演示文档");
break;
case 3:
System.out.println("是文字文档");
break;
default:
System.out.println("啥都不是");
}
}
}
循环结构
while循环
while( 布尔表达式成立 ) {
//循环内容
}
只要布尔表达式为 true,循环就会一直执行下去。需要在循环过程中让表达式失效以停止循环(通常)
do...while循环
为了满足:即使不满足布尔表达式,也要执行一次循环,这种奇葩的需求,提出了do..while循环
do {
//代码语句
}while(布尔表达式成立);
while 和 do...while 布尔表达式的区别
没有区别! while怎么写 do while 就怎么写,这两个结构的区别仅仅在于不满足条件while不需要执行循环体,do...while需要执行一次循环体!
for循环
for(初始化; 布尔表达式; 更新) {
//代码语句
}
关于 for 循环有以下几点说明:
-
最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
-
然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
-
执行一次循环后,更新循环控制变量。
-
再次检测布尔表达式。循环执行上面的过程。
for (;;){}//死循环
for的IEAD快捷方法
100.for
//fori 迭代条件为 i++
//forr 迭代条件为 i++
循环结构练习
5的倍数
输出1-1000之间的能被5整除的数,并且每行输出3个
package FluentControlDemo;
public class ExerciseMode5LineIn3 {
public static void main(String[] args) {
//输出1-1000**之间**的能被5整除的数,并且**每行输出3个**
for (int i = 1; i < 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
}
if (i % ( 5 * 3) == 0){
System.out.print("\n");
}
}
}
}
System.out.print() 输出完不换行
System.out.println() 输出完换行
九九乘法表
两重循环,还行比较简单
package FluentControlDemo;
public class MultiTable {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
if (i == j) {
System.out.print("\n");
}
}
}
}
}
//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
//
//Process finished with exit code 0
增强for循环
主要为了遍历数组或是集合对象的,这里只是简单过一遍
for(声明语句 : 表达式)
{
//代码句子
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
例子
public class Test {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
//10,20,30,40,50,
//James,Larry,Tom,Lacy,
可用于循环的关键字
break
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。
break;
continue
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。(还在当前循环)
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
continue;
*goto
被时代抛弃的语句,java没有goto
暂时不需要去理解
想了解goto的抛弃历史可以参考 清华大学出版社-软件设计方法-王选
打印101-150之间的所有质数
package FluentControlDemo;
public class ContinueLabel {
public static void main(String[] args) {
outer: for (int i = 101; i < 150; i++) {
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
流程控制练习题
打印三角形
package FluentControlDemo;
public class PrintTriangle {
public static void main(String[] args) {
int numberOfTriangleLength = 6;
for (int i = 0; i < numberOfTriangleLength; i++) {
for (int j = numberOfTriangleLength; j >= i ; j --) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
// *
// ***
// *****
// *******
// *********
// ***********
//
//Process finished with exit code 0