// 过多的if影响代码可读性,建议最多叠3层
if(){
}else if(){
}else {
}
多分支 switch
switch( 表达式 ){
case 常量1:语句1;
break;
case 常量2:语句2;
break;
...
[ default: 语句n ;]
}
细节:
1、case子句中的值必须是常量。
2、不加break则会继续往下执行。
3、case后的常量类型需跟表达式数据类型一致。
4、没有匹配的case时,执行default
5、switch(表达式) 中表达式的返回值必须是:(byte,short,int,char,enum[枚举],String) 中的其中一个
1、判断的具体数值不多,而且符合那6种类型,建议使用switch。
2、对区间判断,对结果为boolean类型判断,使用if,if使用范围更广。
for(循环变量初始化; 循环条件; 循环变量迭代){
循环操作(可以多条语句);
}
案例:
输入年月日,输出为该年的第几天。
import java.util.Scanner;
public class Hello{
public static void main(String[] args){
//判断给定一天是这一年的第几天
Scanner in = new Scanner(System.in);
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
int num = 0;
for(int i = 1; i < month; i++){
if ( i == 2 ){
// 闰年
if (( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0)
num += 29;
else num += 28;
}
else {
if(i != 4 || i != 6 || i != 9 || i != 11)
num = num + 31;
else num = num + 30;
}
}
num += day;
System.out.println(year+"年"+month+"月"+day+"日是该年第"+num+"天");
}
}
while 循环
先判断再执行
while(循环条件){
循环体(语句);
循环变量迭代;
}
//eg:
int i = 1;
while( i <= 10 ){
System.out.println("Hello"+i++);
}
do…while 循环
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
注意:
1、先执行再判断,至少执行一次
2、do while是关键字
3、最后有个分号
案例1:九九乘法表
//打印九九乘法表
//外函数控制行,内函数控制列
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
System.out.print(j + " * " + i + " = " + (i * j)+"t");
}
System.out.println();
}
打印结果:
案例2 金字塔、菱形
// 实心金字塔
// 每行i*2-1颗星,n-行数个空格
System.out.println("输入实心金字塔的行数:");
Scanner in = new Scanner(System.in);
int row = in.nextInt();
for (int i = 1; i <= row; i++){
//输出空格
for(int j = row-i; j > 0; j--){
System.out.print(" ");
}
//输出星
for (int j = i*2-1; j > 0; j--){
System.out.print("*");
}
System.out.println();
}
// 与实心不同的是,除了首尾行,中间行只有首尾有星。
// 即,中间再输出(i-1)*2-1个空格
// 可以看作大金子塔内挖空了一个金字塔
System.out.println("输入空心金字塔的行数:");
int row2 = in.nextInt();
for (int i = 1; i < row; i++){
//输出空格
for(int j = row-i; j > 0; j--){
System.out.print(" ");
}
// 与实心不同的是,除了首尾行,中间行只有首尾有星。
System.out.println("输入空心金字塔的行数:");
int row2 = in.nextInt();
for (int i = 1; i <= row; i++){
//输出空格
for(int j = 1; j <= row-i; j++){
System.out.print(" ");
}
for(int j = 1; j <= i*2-1; j++){
if(j == 1 || j == i*2-1 || i == row)
System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
}
打印结果:
// 打印空心菱形
System.out.println("输入行数:");
int row3 = in.nextInt();
for (int i = 1; i <= row; i++){
//输出空格
for(int j = 1; j <= row-i; j++){
System.out.print(" ");
}
for(int j = 1; j <= i*2-1; j++){
if(j == 1 || j == i*2-1 )
System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
for (int i = 1; i <= row3; i++){
//输出空格
for(int j = 1; j <= i; j++){
System.out.print(" ");
}
for(int j = 1; j <= (row3-i)*2-1; j++){
if(j == 1 || j == (row3-i)*2-1)
System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
打印结果:
终止语句块。
break可以和标签使用
label1:{
label2:{
label3:{...break labeln}
}
}
1、break语句可以通过 label 来指定退出哪层。
2、label1是标签,名字由程序员指定。
3、在实际开发中,尽量不要使用标签。(降低可读性)
4、若没有指定标签,默认退出最近循环体。
案例
//3次输入机会,当输入用户为丁真,密码为666时,登陆成功。
//涉及:字符串匹配,for循环,break跳转控制语句
int n = 3;
Scanner in = new Scanner(System.in);
while(n-- > 0){
System.out.println("请输入用户名:");
String a = in.next();
System.out.println("请输入密码:");
String b = in.next();
if( a.equals("丁真") && b.equals("666")){
System.out.println("登陆成功");break;
}else
System.out.println("登录失败,还有"+n+"次机会");
}
continue
1、结束本次循环,继续执行下一次循环。
2、也可指明要跳过哪层循环。
使用在方法,表示跳出所在方法。



