判断和循环
顺序结构
就是代码从第一行执行到最后一行的过程就是顺序结构,简单的来说就是一行一行的按顺序执行
代码示例:
package orderdemo; public class OrderDemo { public static void main(String[] args) { //代码从第一行执行到最后一行的过程就是顺序结构,简单的来说就是一行一行的按顺序执行 System.out.println("他确实是思想比较的古板"); System.out.println("有一种特别僵化的感觉"); System.out.println("我还是比较喜欢他不讲话的样子"); System.out.println("满足我的许多想象"); System.out.println("现在一个人在这里写东西确实还挺难过的"); System.out.println("感觉也是有一种枯燥无聊的感觉,不知道自己真的在思考着些什么"); } }
分支结构
if的第一种格式
定义一个变量
if(关系表达式){
语句体;
}
if语句在程序当中的作用就是用来进行判断的,第一种格式就是用来判断一种情况的(单条件判断)
关系表达式就是对里面的值进行判断,如果true就执行if下面判断的语句体
否则就不执行直接跳出整个判断语句 比如定义一个变量a=4,然后在if判断是否a>3,如果是则执行,
下面的语句体最简单的就比如打印"a大于3"这句话,如果上面的条件成立,则打印下面那句输出语句,否则不会进行输出打印
语句体就是要执行的语句,比如,一个简单的输出打印"HelloWorld"
注意:在if的逻辑题内不能写两个输出语句,因为一写上就会直接把两种的结果都打印出来
执行流程:先判断关系表达式里面的值是否为true,如果是则执行大括号里面的语句体,如果为
false则跳出整个if语句,此时表示执行结束
代码示例:
package ifdemo; import java.util.Scanner; public class IfDemo1 { public static void main(String[] args) { //if的格式 //if(关系表达式){ // 语句体; // } //需求:键盘录入女婿的酒量,如果酒量大于2斤,老丈人给出回应,反之不回应 //分析 //1.首先键盘录入女婿的酒量 Scanner sc = new Scanner(System.in); System.out.println("请输入一个整数代表你的酒量"); int wine = sc.nextInt(); if (wine > 2) { System.out.println("好的,你穿走我的小棉袄吧,给你都给你"); } //2.然后if语句判断是否大于2,如果时候则输出回应,不是则跳到最后不回应的输出语句当中 //注意:在if的逻辑题内不能写两个输出语句,因为一写上就会直接把两种的结果都打印出来 //读题的时候的问题:每次读题的时候要看仔细,不要错过任何一个字,也就是题目的意思,读题三遍!!! } }
如果是判断一个布尔类型的值,就直接把结果写在小括号里面就可以
大括号的开头的开头可以另起一行书写,但是建议写在第一行的末尾
在语句体中,只有一行代码大括号可以省略不写,但是个人建议是写上,这样更好的遵守我么java的规范
代码示例:
package ifdemo; public class IfDemo2 { public static void main(String[] args) { //使用If的一些注意点 //1.大括号的开头的开头可以另起一行书写,但是建议写在第一行的末尾 //2.在语句体中,只有一行代码大括号可以省略不写,但是个人建议是写上,这样更好的遵守我么java的规范 //3.如果要判断布尔类型的值,直接把变量的值写在小括号就可以 boolean flag = true; if (flag) { System.out.println("flag的值就是true"); } } }
if的第二种格式
定义一个变量
if(关系表达式){
语句体1;
} else{
语句体2;
}
if的第二种格式就是用来判断两种情况的(双条件判断)
这里的else的意思就是不满足关系表达式里的判断的时候就执行else里面的语句,也就是所谓的
语句体2
执行流程:先执行关系表达式里的值,如果判断为true,则执行语句体1,如果为false就执行else里面的语句体2,执行完了语句体2之后则整个if语句就运行结束
代码示例:
package Test; import java.util.Scanner; public class Test3 { public static void main(String[] args) { /*需求:键盘录入一个整数表示身上的钱 大于等于100就吃网红餐厅 小于100就吃经济实惠的沙县小吃 */ //我真的是会服死我自己了,每次都不认真的去看题目要求!老是自以为是!!! //应用场景就是二选一的时候会用到这个判断 Scanner sc = new Scanner(System.in); System.out.println("请输入一个整数表示身上的钱"); int money = sc.nextInt(); if (money >= 100) { System.out.println("咱们有钱吃网红餐厅!!"); } else { System.out.println("穷逼没钱只能去吃经济实惠的沙县小吃!!"); } } }
if的第三种格式
定义一个变量
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
...
}else{
n+1;
}
第三种格式就是用来判断3种情况的(多条件判断)
其实就是在原先的基础上连接了一个新的if判断语句而已,其功能跟第二种是一样的
执行流程:先执行关系表达式1的值,如果为true则执行语句体1,如果为false则执行关系表达式2的值
如果为true则执行语句体2,如果为false则执行关系表达式3的值,以此类推,如果所有的关系表达式的值都为false则执行语句体n+1的值,此时if语句到这里执行结束
简单来说就是,从上往下依次进行判断,如果有一个为真,则执行对应的语句体
如果全都是假,则执行else里面的语句体
代码示例:
package Test; import java.util.Scanner; public class Test6 { public static void main(String[] args) { //看题目要看清楚来!!!老是粗心大意!!! //需求:根据不同的分数送不同的礼物 //95~100 送一辆自行车 //90~94 游乐场玩一天 //80~89 变形金刚一个 // 小于80 屁股痒痒了 Scanner sc = new Scanner(System.in); System.out.println("请输入你的分数"); int grade = sc.nextInt(); if (grade >= 0 && grade <= 100) { System.out.println("你输入的分数有效"); if (grade >= 95 && grade <= 100) { System.out.println("送一辆自行车"); } else if (grade >= 90 && grade <= 94) { System.out.println("游乐场玩一天"); } else if (grade >= 80 && grade <= 89) { System.out.println("变形金刚一个"); } else if (grade < 80) { System.out.println("屁股痒痒了"); } } else { System.out.println("亲,您输入的分数有误呢PS(都不看题目的吗,这都能填错,你不要读了,回家种田去吧!!)"); } } }
switch的格式
定义一个变量
switch(字面量的值){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default :
语句体n+1;
break;
}
格式说明:
表达式:(就是将要匹配的值)取值类型为byte,int,short,char
case:后面跟的值就是要和表达式匹配的值(被匹配的值)
break:中断,结束的意思,表示结束switch语句的执行
default:就是没有一个值跟表达式的值匹配,就执行该语句下的语句体,和if语句的else类似
补充:case里面的值只能字面值,不能是变量 case下所对应的值不能重复
执行流程:先执行表达式里的值,然后与下面的case的值进行匹配,匹配上了就执行对应case下的语句体,然后遇到break就结束整个switch语句的执行,如果都不匹配,则执行default里面的语句,然后遇到break之后结束整个switch语句
代码示例:
package switchdemo; public class SwitchDemo1 { public static void main(String[] args) { //兰州拉面,武汉热干面,北京炸酱面,陕西油泼面 //定义自己想要吃的面 //细节注意:case后面的值不能重复 重复的话会报错! //switch里面的值只能是字面量,不能是变量,因为变量switch是判断不了的 // 但是我字符串类型的数据好像也是能穿进去,但是不规范而已 //为什么我写的default后面没有break也是可以运行的,而且还没有报错! String noodles = "陕西油泼面"; switch (noodles) { case "兰州拉面": System.out.println("滚得去吃你的该死的兰州拉面!"); break; case "武汉热干面": System.out.println("武汉热干面又不好吃,吃屎!"); break; case "北京炸酱面": System.out.println("北京炸酱面没吃过,不过我现在心情不是特别的好"); break; case "陕西油泼面": System.out.println("陕西油泼面听起来就不好吃"); break; default: System.out.println("泡面是最难吃的东西!!!"); break; } } }
switch的扩展知识
1.case的穿透性
就是在switch语句下在执行了相应case里的值,然后执行了该case下对应的语句体,但是执行了语句体之后没有看到break,就会继续执行下面的语句体并且执行完了会直接打印在控制台,如果一直都没看到break或者switch语句的右大括号,就会全部打印在控制台,直到看到break或者switch语句的右大括号才会结束语句的执行,简单的就是说没有break和右大括号就一直的往下穿透
2.default的位置和省略
它的位置不一定是在最后,可以是在任意的位置,但是java的规范是写在switch语句的末尾
省略就是可以不写default语句,语法不会有问题,但是不建议省略,因为这样就没有备用选项,简单的说就是没有备胎了
代码示例:
package switchdemo; public class SwitchDemo2 { public static void main(String[] args) { //default的位置和省略 // 位置:default不一定是写在最下面,可以在任意位置,但是我们习惯是写在最下面 //省略:default可以省略,语法不会有问题,但是不建议省略 //case的穿透性 //就是语句体中没有break导致的 //执行的流程: //首先拿着小括号表达式里面的值跟case里面的每一个值进行匹配 //如果匹配上了就执行对应的语句,如果此时看到了break,就结束整个语句 //如果没有break,程序就执行下一个语句体,一直遇到break或者右大括号为止 //应用场景: //如果有多个case语句重复了,就可以考虑用case穿透简化代码 //JDK的新特性 //这个特性实在JDK12版本里可使用的 int number = 1; switch (number) { case 1: System.out.println("number的值为1"); case 2: System.out.println("number的值为10"); case 3: System.out.println("number的值为20"); default: System.out.println("number的值不是1,10或20"); } } }
运行结果:
number的值为1
number的值为10
number的值为20
number的值不是1,10或20
for循环格式
for(初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
初始化语句就是从什么时候开始循环
条件判断语句就是从什么时候结束循环
条件控制语句就是每循环一次,控制语句就自增一次,直到不满足条件判断语句里的结束条件
循环体语句就是需要重复打印的语句
代码示例:
package loopdemo; public class ForDemo1 { public static void main(String[] args) { //打印5次HelloWorld /* for循环的格式 for(初始化语句;条件判断语句;条件控制语句){ 循环体语句 } */ for (int i = 1; i <= 10; i++) { System.out.println("HelloWorld"); } } }
while循环格式
初始化条件;
while(条件判断语句){
循环体语句;
条件控制语句;
}
格式说明:
初始化条件:就是循环的开始条件
条件判断语句:就是循环的结束条件
循环体语句:就是要重复执行的语句
条件控制语句:就是while语句循环多少次,条件控制语句就++几次,然后再判断结束条件是否满足
如果满足则继续循环,否则就退出整个switch语句
执行流程:跟for循环语句循环过程是一样的
代码示例:
package Test; public class Test17 { public static void main(String[] args) { /*需求:世界最高山峰珠穆朗玛峰(8848.43米=8844430毫米) 假如我有一张足够大的值,厚度为0.1毫米 请问折叠多少次可以折成珠穆朗玛峰的高度?*/ //分析:折叠纸张,每折一次,纸张的厚度就是原先的两倍 //double a=0.1 //a=a*2 //问题:不是你while语句没有条件控制语句怎么执行的呢? 难不成是有count++??? //其实很多时候写不出是因为逻辑没有理清楚!!! //下次要多锻炼一下自己的逻辑思维的能力,有些问题沉下心来一点点想是可以想明白的,要多花一点儿时间而已 //单位跟后面的值要是一样 //1.定义一个变量记录山峰的高度 double height = 8844430; //2.定义一个变量来记录纸张的厚度 double paper = 0.1; //3.定义一个变量来统计折叠的次数 int count = 0; //4.while循环折叠纸张,只要纸张的厚度小于山峰的高度,则循环继续 //每折叠一次,统计次数就要++一次 while (paper <= height) { System.out.println(paper); paper *= 2; count++; } System.out.println("需要折叠"+count+"次"); } }
for循环和while的对比
相同点:运行规则都是一样的
不同点:for循环式知道循环的次数跟范围 while则是不知道循环的次数跟范围只知道循环的结束条件
累加思想和统计思想
累加就是定义一个变量,初始化值为0,然后求循环体里面每一个数字的和
求和变量不能定义在循环的里面,变量只在所属的大括号中有用
如果我们把变量定义在循环的里面,那么变量只在本次循环中有效
当把变量放在循环的里面的时候,那么变量只在本次循环有效
当本次变量结束之后,变量就会在内存当中消失
第二次循环的开始又会重新定义一个新的变量
结论:如果我们要写累加求和变量的时候,变量就要定义在循环的外面就可以了
代码示例:
public class Test14 { public static void main(String[] args) { //获取一个范围中的每一个数据,也会用到循环,求1~5之间的和 int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; } System.out.println(sum); } }
统计就是定义一个变量,初始化值为0,然后每循环一次,该变量就自增一次,最后循环结束后
该变量就是记录了该循环下的次数
代码示例:
package Test; public class Test19 { public static void main(String[] args) { /*给定两个整数,被除数和除数(都是正数,且不超过int的范围) 将两数相除,需要不使用乘法,除法,和 %运算符 得到商和余数*/ int count = 0; int dividend = 345; int divisor = 10; //3.while循环相减了多少次得到余数 while (dividend >= divisor) { //被除数大于除数才能执行下去 dividend = dividend - divisor; count++; } System.out.println("余数为:" + dividend); System.out.println("商为:" + count); } }
do...while循环格式(了解下一就可以,后面实际用的不多)
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
do...while循环和while循环的区别:就是前者是先执行后判断,后者则是先判断后执行
执行流程:do...while循环至少还会先执行一次,然后进行判断,如果为true则继续返回上面执行循环语句,如果为false则结束整个语句的循环