流程控制
scanner
public static void main(String[] args) { // 先要new一个Scanner Scanner scanner = new Scanner(System.in); // while true无限循环 while (true) { System.out.println("奇偶数判断器!"); System.out.println("请输入要判断的数字:"); //回车时,如果有输入 if (scanner.hasNextLine()) { int i = scanner.nextInt(); System.out.println(i % 2 == 0 ? "这是偶数!" : "这是奇数!"); //程序休眠一秒 try { Thread.currentThread().sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Scanner是Java提供的一个工具类,可以扫描用户的行为,如在控制台键入的字符等。
上述代码是一个奇偶数判断器,扫描用户输入的数字并判断奇偶,给出结果后等待半秒,进入下一轮循环。
为了好玩才无限循环!正常使用后请加个scanner.close()来关闭扫描器。
注意代码中的hasNextLine()方法,如果使用hasNext()方法,效果接近,但会将空格视为结束符。
修改一下代码:
// 先要new一个Scanner Scanner scanner = new Scanner(System.in); // while true无限循环 while (true) { System.out.println("奇偶数判断器!"); System.out.println("请输入要判断的数字:"); //回车时,如果输入的是整数 if (scanner.hasNextInt()) { int i = scanner.nextInt(); System.out.println(i % 2 == 0 ? "这是偶数!" : "这是奇数!"); }else { //这里不接收东西他就默认一直循环 String str = scanner.next(); System.out.println("请输入整数!"); } System.out.println(""); } }
这段代码使用了hasNextInt()进行判断,并且在用户输入的不是整数时可以返回提示。
下面实现一个稍复杂些的功能:
-
输入多个数字,求其总和与平均数
-
每输入一个数字,用回车确认
-
可以输入小数
-
输入非数字内容时,返回计算结果
代码如下:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //定义总和sum及输入的数字数n double sum = 0; int n = 0; System.out.println("数字平均值计算器!"); System.out.println("请输入第一个数字,或输入非数字结束计算:"); while(scanner.hasNextDouble()){ double num = scanner.nextDouble(); n++; sum += num; System.out.println("请输入下一个数字,或输入非数字结束计算:"); } System.out.println("共输入了"+n+"个数字!"); System.out.println("他们的和为:"+sum); System.out.println("他们的平均数为:"+sum/n); scanner.close(); }
测试并体会此代码的含义。
if选择结构
Java程序通常都是顺序结构,就是从上到下按顺序执行,但也有其他的结构,如if选择结构。
if的单选择、双选择和多选择结构语法如下:
// if单选择结构: // if(布尔值){ // 布尔值为真时执行的语句 // } // // if双选择结构: // if(布尔值){ // 布尔值为真时执行的语句 // }else{ // 布尔值为假时执行的语句 // } // // if多选择结构: // if(布尔值1){ // 布尔值1为真时执行的语句 // }else if(布尔值2){ // 布尔值2为真时执行的语句 // }else if(布尔值3){ // 布尔值3为真时执行的语句 // }else{ // 以上布尔值均为假时执行的语句 // }
此外if内还可以嵌套if语句。
if多选择结构的例子:
Scanner scanner = new Scanner(System.in); System.out.println("请输入学生成绩:"); if(scanner.hasNextInt()){ int i = scanner.nextInt(); if(i>100||i<0){ System.out.println("成绩不合法"); }else if(i==100){ System.out.println("满分!"); }else if(i>=80){ System.out.println("优秀!"); }else if(i>=60){ System.out.println("及格!"); }else { System.out.println("不及格!"); } } scanner.close();
例如,当输入的成绩为90时,(i>100||i<0)和(i==100)均为假,
而(i>=80)为真,则输出“优秀!”,并不再进行后面的else判断。
多选择结构除了使用if语句,还可以使用switch语句。
switch多选择结构
以一个福音书简称全称转换器为例说明switch结构:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入福音书的简称:"); if(scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.print("此福音书全称为:"); switch (str){ case "太": System.out.println("马太福音"); break; case "可": System.out.println("马可福音"); break; case "路": System.out.println("路加福音"); break; case "约": System.out.println("约翰福音"); break; default: System.out.println("请输入正确的福音书简称"); } } scanner.close(); }
代码对比switch后面的括号里的值,即str,与各项case的值是否相同,
如果相同,则执行此case下的代码。
default和break不是必须写的,但不写break的时候,会执行对应的case后面每个case里的代码(case穿透)。
while循环结构
循环结构包括while、do while和for循环,
while就是后面括号里的布尔值为true,就会一直执行:
//输出1到100 int i = 1; while (i<=100){ System.out.print(i==100?i:i+","); i++; }
这是在控制台打出1到100的代码,当i大于100时,布尔值(i<=100)为假,循环结束。
//输出1加到100 int j = 1; int sum = 0; while (j<=100){ sum += j; j++; } System.out.println(sum);
这是计算1加到100的代码,思想类似。
do while循环结构
do while与while类似,不同点在于do while会至少执行一次,而while是不满足条件直接不进循环。
//输出1加到100 int k = 0; int sum2 = 0; do{ sum2 += k; k++; }while (k>0 && k<=100); System.out.println(sum2);
同样是计算1加到100,条件里要求k>0,而一开始k=0,不满足条件,
但由于至少执行一次,执行完后k++了,就满足条件,可以继续循环了。
for循环结构
for循环比前面两个用得多!一般是这样的:
for (int i = 0;i < 3;i++){ //这里面的内容会被循环执行3次 }
用两个分号将括号里的内容分成三部分,第一部分定义一个临时变量,第二部分是进入循环的条件,
第三部分是每次循环后会执行的代码。也就是说,第一部分只会在最开始执行一次。
需要注意,这三个部分都是可以缺省的,例如for( ; ; ),是死循环的写法。
(快捷键:输入100.for试试!)
练习1,计算0到100之间奇数和与偶数和:
int sumOdd = 0; int sumEven = 0; for (int i = 0;i <= 100;i++){ if(i%2==0){ sumEven += i; }else { sumOdd += i; } } System.out.println("0-100所有奇数和为"+sumOdd); System.out.println("0-100所有偶数和为"+sumEven);
练习2,输出0到1000之间所有能被5整除的数,且每行输出三个:
int j = 0; for (int i = 0; i <= 1000; i++) { if(j!=2){ if (i%5==0){ System.out.print(i+"\t"); j++; } }else { if (i%5==0){ System.out.println(i); j = 0; } } }
练习3,输出九九乘法表:
for (int row = 1; row <= 9; row++) { for (int col = 1; col <= row; col++) { System.out.print(row+"*"+col+"="+(row*col)+"\t"); } System.out.println(); }
应该练习到理解for循环语句,看到这种题能够随手做出来,而非背代码。
毕竟for循环是十分常用的。
增强for循环
增强for循环通常用于遍历数组或集合:
int[] arr = {10,20,30,40,50}; for (int i:arr){ System.out.println(i); }
如此代码,就是将数组arr中的值依次赋给 i ,循环的次数等于arr的长度5。代码依次输出10到50。
break、continue
我们之前用break跳出switch结构,他还可以被用来跳出循环。
应当明确区分break与continue的意义:
-
break:在循环体中运行到break,跳出整个循环
-
continue:在循环体中运行到continue,跳过本次循环
举例而说明之:
for (int i = 0;i < 10;i++){ if(i==3){ continue; } System.out.print(i+"\t"); }
以上代码打出0到9的整数,并且跳过3,输出为:
0 1 2 4 5 6 7 8 9
试将continue改为break:
for (int i = 0;i < 10;i++){ if(i==3){ break; } System.out.print(i+"\t"); }
以上代码输出到3就执行了break语句,跳出了整个循环,后面 i>3 的部分就不再执行了。输出为:
0 1 2
以上以for循环语句举例,下面看看while循环语句,其实也差不多:
int i = 0; while (i < 10){ i++; if(i==3){ continue; } System.out.print(i+"\t"); }
此代码输出为:1 2 4 5 6 7 8 9 10。如果改成break就剩1、2了,
试想将代码中的 i++ 放到循环体的最后,那么在 i = 3 的时候,就会触发continue,重新开始循环,
结果跑不到 i++ 那里又再次continue了,无限虚空死循环。所以要注意 i++ 要写在前面。
练习题
打印三角形:
for (int row = 0; row < 5; row++) { for (int col = 5; col > row; col--) { System.out.print(" "); } for (int col = 0; col < row; col++) { System.out.print("*"); } for (int col = 0; col < row+1; col++) { System.out.print("*"); } System.out.println(); }
输出结果:
* *** ***** ******* *********
很显然这是一段空格、两段星号拼出来的。
自己尝试用绝对值打印,实心菱形、空心菱形:
//实心菱形 for (int row = -4; row <= 4; row++) { for (int col = -4; col <= 4; col++) { if((Math.abs(row+col)<=4)&&(Math.abs(row-col)<=4)){ System.out.print("*"); }else { System.out.print(" "); } } System.out.println(); } //空心菱形 for (int row = -4; row <= 4; row++) { for (int col = -4; col <= 4; col++) { if((Math.abs(row+col)>3)||(Math.abs(row-col)>3)){ System.out.print("*"); }else { System.out.print(" "); } } System.out.println(); }
输出结果:
* *** ***** ******* ********* ******* ***** *** * ********* **** **** *** *** ** ** * * ** ** *** *** **** **** *********
练习、熟练一下本章内容,然后进入下一章。