Java菜鸟学习之路之基础编程---程序流程控制之if - else判断结构和switch - case判断结构、Scanner从控制台获取输入详解(四)

1.程序流程控制

  • 流程控制语句是用来控制程序中个语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑块。
  • 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:

        顺序结构
                程序从上到小逐行的执行,中间没有任何判断和跳转。

        分支结构
   
            (1)根据条件,选择性的执行某段代码
                (2)有if - else和switch - case两种分支语句

        循环结构
                (1)根据循环条件,重复性的执行某段代码
                (2)有while、do......while、for三种循环语句
                (3)注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素 

1.1 if - else语句解析:


 

注意点:

 

  • 分支结构中的if - else(条件判断结构)使用方法: 
         第一种:单选(当且仅当条件表达式为真时,才进入内部执行执行语句,否则不执行)

         
          if(条件表达式 ){

                执行语句;

            }

         第二种:二选一(肯定会执行一个,当条件表达式为真时,执行执行语句1,否则执行执行语句2) 

            if(条件表达式){

                    执行语句1;

            }else{

                    执行语句2;

            }

        第三种:多选一(肯定会执行一个,具体执行请参照二选一)     

            if(条件表达式1){

                   执行语句1;

            }else if(条件表达式2){

                   执行语句2;

            }else if(条件表达式3){

                   执行语句3;

            }...(条件表达式n - 1){

                  执行语句n - 1;

           }else{

                  执行语句n;

           }

if - else语句测试用例:

public class If_Test {
	public static void main(String[] args) {
		//举例1	单选
		int age = -30;
		if(age < 0 || age > 200) {
			System.out.println("您的年龄有误");	//您的年龄有误
		}
		System.out.println("执行完毕");	//执行完毕
		
		//举例2	二选一
		int age1 = 26;
		if(age1 > 16) {
			System.out.println("您已成年,可以上网了");	//您已成年,可以上网了
		}else {
			System.out.println("对不起,你的年龄未达标,不能上网");
		}
		
		//举例3	多选一
		int num = 30;
		if(num < 0) {
			System.out.println("负数");
		}else if(num == 0) {
			System.out.println("0");
		}else if(num <= 50){
			System.out.println("小于35的正数");		//小于35的正数
		}else {
			System.out.println("大于35的正数");
		}
	}
}


if - else嵌套语句测试用例: 

/*编写程序:由键盘输入三个整数分别存入变量num1、num2、num3
 * 对它们进行排序(使用if - else	if - else),并且从小到大输出
 * 说明:
 * 	1.if - else语句可以相互嵌套
 * 	2.如果if-else判断条件执行语句里执行语句只有一行时,那么判断条件的一对{}可省略,效果相同,但是实际开发中不建议如此使用
 * */
import java.util.Scanner;

public class IfExer_Test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入第一个整数: ");
		int num1 = scan.nextInt();
		System.out.println("请输入第二个整数: ");
		int num2 = scan.nextInt();
		System.out.println("请输入第三个整数: ");
		int num3 = scan.nextInt();
		if(num1 >= num2) {
			if(num3 > num1) {
				System.out.println(num2 + " "+num1 +" "+ num3);
			}else if(num2 > num3) {
				System.out.println(num3 + " "+num2 +" "+ num1);
			}else {
				System.out.println(num2 + " "+num3 +" "+ num1);
			}
		}else {
			if(num3 < num1) {
				System.out.println(num3 + " "+num1 +" "+ num2);
			}else if(num2 < num3) {
				System.out.println(num1 + " "+num2 +" "+ num3);
			}else {
				System.out.println(num1 + " "+num3 +" "+ num2);
			}
		}
		
	}
}


单层if语句和双层if - else语句省略{}测试用例:

public class IfExer2_Test {
	public static void main(String[] args) {
		//输出结果:Hello World!
		int x = 4;
		int y = 1;
		if(x > 2) { 	//此条判断语句通过
			if(y > 2)	//此条判断语句不通过,实际将if语句后面的一对{}省略了
				System.out.println('A');	//if条件语句里真正的执行语句
				System.out.println("Hello World!");		//跳出单层if判断条件之后的默认并列顺序执行语句
				x++;	//跳出单层if判断条件之后的默认并列顺序执行语句
		}else {
			System.out.println('C');
		}
		
		//为了避免出现编译错误,并且增强代码可读性,不管判断条件之后的执行语句是否为一句,都不建议省略判断条件之后的一对{}
		//对于单层if判断语句,假如省略掉if判断条件后的一对{},那么紧跟在if条件后的一句语句为执行语句,有且仅有一句语句被当作if判断条件后续执行语句,之后的语句都为顺序执行得语句
		//对于多层if-else判断语句,假如if判断条件后面省略掉一对{},并且if语句后面的执行语句不止一句的话,那么会出现编译错误,错误为if判断语句找不到与之对应的else语句来执行,默认第二句顺序执行的操作为与之匹配的else
	
		//***************************************************
		//在if-else判断执行条件下都没有{}限定下,else与其最近的if判断条件进行匹配(就近原则)
		//输出结果:C
		int x1 = 4;
		int y1 = 1;
		if(x1 > 2)  	//此条判断语句通过,因为单层if判断语句只能照顾之后的一行执行语句,这条语句相当于里面的if-else执行语句相当于进入内部判断条件的大环境
			if(y1 > 2)	//在没有{}的情况下,这个if判断语句刚好也只能照顾后面一行,就等价于if(x1 > 2)照顾了System.out.println('A');这条执行语句
				System.out.println('A');	
		else 
			System.out.println('C');	//在if-else都没有{}的情况下,else判断条件与离其最近的if判断条件相匹配
	}
}

 

