Java零基础入门(三)流程控制

流程控制

1. 分支结构

1.1 if-else条件判断结构

书写方法:

结构一:
if(条件表达式){
	执行表达式
}
结构二:二选一
if(条件表达式){
	执行表达式1
}else{
	执行表达式2
}
结构三:n选一
if(条件表达式){
	执行表达式1
}else if(条件表达式){
	执行表达式2
}else if(条件表达式){
	执行表达式3
}
...
else{
	执行表达式n
}

说明:

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

1.2. switch-case选择结构

书写方法

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

说明:

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

补充:

  • 如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
  • *if和switch语句很像,具体什么场景下,应用哪个语句呢?
  • 如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几 种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
  • 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。 也就是说,使用switch-case的,都可以改写为if-else。反之不成立

2. 循环结构

2.1. 循环结构的四要素

① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件 说明:通常情况下,循环结束都是因为②中循环条件返回false了。

2.2. 三种循环结构:

for循环结构

for(①;②;④){
    ③
}
//执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②


 说明:
对于①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
对于②循环条件部分为boolean类型表达式,当值为false时,退出循环
对于④可以有多个变量更新,用逗号分隔

while循环结构

①
while(②){
	③;
	④;
}
//执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

注意:写while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环!

for和while循环总结:

  1. 开发中,基本上我们都会从for、while中进行选择,实现循环结构。
  2. for循环和while循环是可以相互转换的! 区别:for循环和while循环的初始化条件部分的作用范围不同。
  3. 我们写程序,一般要避免出现死循环。

do-while循环结构

①
do{
  ③;
  ④;
  }while(②);
//执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②

说明:

  1. do-while循环至少会执行一次循环体!

  2. 开发中,使用for和while更多一些。较少使用do-while

  3. 数组循环比遍历通常用for循环

  4. 触发条件复杂的用while循环

“无限循环”结构: while(true) 或 for(;;)

如何主动结束一个循环结构?

  • 在循环体中,执行break

嵌套循环

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

说明:
① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次
② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
③ 外层循环控制行数,内层循环控制列数

/练习一:
    /*
		******
		******
		******
		******
		*/
    for(int j = 1;j <= 4;j++ ){
        for(int i = 1;i <= 6;i++){
            System.out.print('*');
        }
        System.out.println();
    }
//练习二:
/*			i(行号)		j(*的个数)
		*			1			1
		**			2			2
		***			3			3
		****		4			4
		*****		5			5
		*/
for(int i = 1;i <= 5;i++){//控制行数
    for(int j = 1;j <= i;j++){//控制列数
        System.out.print("*");
    }
    System.out.println();
}

3. 关键字:break和continue

break和continue关键字的使用

 使用范围循环中的作用(不同点)相同点
breakswitch-case 循环结构中结束当前循环关键字后面不能声明执行语句
continue循环结构中结束当次循环关键字后面不能声明执行语句

注意:

break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句

return:并非专门用于结束循环的,它的功能是结束一个方法。 当一个方法执行到一个return语句时,这个方法将被结束。

与break和continue不同的是,return直接结束整个方法,不管 这个return处于多少层循环之内

很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条 语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同 于goto的

4. 补充:Scanner类的应用

如何从键盘获取不同类型的变量:需要使用Scanner类

具体实现步骤:

  1. 导包:import java.util.Scanner;
  2. Scanner的实例化:Scanner scan = new Scanner(System.in);
  3. 调用Scanner类的相关方法next() 或 nextxxx(),来获取指定类型的变量

注意: 需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchException导致程序终止

//1.导包:import java.util.Scanner;
import java.util.Scanner;
class ScannerTest{
    public static void main(String[] args){
        //2.Scanner的实例化
        Scanner scan = new Scanner(System.in);
        //3.调用Scanner类的相关方法
        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 isLove = scan.nextBoolean();
        System.out.println(isLove);
        //对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串
        System.out.println("请输入你的性别:(男/女)");
        String gender = scan.next();//"男"
        char genderChar = gender.charAt(0);//获取索引为0位置上的字符
        System.out.println(genderChar);	
    }
}

练习题目

第一题:求ax2+bx+c=0方程的根。 求ax2+bx+c=0方程的根。a,b,c分别为函数的参数, 如果a≠0,那么: (1)当b2-4ac>0,则有两个解; (2)当b2-4ac=0,则有一个解; (3)当b2-4ac<0,则无解; 如果a=0,b≠0,那么,

提示1:Math.sqrt(num); sqrt指平方根
例如:
求x2-4x+1=0方程的根
求x2-2x+1=0方程的根


import java.util.Scanner;

class Exer5{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		
		System.out.println("一元二次方程:ax^2+bx+c=0");
		System.out.print("请输入参数a:");
		double a = input.nextDouble();
		
		System.out.print("请输入参数b:");
		double b = input.nextDouble();
			
		System.out.print("请输入参数c:");
		double c = input.nextDouble();

		if(a!=0){
			double temp = b*b - 4*a*c;
			if(temp==0){
				double x = -b/(2*a);
				System.out.println("该方程是一元二次方法,有两个相同解:" + x);
			}else if(temp>0){
				double sqrt = Math.sqrt(temp);
				double x1 = (-b+ sqrt)/(2*a);
				double x2 = (-b- sqrt)/(2*a);
				System.out.println("该方程是一元二次方法,两个不同解:" + x1 +"," + x2);
			}else{
				System.out.println("该方程是一元二次方法,在实数范围内无解!");
			}
		}else{
			if(b!=0){
				double x = -c/b;
				System.out.println("该方程是一元一次方程,有一个解:" + x);
			}else{
				System.out.println("不是方程,是一个等式");
                if(c == 0){
                    System.out.println("等式成立");
}else{
    System.out.println("等式不成立");
}
			}
		}
	}
}

第二题 假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,提示用户输入一个两位数,然后按照下面的规则判定用户是否能赢。

1)如果用户输入的数匹配彩票的实际顺序,奖金10 000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3 000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1 000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。

提示:使用Math.random() 产生随机数
Math.random() 产生[0,1)范围的随机值
Math.random() * 90:[0,90)
Math.random() * 90 + 10:[10,100) 即得到 [10,99]
使用(int)(Math.random() * 90 + 10)产生一个两位数的随机数

import java.util.Scanner;

class TestCaiPiao{
	public static void main(String[] args){
		//1、随机产生一个两位数
		//System.out.println(Math.random());//产生[0,1)
		int number = (int)(Math.random()*90 + 10);//得到[10,99],即[10,100)
		//System.out.println(number);
		
		int numberShi = number/10;
		int numberGe = number%10;
		
		//2、用户输入一个两位数
		Scanner input = new Scanner(System.in);
		System.out.print("请输入一个两位数:");
		int guess = input.nextInt();
		
		int guessShi = guess/10;
		int guessGe = guess%10;
		
		if(number == guess){
			System.out.println("奖金10 000美元");
		}else if(numberShi == guessGe && numberGe == guessShi){
			System.out.println("奖金3 000美元");
		}else if(numberShi==guessShi || numberGe == guessGe){
			System.out.println("奖金1 000美元");
		}else if(numberShi==guessGe || numberGe == guessShi){
			System.out.println("奖金500美元");
		}else{
			System.out.println("没中奖");
		}
		
		System.out.println("中奖号码是:" + number);
	}
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页