一、程序结构

程序的基本结构包括 顺序结构分支结构循环结构

  • 顺序结构按照语句的书写次序依次执行;
  • 选择结构根据条件是否满足来选择条件是否满足来执行对应的程序段,Java提供了if和switch语句用来开发分支结构的程序;
  • 循环结构在给定条件下重复执行一些程序段,Java语言提供了while、do-while、for语句实现循环结构。

二、分支结构

程序中有些程序段的执行是有条件的,当条件成立时,执行一些程序段,当条件不成立时执行另一些程序段或者不执行,这种程序结构就叫做分支结构,也叫选择结构

1、单分支if语句

单一的if语句是最常用的 单分支结构 ,使用一个boolean表达式进行条件判断。如果boolean表达式的值true,表示满足条件,则执行紧跟if语句后{}中的程序段 。


Created with Raphaël 2.2.0 开始 布尔表达式 要执行的语句 结束 yes no


  • 单分支if语句的语法格式如下:
if (布尔表达式){
	// 如果布尔表达式表达式为true将执行的语句
}

2、双分支语句if…else语句

双分支的if…else语句,使用一个boolean表达式进行判断,如果布尔表达式的值为true,表示条件满足,则执行if语句后面紧跟的 {} 中的代码块;如果布尔表达式的值为false,表示条件不满足,则执行else后面紧跟的{}中的代码块。


Created with Raphaël 2.2.0 开始 布尔表达式 要执行的语句1 结束 要执行的语句2 yes no


  • 双分支语句if…else语句的语法格式如下:
if(布尔表达式){
	// 布尔表达式为true时要执行的代码块
}else{
	// 布尔表达式为false时要执行的代码块
}
  • 条件运算符(三元运算符)也可以实现分支结构
    代码示例1:
public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int class1Score, class2Score, maxScore;
        System.out.println("请输入一班的比赛成绩:");
        class1Score = input.nextInt();
        System.out.println("请输入二班的比赛成绩:");
        class2Score = input.nextInt();
        if (class1Score > class2Score) {
            maxScore = class1Score;
        } else {
            maxScore = class2Score;
        }
        System.out.println("优胜班的成绩是:" + maxScore);
    }
}

代码示例2:

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int class1Score, class2Score, maxScore;
        System.out.println("请输入一班的比赛成绩:");
        class1Score = input.nextInt();
        System.out.println("请输入二班的比赛成绩:");
        class2Score = input.nextInt();
        maxScore = (class1Score > class2Score) ? class1Score : class2Score; // 使用 三元运算符 实现双分支结构
        System.out.println("优胜班的成绩是:" + maxScore);
    }
}

上面的两段代码实现的功能一致,可以看出,当双分支结构中判断条件(布尔表达式)与要执行的语句都比较简单是时使用条件运算符(三元运算符)代码会更加简练优雅。

3、嵌套的if…else语句

if语句后面紧跟的{}中的代码块中和else后面紧跟的{}中的代码块中,都可以继续嵌套if…else语句,用以完成更复杂的分支结构。

public class Test {
	public static void main(String[] args) {
		/*
		  判断闰年的逻辑:
		  整百的年份可以被400整除,为闰年,否则不是;其他年份被4整除为闰年,否则不是
		 */
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = scanner.nextInt();
		if (year % 100 == 0) {
			if (year % 400 == 0) {
				System.out.println(year + " 是闰年");
			} else {
				System.out.println(year + " 不是闰年");
			}
		} else {
			if (year % 4 == 0) {
				System.out.println(year + " 是闰年");
			} else {
				System.out.println(year + " 不是闰年");
			}
		}
	}
}

4、多分支if…else if…else语句

当判断条件比较多时,可以使用多分支if…else if…else 语句。


Created with Raphaël 2.2.0 开始 布尔表达式1 执行的语句1 结束 布尔表达式1 执行的语句3 布尔表达式1 执行的语句4 执行的语句2 yes no yes no yes no


  • 多分支if…else if…else语句的语法格式如下:
if(布尔表达式1){
	// 布尔表达式1为true时将被执行的语句
}else if(布尔表达式2){
	// 布尔表达式2为true时将被执行的语句
}else if(布尔表达式3){
	// 布尔表达式3为true时将被执行的语句
}else{
	// 以上分支都没有进入时将被执行的语句
}
public class Test {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入成绩:");
		int score = scanner.nextInt();
		if (score >= 90) {
			System.out.println("成绩为:A");
		} else if (score >= 80) {
			System.out.println("成绩为:B");
		} else if (score >= 70) {
			System.out.println("成绩为:C");
		} else if (score >= 60) {
			System.out.println("成绩为:D");
		} else {
			System.out.println("成绩为:E");
		}
	}
}
  • 在多分支if…else if…else语句中,当某一个作为判断条件的布尔表达式返回true时,即进入对应分支,之后其他分支中的布尔表达式不再进行运算,分支中的语句也不会被执行。
  • 在多分支if…else if…else语句中,else if语句可以出现多次,最后的else语句是可选项。

5、switch语句

switch语句是Java中的多分支结构,switch语句能够根据给定的表达式的值,从多个分支中选择一个分支来执行。相当于if…else if…else… ,但switch语句的可读性更强。

  • switch语句的语法格式入下:
switch(表达式){
case 常量1:
	语句1;
	break;
case 常量2:
    语句2;
    break;
  [...]
  [default:
  	语句n;]
}
  • 示例:
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入成绩:");
		int score = scanner.nextInt();
		int result = score / 10;
		switch (result) {
			case 9:
				System.out.println("成绩为:A");
				break;
			case 8:
				System.out.println("成绩为:B");
				break;
			case 7:
				System.out.println("成绩为:C");
				break;
			case 6:
				System.out.println("成绩为:D");
				break;
			default:
				System.out.println("成绩为:E");
		}
	}
  • 说明:
  • 表达式返回的结果的数据类型可以是byte、short、int、enum、String;
  • case 语句可以出现多次;
  • break语句和default语句是可选项;
  • switch语句首先计算表达式的值,如果表达式的值和那个case后面的常量值相等,就执行该case对应的语句块,直到遇到break为止。如果没有遇到一个常量表达式的值与表达式的值相等,则执行default语句对应的语句块,如果没有default语句switch语句不执行任何操作。

6、 综合案例之任意输入一个年份数与月份数,查出这个月有多少天

package com.husung.test;

import java.util.Scanner;

public class Year {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入您要查询的年份:");
        int year = input.nextInt();
        System.out.println("请输入您要查询的月份:");
        int month = input.nextInt();
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                System.out.println(year + "年" + month + "月有 31 天" );
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                System.out.println(year + "年" + month + "月有 30 天" );
            case 2:
                if (year % 400 == 0){
                    System.out.println(year + "年" + month + "月有 29 天" );
                }else if (year % 4 == 0 && year % 100 != 0){
                    System.out.println(year + "年" + month + "月有 29 天" );
                }else{
                    System.out.println(year + "年" + month + "月有 28 天" );
                }
        }
    }
}
  • 本例中,嵌套使用了switch语句和if…else if…else语句,用以判断用户输入的某一具体年月有多少天。

三、循环结构

  • 有些程序段需要在某些条件下重复执行多次,称为循环结构程序
  • Java提供了三种循环语句实现循环结构,包括while循环语句、do - while循环语句、for循环语句;他们的共同特点是根据给定的条件来判断是否继续执行指定的程序段。

1、while循环

while循环首先使用一个布尔表达式进行条件判断,如果布尔表达式的值为true,表示满足条件,则执行while语句后紧跟的{}中的代码块,这代码段即为 循环体, 循环体执行完之后,再计算布尔表达式进行条件判断 , 如果boolean表达式的值仍为true,便再次执行循环体,形成循环,当布尔表达式的值为false时,直接执行循环体之后的代码块。


Created with Raphaël 2.2.0 开始 布尔表达式 循环体(需要重复执行的语句) 结束 yes no


  • while循环语句的语法格式如下:
while(布尔表达式){
	// 循环体
}
  • while循环的特点是先判断再执行。

2、do-while循环

do-while循环与while循环的原理基本相同,不同的是,do-while循环先执行一遍循环体中的代码块,再计算布尔表达式进行条件判断,如果布尔表达式的值仍为true,便再次执行循环体,形成循环;当布尔表达式的值为false时直接执行循环体之后的代码。


Created with Raphaël 2.2.0 开始 循环体 布尔表达式 结束 yes no


  • do-while循环语句的语法格式如下表:
do{
	// 循环体
}while(布尔表达式)
  • do-while循环的特点是 先执行,再判断

3、for循环语句

for循环语句是程序中使用最多的循环结构,for循环使用三个表达式,分别用来初始化循环变量,判断循环执行条件,以及改变循环变量。


Created with Raphaël 2.2.0 开始 表达式1(初始化循环变量) 表达式2(判断循环执行条件) 循环体 表达式3 (通 常 用 来 改 变 表 达 式 的 值 ) 结束 yes no


  • for循环语法的语法格式如下:
for(表达式1; 表达式2; 表达式3){
	// 循环体;	
}
  • for循环通常用在已知循环次数的情况下。
  • 下面是一个随机生成五位密码的示例:
public class Password {
    public static void main(String[] args) {
        Random random = new Random();
        String pass = "";
        for (int i = 0; i < 5; i++){
            int r = random.nextInt(26); // 产生随机数的上限   [0~26]
            r += 97;  //r的值是区间[97, 122]内的整数,这个区间的整数与ASCII中的
                      //小写字母恰好对应。而(char) r将一个整数转换成对应的字符。
            pass = pass + (char)r;
        }
        System.out.println("pass = " + pass);
    }
}
  • 说明:
  • 本例利用Java提供的随机数的生成方法,配合循环一个五次的for循环语句,生成五位长度的随机密码;
  • Java中生成随机数的方法的类有两个,一个是 java.lang.Mathjava.util.Random类;其中java.lang.Math类中提供的Random()方法可以生成一个[0.0~1.0)之间的随机数;类java.util.Random中提供了一系列的方法可以生成指定范围的随机数,如nextInt() 、nextDouble()等;

4、break语句

Java中提供了break语句,可用于switch语句或while、do-while、for循环语句,如果程序执行到break语句,立即从switch语句或循环体中退出。

5、continue语句

continue语句用于while、do-while、for语句的循环体中,如果程序执行到continue语句,,则结束本次循环,回到循环条件处再次进行判断是否执行。

6、多重循环

如果循环语句的循环体中又包含循环语句,称为嵌套循环。被包含的循环称为 内循环,包含的循环称为外循环,承建的循环嵌套是二重嵌套和三重嵌套;更多的嵌套由于代码逻辑复杂,应当尽量避免使用。循环嵌套既可以是一种循环自身的嵌套,也可以是不同循环语句相互嵌套。

  • 示例:九九乘法表
package com.husung.test;

public class Multiplication {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j <= i ; j++) {
                System.out.print(j + "  * " + i + " = " + i * j + "    ");
            }
            System.out.println();
        }
    }
}