目录
Java的执行语句
分类
1.顺序语句 方法中的代码从上往下执行
2.分支语句 依据某个条件判断,执行不同的功能
2.1 if分支
2.2 switch分支
3.循环语句 如果条件成立,就重复性的执行某个功能
3.1 for循环
3.2 while循环
3.3 do-while循环
4.特殊的流程控制语句
4.1 break
4.2 continue
4.3 return
4.4 lable
if
简单的if分支
语法结构:
if(表达式){
...代码块...
}
理解: 表达式的结果必须是boolean类型
true - 执行代码块
false- 跳出整个分支语句
做实验:
if(false){
System.out.println("...代码块...");
}
System.out.println("if分支以外的代码");
案例:如果小张的Java考试成绩大于98分,小张就能获得一辆跑车作为奖励
Scanner scan = new Scanner(System.in);
System.out.println("请输入小张的Java考试成绩:");
double score = scan.nextDouble();
if(score > 98){
System.out.println("奖励小张跑车一辆");
}
小结:if(){}做判断
复杂的if分支
案例一: 人类的健康值在20-25的数值内为健康 (健康值算法为:体重(Kg) / 身高(米)的平方)
Scanner scan = new Scanner(System.in);
System.out.println("请输入体重(Kg):");
double weigth = scan.nextDouble();
System.out.println("请输入身高(M):");
double height = scan.nextDouble();
double health = weigth/(height*height);
if(health>20 && health<25){
System.out.println("医生说:\"健康,请保持现有状态\"");
}
案例二:小张Java成绩大于98分,而且音乐成绩大于80分,老师奖励他; 或者Java成绩等于100分,音乐成绩大于70分,老师也可以奖励他
Scanner scan = new Scanner(System.in);
System.out.println("请输入Java成绩:");
double javaScore = scan.nextDouble();
System.out.println("请输入音乐成绩:");
double musicScore = scan.nextDouble();
if((javaScore>98 && musicScore>80) || (javaScore==100 && musicScore>70)){
System.out.println("奖励小张劳斯莱赛车一辆");
}
小结:if分支可以判断复杂条件
if...else...
语法结构:
if(表达式){
...代码块...
}else{
...else代码块...
}
理解: 表达式的结果必须是boolean
true - 执行代码块
false- 执行else代码块
做实验:
if(false){
System.out.println("...代码块...");
}else{
System.out.println("...else代码块...");
}
System.out.println("if分支以外的代码...");
案例:如果小张Java考试成绩大于98分,就奖励他一个劳斯莱斯, 否则,老师就罚他进行编码
Scanner scan = new Scanner(System.in);
System.out.println("请输入小张的成绩:");
double score = scan.nextDouble();
if(score > 98){
System.out.println("奖励小张劳斯莱斯赛车一辆");
}else{
System.out.println("小张通宵补课");
}
小结:if...else...二选一的情况下使用
多重if分支
语法结构:
if(表达式1){
...代码块1...
}else if(表达式2){
...代码块2...
}else if(表达式n){
...代码块n...
}else{
...else代码块...
}
理解: 表达式的结果必须是boolean 从上往下判断,哪个表达式先为true,就执行对应的代码块 如果都不为true,就执行else代码块
注意:else{}根据需求可写可不写
案例一:人类的健康值在 15-20的数值内为偏瘦 20-25的数值内为健康 25-30的数值内为偏胖 (健康值算法为:体重(Kg) / 身高(米)的平方)
Scanner scan = new Scanner(System.in);
System.out.println("请输入体重(Kg):");
double weigth = scan.nextDouble();
System.out.println("请输入身高(M):");
double height = scan.nextDouble();
double health = weigth/(height*height);
if(health>15 && health<=20){
System.out.println("医生说:\"偏瘦,多喝啤酒,多吃宵夜,多熬夜\"");
}else if(health>20 && health<=25){
System.out.println("医生说:\"健康,请保持现有状态\"");
}else if(health>25 && health<=30){
System.out.println("医生说:\"偏胖,多运动,嘿嘿嘿~~~\"");
}else{
System.out.println("医生说:\"健康值异常,请到医院进行详细检查\"");
}
案例二:通过键盘录入学生成绩 如果在90-100之间,则打印“A”, 否则如果在80-90之间,则打印“B”, 否则如果在70-80之间,则打印“C” 否则如果在60-70之间,则打印“D” 否则如果在0-60之间,则打印“E” 否则打印“成绩异常”
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩:");
double score = scan.nextDouble();
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 if(score >= 0 && score<60){
System.out.println("E");
}else{
System.out.println("成绩异常");
}
小结:多重if分支在多选一的情况下使用
嵌套if分支
案例:学校举行运动会,百米赛跑跑入16秒内的学生有资格进决赛, 根据性别分别进入男子组和女子组。
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩:");
double score = scan.nextDouble();
if(score > 0 && score < 16){
System.out.println("请输入性别:");
String sex = scan.next();
if(sex.equals("男")){//判断两个字符串内容是否相同
System.out.println("恭喜进入到男子组决赛~~~");
}else if(sex.equals("女")){//判断两个字符串内容是否相同
System.out.println("恭喜进入到女子组决赛~~~");
}else{
System.out.println("性别异常~~~");
}
}else if(score >= 16){
System.out.println("重在参与~~~");
}else{
System.out.println("成绩异常~~~");
}
小结:if是可以嵌套的
if总结:
1.if可以判断复杂条件
2.if可以在二选一的情况下使用 -- if...else...
3.if可以在多选一的情况下使用 -- 多重if分支
4.if可以嵌套
switch
语法结构:
switch(表达式){
case 值1:
...代码块1...
break;
case 值2:
...代码块2...
break;
case 值n:
...代码块n...
break;
default:
...default代码块...
break;
}
理解: 表达式的结果可以为byte、short、int、char、字符串、枚举 。分别给值1、值2、值n做比较, 哪个相等就执行对应的代码块 如果都不相等,就执行default代码块 break:跳出整个分支语句
注意:default代码块根据需求可写可不写 经验:switch有点像多重if分支
做实验:
switch(1000){
case 10:
System.out.println("10");
break;
case 50:
System.out.println("50");
break;
case 100:
System.out.println("100");
break;
default:
System.out.println("default代码块");
break;
}
System.out.println("switch分支以外的代码");
案例:小张参加计算机编程大赛 如果获得第一名,将参加1个月马尔代夫旅游 如果获得第二名,将奖励苹果Pro笔记本电脑一部 如果获得第三名,将奖励移动硬盘一个 否则,小张通宵补课
Scanner scan = new Scanner(System.in);
System.out.println("请输入小张的比赛成绩:");
String str = scan.next();
switch(str){
case "第一名":
System.out.println("参加1个月马尔代夫旅游");
break;
case "第二名":
System.out.println("奖励苹果Pro笔记本电脑一部");
break;
case "第三名":
System.out.println("奖励移动硬盘一个");
break;
default:
System.out.println("通宵补课");
break;
}
switch的深入
面试题:
case的值可以相同吗?
不允许 -- 语法错误
default可以省略吗?
可以省略
break可以省略吗?
允许
default的位置一定要在最后吗?
不一定,一般是放在最后(为了代码可读性)
表达式值的类型可以是什么?
byte、short、int、char、字符串(JDK1.7)、枚举(JDK1.5)
switch的底层判断逻辑是什么?/switch的表达式为什么是byte、short、int、char、字符串(JDK1.7)、枚举(JDK1.5)?/为什么switch的表示式没有long、float、double、boolean?
switch底层判断的标准是int类型
byte -- 向上转型成 int
short - 向上转型成 int
char - 获取字符的ASCII int
String- hash值 int
枚举 - 每个对象系统会分配int值
switch(10){
case 10:
System.out.println("10");
break;
case 50:
System.out.println("50");
break;
case 80:
System.out.println("80");
break;
case 100:
System.out.println("100");
break;
default:
System.out.println("default代码块");
break;
}
需求:输入年和月,输出当月的天数?
分析:1、3、5、7、8、10、12 -- 31天
4、6、9、11 -- 30天
2 -- 闰年29天 平年 28天
闰年的判断标准:年份被4整除且不能被100整除 或者 年份被400整除
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();
System.out.println("请输入月:");
int month = scan.nextInt();
int day = 0;
switch(month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
day = 31;
break;
case 4:case 6:case 9:case 11:
day = 30;
break;
case 2:
if(year%4==0 && year%100!=0 || year%400==0){//闰年
day = 29;
}else{//平年
day = 28;
}
break;
}
System.out.println(year + "年" + month + "月的天数为:" + day + "天");
知识点:if vs switch
表达式的区别: if:boolean
switch:byte、short、int、char、字符串(JDK1.7)、枚举(JDK1.5)
应用场景: if:复杂条件或区间
switch:单个值
for循环
循环好处:减少代码的冗余
语法结构:
for(初始化变量;判断条件;更新变量){
...代码块/循环体...
}
执行步骤: 1.初始化变量
2.判断条件(判断条件的结果必须是boolean的值)
2.1 true -- 执行代码块,更新变量,重复第2个步骤
2.2 false -- 跳出整个循环语句
需求1:输出5遍"好好学习"
for(int i = 0;i<5;i++){
System.out.println("好好学习");
}
需求2:打印1~10的数字
for(int i = 1;i<=10;i++){
System.out.println(i);
}
需求3:打印1~10内的奇数数字
for(int i = 1;i<=10;i+=2){
System.out.println(i);
}
需求4:打印10~1的数字
for(int i = 10;i>=1;i--){
System.out.println(i);
}
需求5:打印10~1内的偶数数字
for(int i = 10;i>=1;i-=2){
System.out.println(i);
}
小结: 1.初始化变量不一定从0开始
2.更新变量不一定每次都是++
for循环变形记:
int i = 1;
for(;i<=5;){
System.out.println("好好学习");
//i++;
++i;
}
System.out.println(i);
小结: 1.for循环内声明的变量只能在循环中使用
2.更新变量:i++和++i是一样的
案例1:循环录入5次int类型的数字,输出总和
Scanner scan = new Scanner(System.in);
int sum = 0;
for(int i = 1;i<=5;i++){
System.out.println("请输入第" + i + "个数字:");
int num = scan.nextInt();
sum += num;
}
System.out.println("总和为:" + sum);
案例2:循环录入麻生希同学的5门课成绩,计算平均分
Scanner scan = new Scanner(System.in);
double sum = 0;
for(int i = 1;i<=5;i++){
System.out.println("请输入第" + i + "门成绩:");
double num = scan.nextDouble();
sum += num;
}
double avg = sum/5;
System.out.println("平均分为:" + avg);
案例3:循环录入5次int类型的数字,输出最大值
Scanner scan = new Scanner(System.in);
//假设第一个数字为最大值
System.out.println("请输入第1个数字:");
int max = scan.nextInt();
for(int i = 2;i<=5;i++){
System.out.println("请输入第" + i + "个数字:");
int num = scan.nextInt();
if(max < num){
max = num;
}
}
System.out.println("最大值为:" + max);
总结:循环次数确定时,使用for循环
for循环嵌套
做实验:
for(int i = 1;i<=3;i++){
for(int j = 1;j<=5;j++){
System.out.println(i + " -- " + j);
}
}
需求1:打印一下图形
****
****
****
for(int i = 0;i<3;i++){//控制行数
for(int j = 0;j<4;j++){//控制列数
System.out.print("*");
}
System.out.println();//换行
}
需求2:打印一下图形
* i=0
** i=1
*** i=2
**** i=3
***** i=4
for(int i = 0;i<5;i++){
for(int j = 0;j<=i;j++){
System.out.print("*");
}
System.out.println();
}
需求3:打印一下图形
***** i=0
**** i=1
*** i=2
** i=3
* i=4
for(int i = 0;i<5;i++){
for(int j = 0;j<5-i;j++){
System.out.print("*");
}
System.out.println();
}
需求4:打印一下图形
*****
****
***
**
*
for(int i = 0;i<5;i++){
for(int k = 0;k<i;k++){
System.out.print(" ");
}
for(int j = 0;j<5-i;j++){
System.out.print("*");
}
System.out.println();
}
需求5:打印一下图形
*
***
*****
*******
for(int i = 0;i<4;i++){
for(int k = 0;k<3-i;k++){
System.out.print(" ");
}
for(int j = 0;j<i*2+1;j++){
System.out.print("*");
}
System.out.println();
}
需求6:打印一下图形
*
* *
* *
*******
for(int i = 0;i<4;i++){
for(int k = 0;k<3-i;k++){
System.out.print(" ");
}
for(int j = 0;j<i*2+1;j++){
//第一行、最后一行、每行的第一列、最后一列
if(i==0 || i==3 || j==0 || j==i*2){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
需求7:打印一下图形
*******
*****
***
*
for(int i = 0;i<4;i++){
for(int k = 0;k<i;k++){
System.out.print(" ");
}
for(int j = 0;j<7-i*2;j++){
System.out.print("*");
}
System.out.println();
}
需求8:打印一下图形
*******
* *
* *
*
for(int i = 0;i<4;i++){
for(int k = 0;k<i;k++){
System.out.print(" ");
}
for(int j = 0;j<7-i*2;j++){
//第一行、最后一行、每行的第一列、最后一列
if(i==0 || i==3 || j==0 || j==7-i*2-1){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
需求9:九九乘法表
for(int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(j + "X" + i + "=" + (i*j) + "\t");
}
System.out.println();
}
需求10:九九乘法表
for(int i = 1;i<=9;i++){
for(int k = 1;k<i;k++){
System.out.print("\t");
}
for(int j = i;j<=9;j++){
System.out.print(i + "X" + j + "=" + (i*j) + "\t");
}
System.out.println();
}
while循环
语法结构:
while(表达式){
...代码块/循环体...
}
理解: 表达式的结果必须是boolean的值
true - 执行代码块
false- 跳出整个循环语句
案例:我有个梦想,每月存3000,每年递增2000元,多少个月后存满20万
int allMoney = 0;//总金额
int money = 3000;//当月应存金额
int month = 0;//月的计数变量
while(allMoney < 200000){
allMoney += money;
month++;
if(month % 12 == 0){
money += 2000;
}
}
System.out.println(month + "个月后存满20万");
System.out.println(money);
do-while循环
语法结构:
do{
...代码块...
}while(表达式);
理解: 先执行一遍代码块 再判断表达式,表达式结果必须是boolean类型
true - 执行代码块
false- 跳出整个循环语句
案例:小明参加学校组织的歌咏比赛,大赛在即,老师建议:先彩排一次, 如果很令人满意,以后就不用彩排了,否则每天都排,直到现场表现满意为止!
Scanner scan = new Scanner(System.in);
String str;
do{
System.out.println("小明:\"啦啦啦啦...\"");
System.out.println("小明:\"可以了吗?\"");
str = scan.next();
}while(str.equals("不可以"));
for vs while vs do-while
表达式的区别:
for(初始化变量;判断条件;更新变量){}
while(判断条件){}
do{}while(判断条件);
共同点:判断条件的结果必须是boolean类型,true-循环,false-跳出循环
执行顺序的区别:
for:先判断,再执行
while:先判断,再执行
do-while:先执行一遍,再判断
应用场景的区别:
循环次数确定时:for
循环次数不确定时,先判断再执行:while
循环次数不确定时,先执行一遍再判断:do-while
知识点:特殊的流程控制语句
1.break
作用:作用于循环中,表示结束当前循环
做实验:
while(true){
System.out.println("111");
System.out.println("222");
if(true){
break;
}
System.out.println("333");
System.out.println("444");
}
案例:循环录入小明同学5门课的成绩并计算平均分, 如果某分数录入为负,停止录入并提示。
Scanner scan = new Scanner(System.in);
boolean flag = true;//true-正常录入 false-非正常录入
double sum = 0;
for(int i = 1;i<=5;i++){
System.out.println("请录入第" + i + "门成绩:");
double score = scan.nextDouble();
if(score < 0){
flag = false;
break;
}
sum += score;
}
if(flag){
double avg = sum/5;
System.out.println("平均分为:" + avg);
}else{
System.out.println("分数为负数,停止录入");
}
2.continue
作用:作用于循环中,表示跳过循环体剩余的部分,进入到下一次循环 做实验:
while(true){
System.out.println("111");
System.out.println("222");
if(true){
continue;
}
System.out.println("333");
System.out.println("444");
}
案例:循环录入Java课5名学生的成绩,统计分数大于等于80分的学生比例。
解决方案1:
Scanner scan = new Scanner(System.in);
int num = 0;//记录大于等于80分学生的人数
for(int i = 1;i<=5;i++){
System.out.println("请录入第" + i + "名学生的成绩:");
double score = scan.nextDouble();
if(score >= 80){
num++;
}
}
double proportion = num/5.0*100;
System.out.println("大于等于80分的学生比例为:" + proportion + "%");
解决方案2:
Scanner scan = new Scanner(System.in);
int num = 0;//记录大于等于80分学生的人数
for(int i = 1;i<=5;i++){
System.out.println("请录入第" + i + "名学生的成绩:");
double score = scan.nextDouble();
if(score < 80){
continue;
}
num++;
}
double proportion = num/5.0*100;
System.out.println("大于等于80分的学生比例为:" + proportion + "%");
3.return
作用:作用于方法中,表示结束当前方法
做实验:
System.out.println("111");
System.out.println("222");
if(true){
return;
}
System.out.println("333");
System.out.println("444");
4.lable
作用:给循环取名字/做标记
面试题:判断下列代码会不会报错?
不会报错
http://www.baidu.com
for(int i = 0;i<5;i++){
System.out.println("用良心做教育");
}
需求:嵌套for循环,外层循环5次,内层循环3次,
当外层循环到第2次时在内层循环中结束掉外层循环
a:for(int i = 1;i<=5;i++){
for(int j = 1;j<=3;j++){
System.out.println(i + " -- " + j);
if(i == 2){
break a;
}
}
}