控制执行流程
就像有知觉的生物一样,程序必须在执行过程中控制它的世界,并作出选择。在java中,你需要使用执行控制语句来做出选择
与任何程序设计语言一样,java使用条件语句和循环结构确定控制流程,java的控制流程结构与C和C++的控制流程结构一样,只有很少的例外情况,java没有goto语句,但break可以带标签,可以利用它实现从内层循环跳出的目的(C采用goto实现)。另外,jdk1.5还添加了一种增强的for循环。
boolean数据类型:boolean数据类型声明一个具有值true(真)或者false(假)的变量。
如何比较两个值呢?例如:芙蓉姐姐比志玲姐姐漂亮吗?;乌龟跑的比兔子快吗?;篮球和地球一样大吗?,如下表所示,java提供6种关系操作符用于两个值的比较
用什么类型能表示:
一件艺术品是真货还是假货
地铁2号线的首发车时间是5:00吗
这次考试成绩在90分之上吗
具有boolean值的变量称为布尔变量,boolean数据类型有两个值:true和false。例如,下面语句将true赋给变量lightsOn:
boolean lightsOn = true;
示例:开发一个程序,让一年级学生练习加法。程序随机产生两个一位整数:number1和number2,然后显示" 1 + 5 = ?",当学生在输入答案后,程序给出提示,表明答案是真的还是假的。
package edu.uestc.avatar; import java.util.Scanner; public class AdditionQuiz { public static void main(String[] args) { int number1 = (int)(System.currentTimeMillis() % 10); int number2 = (int)(System.currentTimeMillis() / 7 % 10); System.out.print(number1 + " + " + number2 + " = "); Scanner input = new Scanner(System.in); int answer = input.nextInt(); boolean result = number1 + number2 == answer; System.out.println(number1 + " + " + number2 + " = " + answer + " is " + result); input.close(); } }
分支结构
所有条件语句都利用条件表达式的真或假来决定执行路径。
前面的程序显示像“4 + 2 = 6 is true"这样的信息。如果希望显示的消息是"4 + 2 = 6 是正确的",那么必须使用条件语句实现这个小小的改变,java有几种类型的选择语句:单分支if语句、双分支if-else语句、嵌套if语句,多分支if-else语句、switch语句和条件表达式。
if语句
根据条件是真是假,决定执行的路径。
if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(radius >= 0) { double area = PI * radius * radius; System.out.printf("半径为%f的圆面积为:%f",radius,area); System.out.println();//打印一个空行 System.out.printf("半径为%f的圆周长为:%f",radius,2 * PI * radius); }
示例:提示用户输入一个整数,如果该数是5的倍数,打印5的倍数;如果该数是2的倍数,打印2的倍数
package edu.uestc.avatar; import java.util.Scanner; /** * 提示用户输入一个整数,如果该数是5的倍数,打印5的倍数;如果该数是2的倍数,打印2的倍数 * @author Adan * */ public class SimpleIfDemo { public static void main(String[] args) { System.out.print("请输入一个整数:"); Scanner input = new Scanner(System.in); int num = input.nextInt(); if(num % 5 == 0){ System.out.println(num + "是5的倍数"); } if(num % 2 == 0) { System.out.println(num + "是2的倍数"); } input.close(); } }
if...else语句
if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行
if(布尔表达式){ //如果布尔表达式的值为true }else{ //如果布尔表达式的值为false } if(radius >= 0) { double area = PI * radius * radius; System.out.printf("半径为%f的圆面积为:%f",radius,area); System.out.println();//打印一个空行 System.out.printf("半径为%f的圆周长为:%f",radius,2 * PI * radius); } else { System.out.println("半径不能小于0"); }
嵌套的if语句和多分支的if-else语句
if 或if-else语句中的语句可以是任意合法的java语句,甚至可以是其它的if-else语句。
if(布尔表达式 1){ //如果布尔表达式 1的值为true执行代码 }else if(布尔表达式 2){ //如果布尔表达式 2的值为true执行代码 }else if(布尔表达式 3){ //如果布尔表达式 3的值为true执行代码 }else { //如果以上布尔表达式都不为true执行代码 }
嵌套的if语句可以实现多重选择。如下程序所示,根据score给出对应的成绩等级。
package edu.uestc.avatar; import java.util.Scanner; public class NestingIFDemo { public static void main(String[] args) { System.out.println("请输入本次测试成绩:"); Scanner input = new Scanner(System.in); float score = input.nextFloat(); input.close(); 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("E"); } } } } } }
可以使用(推荐使用)多重选择的if语句书写风格(多分支if-else语句),可以避免深度缩进,并使程序易于阅读。
public static void main(String[] args) { System.out.println("请输入本次测试成绩:"); Scanner input = new Scanner(System.in); float score = input.nextFloat(); input.close(); 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("E"); }
使用 if,else if,else 语句的时候,需要注意下面几点:
- if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
- if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
- 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
常见错误
常见错误1:忘记必要的括号 if(radius >= 0) area = radius* radius * PI; System.out.println(area); 如果块中只有一条语句,就可以忽略花括号,但是,多条语句括在一起时,{}是不能省的 常见错误2:在if行出现错误的;号 |
示例:
package edu.uestc.avatar; import java.util.Scanner; /** * 程序生成两个10以内的随机整数,完成减法运算,确保被减数大于减数 * 可以使用Math.random()来产生一个0.0---1.0之间的随机double数(不包括1) [0,1) * @author Adan * */ public class SubtractionQuiz { public static void main(String[] args) { //产生两个10以内的随机整数 int number1 = (int)(System.currentTimeMillis() % 10); int number2 = (int)(Math.random() * 10); //如果减数>被减数,两者进行交换 if(number2 > number1) { int temp = number1; number1 = number2; number2 = temp; } System.out.print(number1 + " - " + number2 + " = "); Scanner input = new Scanner(System.in); int answer = input.nextInt(); input.close(); if(number1 - number2 == answer) { System.out.println("回答正确"); } else { System.out.println("回答错误," + number1 + " - " + number2 + " = " + (number1 - number2)); } } }
逻辑操作符
package edu.uestc.avatar; public class LogicOperatorDemo { public static void main(String[] args) { //逻辑非 ! int age = 24; int weight = 98; System.out.println(!(age >= 18)); System.out.println(!(weight == 100)); /** * &&和& * 相同点:两者都可以进行逻辑与运算(多个条件同时满足结果为true) * 不同点: * && 具有短路运算,而&不具备短路运算,作逻辑与运算时,建议使用&& * &可以进行位运算 */ boolean ret = age > 18 && weight < 120; boolean ret1 = age > 18 & weight < 120; System.out.println(ret + "====" + ret1); System.out.println(age > 25 && 10 / 0 == 0); //System.out.println(age > 25 & 10 / 0 == 0); System.out.println(Integer.toBinaryString(10)); System.out.println(Integer.toBinaryString(20)); System.out.println(10 & 20); /** * ||和| * 相同点:两者都可以进行逻辑或运算(1个条件为true结果为true) * 不同点: * ||具有短路运算,而|不具备短路运算,作逻辑或运算时,建议使用||(前面只有有一个条件为true,整个结果即为true,后续表达式不再进行运算) * |可以进行位运算 */ System.out.println(age < 25 || weight > 100);//true System.out.println(age < 25 | weight > 100);//true System.out.println(10 | 20); /** * 了解 * 异或运算: ^ * true ^ true ====> false * false ^ false ====> false * true ^ false ====> true * 也可以进行位运算 */ System.out.println(age < 25 ^ weight > 100);//true System.out.println(age < 25 ^ weight < 100);//false System.out.println(10 ^ 20); //30 } }
示例:判定闰年
package edu.uestc.avatar; import java.util.Scanner; /** * 如果某年能够被4整除但是不能被100整除,或者可以被400整除,那么这一年即为闰年 * boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; * @author Adan * */ public class LeapYear { public static void main(String[] args) { System.out.print("请输入一个年份:"); Scanner input = new Scanner(System.in); int year = input.nextInt(); input.close(); boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; // if(isLeapYear) { // System.out.println(year + "是闰年"); // }else { // System.out.println(year + "不是闰年"); // } //三目运算符 条件表达式 ? 为true时执行 : 为else时执行 System.out.println(year + (isLeapYear ? "是" : "不是") + "闰年"); } }
示例:彩票
package edu.uestc.avatar; import java.util.Scanner; /** * 程序随机生成一个两位数,提示用户输入一个两位数:按照下面的规则判定用户是否中奖 * 1 用户输入匹配彩票的实际顺序,奖金为10000 * 2 用户输入匹配彩票的每一个数字,奖金为3000 * 3 用户输入匹配彩票的一个数字,奖金为1000 * @author Adan * */ public class Lottery { public static void main(String[] args) { int lottery = (int)(Math.random() * 100); System.out.print("请输入两位数:"); Scanner input = new Scanner(System.in); int guess = input.nextInt(); //拆分拆票的每一位 int lotteryDigit1 = lottery / 10; int lotteryDigit2 = lottery % 10; //拆分拆票的每一位 int guessDigit1 = guess / 10; int guessDigit2 = guess % 10; System.out.println("本期中奖号码:" + lottery); if(lottery == guess) System.out.println("奖金为10000"); else if(lotteryDigit1 == guessDigit2 && lotteryDigit2 == guessDigit1) System.out.println("奖金为3000"); else if(lotteryDigit1 == guessDigit1 || lotteryDigit1 == guessDigit2 || lotteryDigit2 == guessDigit1 || lotteryDigit2 == guessDigit2) System.out.println("奖金为1000"); else System.out.println("很遗憾,再接再厉"); input.close(); } }
介绍switch语句的语法格式
switch case 语句有如下规则:
-
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
-
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
-
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
-
当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
-
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
-
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
public class SwitchDemo { public static void main(String[] args) { //int day = (int)(Math.random() * 7); int day = 1; switch(day) { case 0: System.out.println("星期日"); break; case 1: System.out.println("星期一"); case 2: System.out.println("星期二"); case 3: System.out.println("星期三"); case 4: System.out.println("星期四"); case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; default: System.out.println("非法值"); } } }
jdk14后的switch更新、switch表达式
package edu.uestc.avatar; import java.util.Scanner; /** * 从jdk14开始,对switch进行了更新 * switch(switch表达式){ * case 值1 -> 语句组1; * case 值2 -> 语句组2; * .... * default -> 默认语句组;//默认语句可省略 * } * 其中匹配到某个case后,执行对应的case语句组,然后进行break退出 * * switch表达式 * 数据类型 变量名 = switch(switch表达式){ * case 值1 -> 语句组1; * case 值2 -> 语句组1; * .... * default -> 默认语句组;//default不能省略 * }; * 语句组中的最后一条语句的值作为返回值 */ public class SwitchUpdate { public static void main(String[] args) { System.out.print("请输入一个年份:"); Scanner input = new Scanner(System.in); int year = input.nextInt(); input.close(); switch (year % 12) { case 0 -> System.out.println("monkey"); case 1 -> System.out.println("rooster"); case 2 -> System.out.println("dog"); case 3 -> System.out.println("pig"); case 4 -> System.out.println("mouse"); case 5 -> System.out.println("ox"); case 6 -> System.out.println("tiger"); case 7 -> System.out.println("rabbit"); case 8 -> System.out.println("dragon"); case 9 -> System.out.println("snake"); case 10 -> System.out.println("horse"); case 11 -> System.out.println("sheep"); //default ->System.out.println(); } System.out.println("==========================="); String zodic = switch(year % 12) { case 0 -> "monkey"; case 1 -> "rooster"; case 2 -> "dog"; case 3 -> "pig"; case 4 -> "mouse"; case 5 -> "ox"; case 6 -> "tiger"; case 7 -> "rabbit"; case 8 -> "dragon"; case 9 -> "snake"; case 10 -> "horse"; case 11 -> "sheep"; default -> "非法生肖"; //所有的case语句匹配不上,必须有一个默认值作为值进行返回 }; System.out.println(year + " => " + zodic); } }
if-else语句和switch语句的区别及开发中的取舍
编程练习题:
1、利用公式计算一元二次方程的两个根,编写程序,提示用户输入a,b,c的值,并且显示结果(两个根;一个根;无解)
2、随机产生 1和12之间整数的程序,并且根据数字1,2,3…12,显示相应的英文月份:January,February,…December。
3、提示用户输入代表今天日期的数字(周日为0,周一为1,……周六为6)。同时,提示用户输入一个今天之后的天数作为代表将来某天的数字,显示这天是星期几
4、提示用户输入一个年份和月份,然后显示这个月的天数。
5、完成石头剪刀布小游戏或者自己做一个类似的小游戏,把相关知识点运用上(石头可以用0表示,剪刀可以用1表示,布可以用2表示)
6、程序随机产生一个整数0(硬币的正面)和1(硬币的反面),提示用户猜测硬币的正反面
7、编程实现已知某人的工资(要求输入),求他应该缴纳的个人所得税以及最后得到的工资。
个人所得税计算方法计算方法 :
全月应纳税所得额 =工资薪金所得-3500
应纳税额 = 应纳税所得额 *税率-速算扣除数
级数 全月应纳税所得额 税率(%) 速算扣除数
1 不超过500元的 5 0
2 超过500元至2000元的部分 10 25
3 超过2000元至5000元的部分 15 125
4 超过5000元至20000元的部分 20 375
5 超过20000元至40000元的部分 25 1375
6 超过40000元至60000元的部分 30 3375
7 超过60000元至80000元的部分 35 6375
8 超过80000元至100000元的部分 40 10375
9 超过100000元的部分 45 15375
8.编写程序,给定一个学生成绩,给出相应等级:
90~100 优秀
80~89 良好
70~79 中等
60~69 及格
0~59 不及格
使用两种作法
9.从键盘接收一个名次(int) 使用switch-case作如下分支
名次为1 奖IPHONE8
名次为2 奖IPHONE7
名次为3 奖IPHONE6
名次为 4 奖IPHONE5
其它名次 努力吧,少年
10. 编写程序,判断给定的某个年份是否是闰年。
闰年的判断规则如下:
(1)若某个年份能被4整除但不能被100整除,则是闰年。
(2)若某个年份能被400整除,则也是闰年。
11、提示用户输入一个三位整数,判断该数是否为一个回文数(从左到右及从右到左都是一样的为回文数)
12、模拟从一副52张的牌中选择一张牌,程序显示牌的大小(Ace、2、3、4、5、6、7、8、9、10、Jack、Queen、King)及花色(♠,♥,♣,♦)