一 流程控制语句
1.流程控制语句分类
顺序结构
判断和选择结构(if, switch)
循环结构(for, while, do…while)
2. 顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
顺序结构执行流程图:
package com.itheima.logicoperator;
public class LogicoperatorDemo2 {
public static void main(String[] args) {
int a=10;
int b=10;
boolean result = ++a <5 && ++b<5;
System.out.println(result);
System.out.println(a);
System.out.println(b);
}
}
二 判断语句:if语句
1.格式1
if (关系表达式) {
语句体;
}
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体
③如果关系表达式的值为false就不执行语句体
④继续执行后面的语句内容
练习
//需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应
package com.itheima.ifdemo;
import java.util.Scanner;
public class ifDemo1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入女婿的酒量");
int wine=sc.nextInt();
if(wine>2){
System.out.println("yes");
}
}
}
如果我们要对一个布尔类型的变量进行判断,不要写==,直接把变量写在小括号中即可。
如果大括号中的语句体只有一条,那么大括号可以省略不写
如果大括号省略了,那么if只能控制距离他最近的那一条语句。
2.格式2
格式:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体1
③如果关系表达式的值为false就执行语句体2
④继续执行后面的语句内容
练习
需求:键盘录入一个整数,表示身上的钱,
如果大于等于100块,就是网红餐厅。
否则,就吃经济实惠的沙县小吃。
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入身上的钱");
int money=sc.nextInt();
if (money>=100){
System.out.println("吃餐厅");
}else{
System.out.println("吃沙县");
}
}
}
需求:
在实际开发中,电影院选座也会使用到if判断。
假设某影院售卖了100张票,票的序号为1~100。
其中奇数票号坐左侧,偶数票号坐右侧。
键盘录入一个整数表示电影票的票号。
根据不同情况,给出不同的提示:
如果票号为奇数,那么打印坐左边。
如果票号为偶数,那么打印坐右边。
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入票号");
int ticket=sc.nextInt();
if(ticket>=0&&ticket<=100){ //校验票在0-100之间
if(ticket%2==1){
System.out.println("做左边");
}else{
System.out.println("做右边");
}
}
}
}
3.格式3
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
执行流程:
①首先计算关系表达式1的值
②如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
③如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
④…
⑤如果没有任何关系表达式为true,就执行语句体n+1。
练习
需求:
小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,
假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数成绩");
int score=sc.nextInt();
if(score>0&&score<=100){
if(score>=95&&score<=100){
System.out.println("送自行车");
}else if(score>=90&&score<=94){
System.out.println("游乐场");
}else if(score>=80&&score<=89){
System.out.println("送变形金刚");
}else{
System.out.println("干一顿");
}
}else{
System.out.println("成绩不合法");
}
}
}
需求:
商场都会有VIP的会员制,根据不同的会员会有不同的折扣。
假设商品总价为1000.
键盘录入会员级别,并计算出实际支付的钱。
会员1级:打9折。
会员2级:打8折。
会员3级:打7折,
非会员:不打折,要打也是打骨折。
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
int price=1000;
Scanner sc=new Scanner(System.in);
System.out.println("请录入会员级别");
int vip=sc.nextInt();
if(vip==1){
System.out.println("实际支付"+(price*0.9));
}else if(vip==2){
System.out.println("实际支付"+(price*0.8));
}else if(vip==3) {
System.out.println("实际支付" + (price * 0.7));
}else{
System.out.println("实际支付"+price);
}
}
}
三 switch语句
格式
switch (表达式) {
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
-
首先计算出表达式的值
-
其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
-
最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
练习
需求:键盘录入星期数,显示今天的减肥活动。
周一:跑步
周二:游泳
周三:慢走
周四:动感单车
周五:拳击
周六:爬山
周日:好好吃一顿
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入星期");
int week= sc.nextInt();
switch(week){
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;
}
}
}
扩展知识
-
default的位置和省略情况
default可以放在任意位置,也可以省略
-
case穿透
不写break会引发case穿透现象
package com.itheima.ifdemo.test; import java.util.Scanner; public class Test6 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入星期"); int week = sc.nextInt(); switch (week) { default: System.out.println("没有这个星期"); //break; 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; } } }
这里把break全注释了
-
switch在JDK12的新特性
-
switch和if第三种格式各自的使用场景
需要对一个范围进行判断的时候------》f的第三种格式
把有限个数据列举出来,选择其中一个执行------》switch语句
比如:
小明的考试成绩,如果用switch,那么需要写100个case,太麻烦了,所以用if简单。
如果是星期,月份,客服电话中0~9的功能选择就可以用switch
练习
需求:键盘录入星期数,输出工作日、休息日。
(1-5) 工作日,(6-7)休息日。
l利用case穿透
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数表示星期");
int week = sc.nextInt();
switch (week) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("error");
break;
}
}
}
//这里利用case穿透
利用新特性
package com.itheima.ifdemo.test;
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数表示星期");
int week = sc.nextInt();
switch (week) {
case 1,2,3,4,5 -> System.out.println("工作日");
case 6,7 -> System.out.println("休息日");
default -> System.out.println("没有这个星期");
}
}
}
四 循环结构
1 for循环结构
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形 成死循环。
格式:
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
格式解释:
-
初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
-
条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
-
循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
-
条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去
执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
for循环书写技巧:
-
确定循环的开始条件
-
确定循环的结束条件
-
确定循环要重复执行的代码
练习
运行五次HelloWorld
package com.itheima.loopdemo;
public class ForDemo1 {
public static void main(String[] args) {
for (int i=1;i<=5;i++){
System.out.println("HelloWorld");
}
}
}
需求:求1-5之间的数据和,并把求和结果在控制台输出
package com.itheima.test;
public class Test8 {
public static void main(String[] args) {
int sum=0;
for (int i=1;i<=5;i++){
sum=sum+i; //sum +=i;
}
System.out.println(sum);
}
}
需求:求1-100之间的偶数和,并把求和结果在控制台输出 }
快捷键:100.fori
package com.itheima.test;
public class Test9 {
public static void main(String[] args) {
int sum=0;
for (int i = 1; i <= 100; i++) {
if(i%2==0){
sum+=i;
}
}
System.out.println(sum);
}
}
需求:
键盘录入两个数字,表示一个范围。
统计这个范围中。
既能被3整除,又能被5整除数字有多少个?
package com.itheima.test;
import java.util.Scanner;
public class Test10 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个数");
int start=sc.nextInt();
System.out.println("请输入第二个数");
int end=sc.nextInt();
for (int i = start; i <= end; i++) {
if(i%3==0&&i%5==0){
System.out.println(i);
}
}
}
}
统计个数
package com.itheima.test;
import java.util.Scanner;
public class Test10 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个数");
int count=0;
int start=sc.nextInt();
System.out.println("请输入第二个数");
int end=sc.nextInt();
for (int i = start; i <= end; i++) {
if(i%3==0&&i%5==0){
count +=1;
}
}
System.out.println(count);
}
}
2.while循环
格式:
初始化语句;
while(条件判断语句){
循环体;
条件控制语句;
}
for 和 while 的区别:
1.for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
2.for循环中:知道循环次数或者循环的范围
while循环:不知道循环的次数和范围,只知道循环的结束条件
练习
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
package com.itheima.test;
public class Test1 {
public static void main(String[] args) {
double height=8844430;
double paper=0.1;
int count =0;
while(paper<height){
paper=paper*2;
count++;
}
System.out.println(count);
}
}
回文数
需求:给你一个整数 x。
如果x是一个回文整数,打印 true,否则,返回 false。
解释:回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
package com.itheima.test;
public class Test11 {
public static void main(String[] args) {
//1.定义数字
int x=12345;
//定义一个临时变量记录x原来的值
int temp = x;
//记录倒过来的值
int num=0;
while(x!=0){
//从右往左获取每一位数字
int ge=x%10;
//修改x记录的值
x=x/10;
//把当前获取到的数字拼接到最右边
num=num*10+ge;
}
System.out.println(num);
System.out.println(x);
System.out.println(num==temp);
}
}
商和余数
需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围)将两数相除,要求不使用乘法、除法和 % 运算符。得到商和余数。
package com.itheima.test;
public class Test12 {
public static void main(String[] args) {
int dividend=100;//被除数
int divisor=10;//除数
int sum=0;//次数 商
while(dividend>=divisor){
dividend=dividend-divisor;
sum++;
}
System.out.println("余数为"+dividend);
System.out.println("商为"+sum);
}
}
3.do...while循环
格式:
初始化语句;
do{
循环体;
条件控制语句;
}while(条件判断语句);
特点:
先执行,再判断。