Java基础语法2
1 流程控制
1.1 概述
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
-
顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转
-
分支结构
- 根据条件,选择性地执行某段代码。
- 有if…else和switch-case两种分支语句。
-
循环结构
- 根据循环条件,重复性的执行某段代码。
- 有while、do…while、for三种循环语句。
- 注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
2 判断语句之if
2.1 if
语法:
if(关系表达式){
语句体;
}
//当只有一个一条语句体时,{}可以省略
执行流程
-
首先判断关系表达式看其结果是true还是false
-
如果是true就执行语句体
-
如果是false就不执行语句体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hEcLvC9-1605359354907)(./images/if.png)]
2.2 if…else
语法:
if(关系表达式) {
语句体1;
}else {
语句体2;
}
执行流程
-
首先判断关系表达式看其结果是true还是false
-
如果是true就执行语句体1
-
如果是false就执行语句体2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS6Hvymt-1605359354910)(./images/ifelse.png)]
2.3 if…else if…else
语法:
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
执行流程
- 首先判断关系表达式1看其结果是true还是false
- 如果是true就执行语句体1
- 如果是false就继续判断关系表达式2看其结果是true还是false
- 如果是true就执行语句体2
- 如果是false就继续判断关系表达式…看其结果是true还是false
- …
- 如果没有任何关系表达式为true,就执行语句体n+1。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihAQtoUz-1605359354915)(./images/if3.png)]
2.4 if语句与三元运算符
在某些简单的应用中,if语句是可以和三元运算符互换使用的。
-
三元运算符可简化if-else语句
-
三元运算符要求必须返回一个结果。
-
if后的代码块可有多个语句
课堂练习:
小明参加高考,他和父亲达成承诺:
如果:
成绩为100分时,奖励一台笔记本电脑;
成绩为(80,99]时,奖励一部手机;
当成绩为[60,80]时,奖励一块电话手表;
其它时,什么奖励也没有。
请从键盘输入小明的期末成绩,并加以判断
// 1.新建java文件,用模板把结构补充完整
// 2.Scanner接受成绩 int score = nextInt();
// 3.使用if...else if...else...进行判断
// 4.编译并运行程序,查看结果
public class Text {
public static void main(String[] args) {
System.out.println("输入分数:");
Scanner input =new Scanner(System.in);
int score =input.nextInt();
if(score==100){
System.out.println("奖励一台电脑");
}
else if (score>80){
System.out.println("奖励一部手机");
}
else if (score>=60){
System.out.println("奖励一块电话手表");
}
else{
System.out.println("没有奖励");
}
// String b=score==100?"奖励一台电脑":(score>80)?"奖励一部手机":(score>60)?"奖励一块电话手表":"没有奖励";
// System.out.println(b);
}
}
2.5 if…else练习
练习1
编写程序:在程序中定义三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。
num1 = 19;
num2 = 23;
num3 = -10;
int num1=19;
int num2=23;
int num3=-10;
int num=0;
if (num1>num2){
num=num1;
num1=num2;
num2=num;
}
else if(num2>num3){
num=num2;
num2=num3;
num3=num;
}
if(num1>num2){
num=num1;
num1=num2;
num2=num;
}
System.out.println("result="+num1+" num2="+num2+" num3="+num3);
练习2
编写程序,声明2个int型变量并赋值。判断两数之和,如果大于等于50,打印“hello world!”
// int i1 = 10, i2 = 20; (i1 + i2) > 50
int i1=10,i2=20;
if (i1+i2>=50){
System.out.println("hello word!");
}
else {
System.out.println("总和小于50");
}
练习3
编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且(&&)第2个数小于20.0,打印两数之和。否则,打印两数的乘积。
double a=15.0,b=2.0;
if (a>10.0 && b<20.0){
System.out.println(a+b);
}
else {
System.out.println(a*b);
}
练习4
我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗相当于人类多少年龄呢?应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄。如果用户输入负数,请显示一个提示信息。
double peopleYear=0;
System.out.println("输入狗的年龄:");
Scanner input=new Scanner(System.in);
double yaer= input.nextDouble();
if (yaer<=2.0){
yaer= yaer*10.5;
System.out.println(yaer);
}
else {
double a=2.0*10.5;
yaer=yaer-2.0;
yaer= yaer*4;
yaer+=a;
System.out.println(yaer);
}
练习5
假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,提示用户输入一个两位数,然后按照下面的规则判定用户是否能赢。
1)如果用户输入的数匹配彩票的实际顺序,奖金10 000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3 000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1 000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。
提示1:使用(int)(Math.random() * 90 + 10)产生随机数。
Math.random() : [0,1) * 90 -> [0,90) + 10 -> [10,100) -> [10,99]
提示2:十位与各位分开比较
int one=0,ten=0;
int targetNumber=(int)(Math.random() * 90 + 10);
System.out.println("目标数:"+targetNumber);
int targetOne=targetNumber/10,targetTen=targetNumber%10;
System.out.println("请输入一个两位数:");
Scanner input=new Scanner(System.in);
int myNumber=input.nextInt();
int myOne=myNumber/10,myTen=myNumber%10;
if (myOne==targetOne&myTen==targetTen){
System.out.println("奖金10000美元!\nPS:匹配彩票的实际顺序");
}
else if (myOne==targetTen&myTen==targetOne){
System.out.println("奖金3000美元!\nPS:所有数字匹配彩票的所有数字,但顺序不一致.");
}
else if (myOne==targetOne | myTen==targetTen){
System.out.println("奖金1000美元!\nPS:一个数字仅满足顺序情况下匹配彩票的一个数字");
}
else if (myOne==targetNumber | myTen==targetOne){
System.out.println("奖金500美元!\nPS:一个数字仅满足非顺序情况下匹配彩票的一个数字");
}
else {
System.out.println("彩票作废!");
}
3 判断语句之switch-case
3.1 语法
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
3.2 执行流程
- 首先计算出表达式的值
- 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d91wbUKK-1605359354918)(\assets\swich.png)]
使用switch语句的有关规则
-
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);
-
case子句中的值必须是常量,不能是变量名或不确定的表达式值;
-
同一个switch语句,所有case子句中的常量值互不相同;
-
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
-
default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
示例
public static void main(String[] args) {
//定义变量,判断是星期几
int weekday = 6;
//switch语句实现选择
switch(weekday) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("你输入的数字有误");
break;
}
}
3.3 case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
public static void main(String[] args) {
int i = 5;
switch (i){
case 0:
System.out.println("执行case0");
break;
case 5:
System.out.println("执行case5");
case 10:
System.out.println("执行case10");
default:
System.out.println("执行default");
}
}
上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,直接运行完整体switch。
由于case存在穿透性,因此初学者在编写switch语句时,必须要写上break。
课堂练习1:
从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
或 2)可以被400整除
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0
从键盘分别输入月、日,判断这一天是当年的第几天2月28天
6月20日 31+28+31+30+31+20
int month = 6;
int day = 20;
Scanner input =new Scanner(System.in);
System.out.println("输入年月日");
int year=input.nextInt();
int Month=input.nextInt();
int day=input.nextInt();
int [] isLeapyear={31,29,31,30,31,30,31,31,30,31,30,31};
int [] noLeapyear={31,28,31,30,31,30,31,31,30,31,30,31};
// System.out.println(""+year+Month+day);
int sum=0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
for (int i=0;i<Month;i++){
sum+=isLeapyear[i];
}
System.out.println(""+year+"年"+Month+"月"+day+"日"+"是"+year+"年第"+sum+"天");
}
else {
for (int i=0;i<Month;i++){
sum+=noLeapyear[i];
}
System.out.println(""+year+"年"+Month+"月"+day+"日"+"是"+year+"年第"+sum+"天");
}
课堂练习2:
编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级:
score>=90 等级: A
70<=score<90 等级: B
60<=score<70 等级: C
score<60 等级: D
方式一:使用if-else
方式二:使用switch-case: score / 10: 0 - 10
课堂练习3:
编写一个程序,为一个给定的年份找出其对应的中国生肖。中国的生肖基于12年一个周期,
每年用一个动物代表:rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、
rooster、dog、pig。
提示:2019年:猪 2019 % 12 == 3
switch和if语句的对比
if和switch语句很像,具体什么场景下,应用哪个语句呢?
-
如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几 种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
-
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。 也就是说,使用switch-case的,都可以改写为if-else。反之不成立。