Java 学习笔记—Java基本语法(三)

  • 程序流程控制
  • 顺序结构
  • 分支结构
  • if...else
  • switch...case
  • 循环结构
  • for
  • while
  • do-while
  • while(true)
  • 嵌套循环
  • break 和continue关键字的使用


程序流程控制

顺序结构

没有判断和跳转

分支结构

if…else

三种结构

第一种:

if(条件表达式){
	执行代码块
}

第二种:二选一

if(条件表达式){
	执行代码块1;
}
else{
	执行代码块2;
}

第三种:多选一

if(条件表达式1){
	执行代码块1;
}
else if(条件表达式2){
	执行代码块2;
}
.....
else{
	执行代码块n;
}

补充:使用Scanner类来从键盘获取不同类型的变量
具体实现步骤:
1.导包:import java.util.Scanner
2.Scanner的实例化
3.调用Scanner类的相关方法(next()/nextXxx())来获取制定类型的变量
注意:
需要按照相应的方法,输入制定类型的值。如果输入的数据类型与要求的不匹配时,会报异常:InputMisMatchException,导致程序终止。

import java.util.Scanner;
class ScannerTest{
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		System.out.println("请输入你的姓名:");
		String name = scan.next();
		System.out.println(name);

		System.out.println("请输入你的年龄:");
		int age = scan.nextInt();
		System.out.println(age);

		System.out.println("请输入你的体重:");
		double weight = scan.nextDouble();
		System.out.println(weight);

		System.out.println("你是否单身?(true/false)");
		boolean isone = scan.nextBoolean();
		System.out.println(isone);

		//对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串。

		System.out.println("请输入你的性别(男/女)");
		String gender = scan.next();//"男"
		char genderChar = gender.charAt(0);//获取索引为0上的字符
		System.out.println(genderChar);

	}
}

说明:
1.else结构是可选的。
2. 针对于条件表达式:
1)如果多个条件表达式之间是"互斥"关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
2)如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
3)如果多个条件表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行。
3. if-else 可以相互嵌套
4. 如果 if - else 结构中的执行语句只有一行时,对应的一对{}可以省略,但是不建议省略。
5. 如果没有{},else会进行就近匹配

补充:使用Math.random 获取随机数
公式:[a,b] : (int)(Math.random() * ( b - a + 1 ) + a)

double value = Math.random();//[0.0,1.0)

switch…case

1、格式

switch(表达式){
case 常量1:
	执行语句1;
	break;
case 常量2:
	执行语句2;
	break;
...

default:
	执行语句n;
	//break;
}

2、说明
1)根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则进行入相应case结构中,调用其执行语句。当调用完执行语句后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或switch-case结构末尾位置结束。
2) break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
3)switch结构中的表达式,只能是如下的六种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
4)case之后只能声明常量,不能声明范围。
5)break关键字是可选的。
6)default:相当于 if-else的else。 default也是可选的,而且位置是灵活的。
7)如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。

case 常量1:
case 常量2:
	执行语句a;
	break;
case 常量3:
case 常量4:
	执行语句b;
	break;
...
default:
	执行语句n;
	//break;
}

例题:计算某月某天是某年的第几天

import java.util.Scanner;
class SwitchCase1{
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = scan.nextInt();

		System.out.println("请输入月份:");
		int month = scan.nextInt();

		System.out.println("请输入是当月第几天:");
		int day = scan.nextInt();
		
		int sumDays = 0;
		switch(month){
			case 12:
				sumDays += 30;
			case 11:
				sumDays += 31;
			case 10:
				sumDays += 30;
			case 9:
				sumDays += 31;
			case 8:
				sumDays += 31;
			case 7:
				sumDays += 30;
			case 6:
				sumDays += 31;
			case 5:
				sumDays += 30;
			case 4:
				sumDays += 31;
			case 3:
				//判断year是否闰年
				if((year%4 == 0 && year % 100 !=0)|| year%400 == 0){
					sumDays += 29;
				}
				else{
					sumDays += 28;
				}			
			case 2:
				sumDays += 31;
			case 1:
				sumDays += day;
		}

		System.out.println("是当年的"+sumDays+"天");
		}
	}

说明:
1、凡是可以使用switch-case结构的,都可以转换为if-else。反之,就不成立。
2、写分支结构时,发现既可以使用switch-case,(同时,switch中表达式不太多),又可以使用if-else时,我们优先使用switch-case。原因:switch-case 执行效率高。

循环结构

循环结构的4个要素:
1)初始化条件
2)循环条件
3)循环体
4)迭代条件

for

for(1;2;4){
	3
}

执行过程:1->2->3->4->2->3->4

break的使用
例题:求两数之间最大公约数,最小公倍数

import java.util.Scanner;
class ForTest{
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);
		System.out.println("请输入第一个正整数:");
		int m = scan.nextInt();
		System.out.println("请输入第二个正整数:");
		int n = scan.nextInt();
		//获取两数较小值
		int min = (m < n)? m : n;
		for(int i = min ; i >= 1;i--){
			if(m % i == 0 && n %% i == 0){
				System.out.println("最大公约数为:"+i);
				break;
			}
		}
		//获取两数较大值
		int max = (m > n)? m : n;
		for(int i = max ; i <= m * n;i++){
			if(i % m == 0 && i %% n == 0){
				System.out.println("最小公倍数为:"+i);
				break;
			}
		}
	}
}

while

while 循环的结构

1;
while(2){
	3;
	4;
}

执行过程:1->2->3->4->2->3->4

说明:
1)写while循环不要忘记加迭代条件。一旦丢了,可能导致死循环。
2)写程序要避免出现死循环。
3)for循环和while循环是可以相互转换的。
区别:for循环和while循环的初始化条件的作用域不一样。

do-while

1;
do{
	3;
	4;
}
while(2)

执行过程:1->3->4->2->3->4->2

说明:
1)do-while 循环至少会执行一次循环体
2)开发中,使用for,while多一些,较少使用do-while

while(true)

从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。

import java.util.Scanner;
class ForWhileTest{
	public static void main(String[] args) {
	
		Scanner scan = new Scanner(System.in);
		int positiveNumber = 0;
		int negativeNumber = 0;
		while(true){
			int number = scan.nextInt();
			
			if(number>0){
				positiveNumber++;
			}else if(number<0){
				negativeNumber++;
			}else{
				//一旦执行break,跳出循环
				break;
			}
		}
}
}

说明:
1)不在循环条件部分限制次数的结构:for( ; ; ) 或 while(true)
2)结束循环的几种方式:
方式一:在循环条件部分返回false
方式二:在循环体中,执行break

嵌套循环

使用:
1、嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环。

2、
外层循环:循环结构B
内层循环:循环结构A

3、说明
1)内层循环结构遍历一遍,只相当于外层循环执行了一次。
2)假设外层循环需执行m次,内层循环需执行n次。此时内层循环的循环体共执行了m*n次。

4、技巧
外层循环控制行数
内层循环控制列数

break 和continue关键字的使用

关键字

使用范围

循环中使用的作用(不同点)

相同点

break

switch-case,循环结构中

结束当前循环

关键字后面不能声明执行语句

continue

循环结构中

结束当次循环

关键字后面不能声明执行语句

结束制定标识的一层循环

label: for(int i = 1;i <= 4; i++){
	for(int j = 1;j <= 10;j++){
		if(j % 4 == 0){
			break label;//结束制定标识的一层循环
			continue label;//结束制定标识的一层循环结构当次循环
		}
	}

}