流程控制:就是程序执行的过程:顺序、选择、循环
if可以单独使用
if(条件表达式){
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}
int score=70;
if(score>=60){
System.out.println("及格了");
System.out.println("及格万岁");
}
System.out.println("无论if是否成立都会执行的代码段");
二选一
if(条件表达式){
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else{
不能单独使用
else后面没有条件
是if条件不满足时执行的代码
}
int score =50;
if(score >=60){
System.out.println("及格万岁");
System.out.println("!!!!");
}else{
System.out.println("挂科了");
System.out.println("哭了");
}
System.out.println("不受if和else的影响");
步骤:
(1)设置断点,当程序执行到断点的位置,就会停止在这一行(这一行还没有执行)
(2)程序下一步执行 F6
(3)程序可以执行到下一个断点,如果没有断点执行完毕 F8
(4)当鼠标悬停在变量的,可以看到变量的值
(5)启动的时候要用debug
【练习一】 判断一个数字value ,如果数字==8,输出“发发发”,
否则如果value<8 太小了,如果>8输出太大了
在if条件中,一定要避免并列的if条件中出现相同变量值判断。
int value=9;
if(value==8){
System.out.println("发发发");
}
if(value>8){
System.out.println("大了");
}
if(value <8){
System.out.println("小了");
}
使用if else
int value=9;
if(value==8){
System.out.println("发发发");
}else{
if(value>8){
System.out.println("大了");
}else{
System.out.println("小了");
}
}
多选一,执行的时候,会从上到下依次跟if条件进行匹配,
只要遇见匹配的条件则进入代码块执行。之后,不会再继续进行向下匹配(只匹配依次)
if(条件表达式){
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else if(条件表达式)
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else if(条件
表达式)
条件成立时执行的代码段(如果代码只有一句话,则可以不写{ })
}else{
不能单独使用
else后面没有条件
是if条件不满足时执行的代码
}
if外侧的语句无论条件是否成立都会正常执行
【练习二】
int w=121;
if(w<=100){
System.out.println("我很瘦");
}else if(w<=120){
System.out.println("需要去健身房");
}else if(w<=110){
System.out.println("我不能继续再吃了");
}else{
System.out.println("不能出门了");
}
}
【在if else if else中要注意的问题】
switch(表达式){
case 常量表达式1:操作1;break;
case 常量表达式2:操作1;break;
case 常量表达式3:操作1;break;
...
case 常量表达式n:操作1;break;
default:默认执行的语句;
}
public class Day3_1_ControlSwitch {
public static void main(String[] args) {
int x=2;
switch(x){
// 可以两个条件执行同一句话,去掉第一个里面break。(不建议)
// case 1:
case 1:System.out.println("值为1");break;
case 2:System.out.println("值为2") ;break;
case 3:System.out.println("值为3");break;
default :System.out.println("值未知");
}
思考: if else和switchcase 相比有哪些区别
从内部运行的角度:switch case直接跳转到符合case语句,进行执行。
if else if …else 是从上到下依次进行匹配
if else if …else优缺点
优点:if else 能够应用于更复杂的业务逻辑,更灵活
缺点:匹配的时候,从上到小, 效率较低
switch case优缺点:
优点:执行的效率较高,因为当条件匹配的时候,直接跳转
缺点:代码量多,不灵活,重要的是case只能处理常量。
如果分支很多, 但是业务并不复杂,可以使用switch case
如果业务相对复杂,需要比较灵活的处理,使用if else
public class Day3_2_ControlLoop4 {
public static void main(String[] args) {
需求
System.out.println("*");
System.out.println("*");
System.out.println("*");
System.out.println("*");
System.out.println("*");
while(条件表达式){ 循环体; }
首先判断表达式是否成立,如果成立 ,则会执行循环体,如果循环体执行完毕,会继续
判断表达式是否成立,如果成立,则继续执行,否则离开while循环,不再执行循环体的内容
int i = 1;
while (i++<= 5) { ++i错误
System.out.println("*");
i=i+1;
i+=1;
i++;
++i;
}
1+2+3+4..100
先考虑产出1 2 3...100
int num = 1;
int s = 0;
while (num <= 100) {
System.out.println(num);
s=s+num;
s += num;
num++;
}
System.out.println(s);
语法: do{ 循环体 }while(条件表达式)
先执行一次循环体中的内容,再进行条件表达式的判断,如果成立,则继续重新执行循环体, 否则不再执行循环体。
int time = 1;
do {
System.out.println("*");
time++;
} while (time <= 5);
对比while 和do while do while一定会先执行一次,无论条件是否满足 while是先判断是否满足,才执行。
如果第一次执行条件就不满足,这两种循环执行的结果不同
语法: for(初始化语句;条件表达式;循环控制语句){ 循环体 }
执行过程:
for(内容):内容哪一个部分都可以不写
【练习】使用for循环解决打星星的问题
for (int i = 1; i <= 5; i++) {
System.out.println("*");
}
for 1+2+3+。。。100
int su = 0;
for (int i = 1; i < 101; i++) {
System.out.println(i);
su=su+i;
su += i;
}
System.out.println(su);
无限循环: 不代表永远执行下去,跳出循环时间、时刻,可以由循环体内部进行决定
while (true){
}
不是死循环
int i=0;
while(i>=0){
i++;
}
死循环
byte b = 0;
while (b <= 127) {
b++;
}
for 进行永久循环
while(true)
for(;;){
}
int i=1;
Effecive Java 教导:局部便利浪作用域一定要最小化
for(;i<=5;i++){
System.out.println(i);
}
外循环每执行一次,内层循环都会执行一轮。
背景 :每行打印5个星星,打印10行
for (int i=1;i<=10;i++){
System.out.println("*****");
}
解决,使用循环打印五个星星
for (int i = 0; i < 5; i++) {
System.out.print("*");
}
打印10行
for (int j = 0; j < 10; j++) {
for (int i = 0; i < 5; i++) {
System.out.print("*");
}
System.out.println();
}
j=0 i=0 i=1 i=2 i=3 i=4
j=1 i=0 i=1 i=2 i=3 i=4
思考: 比较下面的程序,外循环次数尽量少,对于内存执行的效率会稍微高一些。
for(int i=0;i<10;i++){
for (int j=0;j<100000;j++){
}
}
for(int i=0;i<100000;i++){
for (int j=0;j<10;j++){
}
}
练习: 1. 输出1..100以内所有的奇数和所有的偶数
2. 输入10个数,找到最大值和最小值输出
for (int i = 1; i < 101; i++) {
%2
if (i % 2 == 0) {
System.out.println("偶数" + i);
} else {
System.out.println("奇数" + i);
}
}
Scanner sc=new Scanner(System.in);
int max=0,min=0;
for(int i=0;i<5;i++){
System.out.println("请输入一个数字");
int n=sc.nextInt();
if(i==0){
max=i;
min=i;
}else{
if(max<n){
max=n;
}
if(min>n){
min=n;
}
}
}
System.out.println("max="+max);
System.out.println("min="+min);
希望通过exit来控制程序退出
Scanner sc=new Scanner(System.in);
int max=0,min=0;
System.out.println("请输入一个数字");
String temp;
boolean tag=true;
while(!"exit".equalsIgnoreCase(temp=sc.next())){
int n=Integer.parseInt(temp);
if(tag){
max=n;
min=n;
tag=false;
}else{
if(max<n){
max=n;
}
if(min>n){
min=n;
}
}
System.out.println("请输入一个数字");
temp=sc.next();
}
System.out.println("max="+max);
System.out.println("min="+min);
背景 :需求希望从0123…查找有没有3这个数
当循环的过程中,希望终止循环,可以使用跳出循环的 关键字
分两种:break continue
break和continue使用的时候,原则上都是有条件的使用 。
for (int i =0;i<11;i++){
if(i==3){
System.out.println("找到了");
}else{
System.out.println("不是3");
}
}
#### 1.break
作用:跳出当前循环
break有两种用法,switch case中,在循环中。
boolean tag=true;
for (int i = 0; i < 11; i++) {
if (i == 3) {
System.out.println("找到了");
tag=false;
break;
}
}
if(tag)
System.out.println("没找到30");
练习:判断一个数是否是质数
质数(素数):只能被1和自己整除的数
思路
(1)num 从2.3…num-1 当成除数,num当成被除数,是否能够被整除,
如果能够被任何一次整除了,说明不是质数
如果从来都没有被整数 ,说明是质数
(2)判断是否“不是质数”
int num1=97;
num1当被除数 2.3.4 ...num1-1 当除数,看一下是否可以被整除
boolean t=true;
for (int i=2;i<(int)Math.sqrt(num1)+1;i++){
if(num1%i==0){
System.out.println("不是质数");
t=false;
break;
}
}
if(t)
System.out.println("是质数");
因式分解 16 1*16 2*8 4*4 8*2 16*1
17 4.n*4.n
结束本次循环
注意:在使用continue的时候,后面一定要有可执行的的有效代码,才有意义,
否则程序不会报错,但是continue没有效果
for (int i = 0; i < 11; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}
判断1..20之间所有的数,输出所有数字,如果是偶数则标记
for (int i=1;i<21;i++){
if(i%2==0){
System.out.println("是偶数"+i);
continue;
}
System.out.println(i);
}
continue无效的时候
for(.){
contiune
}
可以对循环起名字(循环标签)
定义 :在循环的上方 名字:
out:
for (int i=0;i<5;i++){
for(int j=0;j<10;j++){
if(j==2)
break out;
}
}
}