小知识点:如何从键盘(控制台)获取不同类型的变量输入:需要使用Scanner类

  • 具体实现步骤:

    1.导包:import java.util.Scanner;

            导包作用:将在java中类库包下自带的具体功能实现类,导进当前工程下,才可以进行使用

            导包的位置:声明在最外层类声明的上面当前包的下面

    eclipse中快捷导包指令:ctrl + shift + o

     

    2.Scanner类的实例化(创建Scanner的对象,来调用其中的非私有属性或者方法)

     

    3.调用Scanner类下的相关方法(next / nextXxx),来获取接收指定类型的变量

Scanner对象从控制台获取指定数据类型的测试用例:

import java.util.Scanner;
//1.导包

/*如何从键盘(控制台)获取不同类型的变量输入:需要使用Scanner类
 * 	具体实现步骤:
 * 		1.导包:import java.util.Scanner;		(ctrl + shift + o)	eclipse中快捷导包指令
 * 			导包作用:将在java中类库包下自带的具体功能实现类,导进当前工程下,才可以进行使用
 * 			导包的位置:声明在最外层类声明的上面,当前包的下面
 * 		2.Scanner的实例化(创建Scanner的对象,来调用其中的非私有属性或者方法)
 * 		3.调用Scanner类下的相关方法(next() / nextxxx()),来获取指定类型的变量
 * */
public class Scanner_Test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);	
		//2.创建Scanner类的实例化对象,System.in不可忽略,表示从键盘输入的意思
		
		System.out.println("请输入您的学号: ");		//在从控制台输入之前,对用户必要友好的提示
		
		int number = scan.nextInt(); 	//获取int整数类型的数据 
		//3.Scanner对象实例,调用类当中的nextInt()方法来从控制台来获取(接收)指定类型的数据,数据由用户自己输入
		
		System.out.println(number);		
		//输出从控制台接收到的信息
		
		System.out.print("请输入你的姓名: ");
		String name = scan.next();	//获取String字符串类型的数据
		System.out.print(name);
		
		System.out.print("请输入你的体重: ");
		double weight = scan.nextDouble();	//获取double双精度浮点类型的数据
		System.out.print(weight);
		
		System.out.println("你是否未婚: (true / false)");
		boolean isMarried = scan.nextBoolean();		//获取boolean布尔类型的数据
		System.out.println(isMarried);
		
		//对于字符char型的获取,Scanner没有提供相关的方法,只能获取一个字符串
		System.out.println("请输入你的性别 :(男 / 女)");
		String sex = scan.next();	//字符串类型输入
		char sexChar = sex.charAt(0);	//获取索引为0处的char型元素
		//注意:字符串和数组中的索引角标值都是从0开始的
		//非要获取字符型的数据也可以,String类当中提供了charAt(index)的方法,获取字符串中指定索引角标处的字符型元素;
		//例如"HelloWorld",s.charAt(2) = 'l';
		System.out.println(sex);
	}
}

注意事项: 

  • 输入的数据必须和用户要获取的数据类型相匹配(可以自动向上进行类型提升的数据也是允许的),如果输入数据类型与要求类型不匹配时,运行时会报出InputMismatchException的错误(异常),导致程 序终止运行。

小知识点:如何获取一个随机数呢:需要使用Math类 

  • 具体实现步骤:
/*如何获取一个随机数:10	-	99
 * Math类里面有一个方法叫random 
 * 	返回一个double类型的随机数,这个数大于等于0.0,小于1.0
 * */
public class Random_Test {
	public static void main(String[] args) {
		
		int random = (int)(Math.random() * 90 + 10);
		
		System.out.println(random);
		
		
		//公式:[a,b]		(int)(Math.random() * (b - a + 1) + a);
		//之后就可以取到[a,b]区间上的任意一个值了
		//易错点:没使用()包起来指定位置,(int) Math.random * (b - a + 1) + a;
		//Math.random()取值为[0.0,1.0),不加括号,直接对Math.random()进行强转取整,只能取到int型的0,0*任何数都等于0,再加上a,只能是个定值a,所以随机数没随机
	}
}

 

