@[toc]
Scanner对象
之前我们学的基本语法中我们并没有实现程序和人的交互,但是 Java 给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
创建 Scanner 对象的基本语法:
Scanner s = new Scanner (system.in)
通过 Scanner 类的 next()
与 nextLine()
方法获取输入的字符串。
在读取前我们一般需要使用 hasNext()
与 hasNextLine()
判断是否还有输入的数据。
next() 与 nextLine()
- next():
1、一定要读取到有效字符后才可以结束输入。
翻译:必须输入,否则程序就不停止
2、对输入的有效字符之前遇到的空白,next() 方法会自动将其去掉
举例:对于
hello 。输出 hello,前无空格。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
翻译:如果字符串后面有空格,则后面的空格表示结束。
4、next() 不能得到带有空格的字符串。
翻译:字符串前的空格去掉,字符串后有空格结束程序。
- nextLine():
1、以Enter(回车)为结束符。
翻译:nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白
next() 与 nextLine()举例
next():
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方法接受:");
String str = scanner.next(); //获取输入的字符串
System.out.println("输出的内容为:"+str);
//凡是属于IO流的类如果不关闭会一直占用资源。要养成好习惯用完就关掉。
scanner.close();
输入:
Hello
world
输出:Hello
Hello前的空格不输出,Hello后有空格直接结束程序不输出
nextLine():
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方法接受:");
String str = scanner.nextLine(); //获取输入的字符串
System.out.println("输出的内容为:"+str);
//凡是属于IO流的类如果不关闭会一直占用资源。要养成好习惯用完就关掉。
scanner.close();
输入:
Hello
world
输出:
Hello
world
输入了什么,就输出什么
Scanner进阶
scanner对象不仅有 next()
方法和 nextLine()
方法,
还有 nextInt()
、nextFloat()
、nextDouble()
等方法获取输入数据
Scanner scanner = new Scanner(System.in);
int i ;
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
i = scanner.nextInt();
System.out.println("输入的整数为:"+i);
}else{
System.out.println("输入的不是整型数据!");
scanner.close();
}
对于 scanner.nextInt() ,只有输入整形数据才会接受
if 单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用 if 语句来表示
语法:
if (布尔表达式){
//如果布尔表达式为true将执行的语句
}
翻译:if 语句对布尔表达式进行一次判断,若判断为真,则执行下面的语句,否则跳过该语句。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入内容:");
String s = scanner.nextLine();
//equals:判断字符串是否相等 判断字符串少用 ==
if(s.equals("Hello")){
System.out.println("输出 "+s+" 成功");
}
System.out.println("End");
scanner.close();
如果正确输入,就会显示 if 里的内容。
如果错误输入,if 里的语句就不会执行。
if 双选择结构
语法:
if (布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
翻译:当布尔表达式值为 true 时,执行 if 下的语句;否则 (布尔表达式的值为false),执行 else 下的语句。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入分数:");
int score = scanner.nextInt();
if(score >= 60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
scanner.close();
布尔值不同时,两个结果也不同。
if 多选择结构
语法:
if (布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if (布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if (布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
注意点:
- if 语句至多有1个 else 语句,else 语句在所有的 else if 语句之后
- if 语句可以有若干个else if 语句,它们必须在 else 语句之前
- 一旦其中一个 else if 语句检测为 true ,其他的 else if 以及 else 语句都将跳过执行
翻译:别看这么多 if、else if、else,最终只会执行其中一条
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if(score == 100){
System.out.println("满分!");
}else if(score>=90 && score<100){
System.out.println("A");
}else if(score>=80 && score<90){
System.out.println("B");
}else if(score>=70 && score<80){
System.out.println("C");
}else if(score>=60 && score<70){
System.out.println("D");
}else{
System.out.println("不及格");
}
还可以优化上面的代码
因为程序是从上往下执行的,且if、else if、else,最终只会执行其中一条。所以 if,else if,else 语句最终只会执行遇到的第一个 true
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if(score == 100){
System.out.println("满分!");
}else if(score>=90){
System.out.println("A");
}else if(score>=80){
System.out.println("B");
}else if(score>=70){
System.out.println("C");
}else if(score>=60){
System.out.println("D");
}else{
System.out.println("不及格");
}
嵌套的 if 结构
使用嵌套的 if…else 语句是合法的。也就是说可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。可以像 if 语句一样嵌套 else if...else
语法:
if (布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
if (布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}
}
switch 多选择结构
- 多选择结构还有一个实现方式就是 switch case 语句。
- switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
语法:
switch (expression){
case value :
//语句
break;
case value :
//语句
break;
//可以有任意数量的case语句
default : //可选
//语句
}
switch 语句中的变量类型可以是:
- byte 、 short 、 int 或者 char 。
- 从 Java SE 7 开始, switch 支持字符串 String 类型了。
- 同时 case 标签必须为字符串常量或字面量。
switch case 语句有如下规则:
- switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。case 语句中的值的 数据类型必须与变量的数据类型相同 ,而且只能是常量或者字面常量。
- 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
- 当遇到 break 语句时, switch 语句终止。程序跳出 switch 语句,接着执行后面的语句。 case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现break 语句。
- switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在变量值与每个 case 语句中的值都不相等的时候执行。 default 分支不需要 break 语句。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入等级:");
char i = scanner.next().charAt(0);
switch (i){
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 'E':
System.out.println("差劲");
break;
default:
System.out.println("输错了");
}
输入值在case中找到了
输入值在case中没找到,输出 default 中的语句
case穿透:
如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。如果后续的 case 语句块有 break 语句则会跳出判断。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入等级:");
char i = scanner.next().charAt(0);
switch (i){
case 'A':
System.out.println("优秀");
case 'B':
System.out.println("良好");
case 'C':
System.out.println("及格");
case 'D':
System.out.println("不及格");
case 'E':
System.out.println("差劲");
default:
System.out.println("输错了");
}
while 循环
while 是最基本的循环,它的结构为:
while ( 布尔表达式 ) {
//循环内容
}
在循环刚开始时,会计算一次 “ 布尔表达式 ” 的值,若条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次判断是否为真。直到条件不成立,则循环结束。
- 只要布尔表达式为 true ,循环就会一直执行下去。
- 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。
- 少部分情况需要循环一直执行,比如服务器的请求响应监听等。
- 循环条件一直为 true 就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死崩溃。
练习:
int i = 1;
int sum = 0;
while(i <= 100){
sum += i;
i += 1;
}
System.out.println(sum);
do...while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
语法:
do {
//代码语句
}while (布尔表达式);
举例:
int i = 1;
int sum = 0;
do {
sum += i;
i += 1;
}while (i<=100);
System.out.println(sum);
注意:
布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true ,则语句块一直执行,直到布尔表达式的值为 false 。
While 和 do-While 的区别:
while
先判断后执行。do...while
是先执行后判断!Do...while
总是保证循环体会被至少执行一次!这是他们的主要差别。
举例:
int a = 0;
while (a<0){ //布尔值为false,没有输出任何结果
System.out.println("while输出结果了");
a++;
}
什么都没有输出!
int a = 0;
do {
System.out.println("do while输出结果了");
}while (a<0); //布尔值也为false,但输出了一个结果
这说明:
即使布尔表达式的值为 false ,但依然会执行一次。
For 循环
- 虽然所有循环结构都可以用 while 或者 do...while 表示,但 Java 提供了另一种语句 ——
for 循环,使一些循环结构变得更加简单。 - for 循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
- for 循环执行的次数是在执行前就确定的。
语法:
for (初始化;布尔表达式; 更新) {
//代码语句
}
for 循环的执行顺序:
- 先进行初始化
- 布尔表达式判断。如果是 true,往下执行代码语句;如果是 false,退出循环。
- 执行代码语句
- 更新变量。接着再判断布尔
1 —> 2 —> 3 —> 4 —> 2 —> 3 —> 4......(2 3 4循环执行,直至布尔值为false)
计算0到100之间的奇数和偶数的和:
int oddNum = 0; //奇数
int evenNum = 0; //偶数
for (int i = 0; i <= 100; i++) { //100.for回车就出来了
if (i % 2 == 0) {
evenNum += i;
} else {
oddNum += i;
}
}
System.out.println("0到100奇数之和为:"+oddNum);
System.out.println("0到100偶数之和为:"+evenNum);
介绍一个快捷方式:
想循环几次,就输入 几.for
;如:想循环100次,就输入 100.for
回车!
两道练习:
1.输出 1-1000 之间能被 5 整除的数,并且每行输出 3 个
for (int i = 1; i <= 1000; i++) {
if (i%5 == 0){
System.out.print(i+"\t");
}
if (i%(3*5) == 0){
System.out.println();
}
}
2.打印九九乘法表
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 循环
语法:
for (声明语句 : 表达式)
{
//代码句子
}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
看不懂没关系,举个例子:
这是Python
直接遍历列表(数组)元素
listTest = [1, 2, 3, 4, 5]
for s in listTest:
print(s)
这是Java
直接遍历数组元素
int[] a = {1,2,3,4,5};
for (int x:a){
System.out.println(x);
}
跟这个输出结果一样👇
通过下标遍历数组元素
int[] a = {1,2,3,4,5};
for (int i = 0;i <= 4;i++){
System.out.println(a[i]);
}
break 与 continue
- break:在任何循环语句的主体部分,都可用 break 控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也可在switch多选择语句中使用)
- continue:用在循环语句体中,用于终止本次循环过程,但不退出循环。即跳过本次循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
补充:
在 for 循环中, continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,continue 语句使程序立即跳转到布尔表达式的判断语句。
break 举例:
int j = 0;
while (j < 100){
j++;
if (j%10 == 0){
break;
}
System.out.print(j+"\t");
}
如果没有 break,程序会输出1到100所有数
有了 break,当 j == 10 满足 break 条件,程序执行 break,强行退出程序,循环结束。
continue 举例:
int i = 0;
while (i < 100){
i++;
if (i%10 == 0){
continue;
}
System.out.print(i+"\t");
}
continue 会让程序跳过本次循环,执行下一次循环。
当 i%10 == 0,即 i 为10、20、30、40、50、60、70、80、90、100时都会跳过当前程序,去执行下一次程序。
Debug 用法
拿打印三角形来举例:
for (int i = 1;i <= 5;i++){
for (int j = 5;i <= j;j--){
System.out.print(" ");
}
for (int j = 1;j <= i;j++){
System.out.print("*");
}
for (int j = 1;j < i;j++){
System.out.print("*");
}
System.out.println();
}
当程序出错,但自己都找不到时,可以使用Debug
功能(小虫子)
步骤:
- 先设置断点
- 再点小虫子
这样就能通过按钮调试,看清每一步的执行情况了
每点一下,程序向后或向前走一步