1.2 switch - case结构解析


  • 使用方式:


    switch(表达式){ //这里的表达式并非是一个条件表达式,而是一个常量

            case 常量1:

                执行语句1;

                break; //非必要,根据情况决定是否去添加

           case 常量2:

                  执行语句2;

                  break;

           ...

           default:

                  执行语句n;

                  break; //可加可不加,本身已经到达表达式最后了,必然会跳出判断语句

       }

说明:

        (1)根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case执行结构中的执行语句去执行,当调用完执行语句以后,则仍然继续向下执行其他case中的执行语句,直到遇到break关键字或者执行完最后一个default的执行语句末尾才会结束执行

 

        (2)default默认执行语句只有在前面的所有case语句都未匹配的情况下才会执行,并且执行语句之后的break可加可不加,因为此执行语句本身就在末尾,执行完此执行语句之后,会默认跳出switch - case条件判断语句

 

        (3)break关键字,可以使用到switch - case结构中,表示一旦遇到此关键字,就跳出条件判断语句

 

        (4)switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)

 

        (5)case之后只能声明常量,不能声明一个范围(条件判断语句)

 

        (6)break关键字是可选的

 

        (7)default可以理解成相当于if - else条件判断语句中的else(兜底执行操作)。

default结构式可选的。并且default的位置可以是任意的,并且不影响执行结果。


switch - case语句的测试用例:

public class SwitchCase_Test {
	public static void main(String[] args) {
		int num = 2;
		switch(num) {
		case 0:
			System.out.println("zero");
			break;
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");	
			break;
		case 3:
			System.out.println("three");
			break;
		default:
			System.out.println("other");	
		}
		
		//switch - case语句中无break跳出语句执行结果two,three,other
		//switch - case语句中都有break跳出语句执行结果two
		
	}
}

注意:switch - case击穿现象

        当有case语句执行语句之后未加break跳出判断条件语句时,那么当前指定匹配case执行语句和下面的case语句都会因为没有break跳出语句,接下来case中的执行语句都会按序执行,出现这种情况叫做switch - case的击穿现象,这种情况会在case语句中没有break跳出语句时出现

       那就意味着接下来的语句结束条件:1.在接下来的case执行语句之后直到遇到break
                                                              2.一直执行接下来的case语句,直到最后一个default默认匹配语句执行完毕
 

switch - case练习的测试用例:

/*例题:对学生成绩大于60分的,输出"合格"。低于60分的,输出"不合格"。
 * 	使用switch - case语句来实现
 *  说明:如果switch - case语句中的多个case的执行语句相同,可以进行合并
 * */
public class SwitchCaseExer2_Test {
	public static void main(String[] args) {
		int score = 78;
		//此种情况下,真实的case情况种类太多,难以实现
		/*switch(score) {
		case 0:
			System.out.println("不合格");
			break;
		case 1:
			System.out.println("不合格");
			break;
		//...
		case 100:
			System.out.println("合格");
			break;
		default:
			System.out.println("成绩不符合规范");
		}*/
		
		switch(score / 10) {	//直接通过除法运算,将情况以几何倍数减少
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			System.out.println("不合格");
			break;
		case 6:
		case 7:
		case 8:
		case 9:
		case 10:
			System.out.println("合格");
			break;
		default:
			System.out.println("成绩不符合规范");
		
		}
	}
}

说明:如果switch - case语句中的多个case的执行语句相同,可以进行合并

switch - case练习的测试用例2:

import java.util.Scanner;
/*编写程序:从键盘上输入2019年的"month"和"day",要求通过程序输出输入的日期为2019年的第几天
 * */
public class SwitchCaseExer4_Test {
	public static void main(String[] args) {
		System.out.println("请输入要输入的month:");
		Scanner scan = new Scanner(System.in);
		int month = scan.nextInt();
		System.out.println("请输入要输入的day:");
		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:sumDays += 28;
			case 2:sumDays += 31;
			case 1:sumDays += day;
		}
		System.out.println("今天是2019年的第:"+ sumDays + "天");
	}
}

说明:break在switch - case结构中是可选的

 

switch - case练习的测试用例2升级版本:

import java.util.Scanner;

/*编写程序:从键盘上输入年"year"和"month"和"day",要求通过程序输出输入的日期为2019年的第几天
 * */
public class SwitchCaseExer4_Test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("请输入你想查询的年份:");
		int year = scan.nextInt();
		System.out.print("请输入要输入的month:");
		int month = scan.nextInt();
		System.out.print("请输入要输入的day:");
		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: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("今天是"+ year +"年的第"+ sumDays + "天");
	}
}

 

if - else和switch - case之选择说明:

        (1)凡是可以使用switch - case的语句都可以使用if - else语句,反之,不成立(边界模棱两可型、不可使用的数据类型的情况)

       (2)当写分支结构时,既可以使用if - else,也可以使用switch - case的情况下,(case规模量不大的情况下)优先选择使用switch - case语句。原因:switch - case执行效率稍高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值