day03-Java学习

day03-Java学习

1)位运算符

位运算符中相关的移动符号:
<<:左移,将最高符号位舍弃掉,在右边补齐0

>>:右移符号: 如果最高符合为如果是0,在左边补齐0;最高符号位如果是1,左边补齐1

>>>:无符号右移:无论最高符号为是0还是1,始终在左边补齐0

练习:

//请用最有效的方式写出2乘以8 的结果

		2 << 3   -->   2 *  2^3
class TestDemo{
		
	public static void main(String[] args){
		
		//左移符号有一个结论:
		//将该符号左边的数据本身乘以2的移动次幂 : 3 * 2 ^2 = 3 *4 = 12
		System.out.println(3 << 2) ;
		
		//右移符号有一个结论:
		//将该符号左边的数据本身除以2的移动次幂: 24 / 2^2 = 24 / 4 = 6
		System.out.println(24 >> 2) ;
		
		System.out.println(-24 >> 2) ;
		System.out.println(-24 >>> 2) ; //特点:无论最高符号位是0还是1,左边都补0
		//1073741818
	}
}
/*
	3 << 2 :将3这个数据左移动两位
	
	计算出3对应的二进制数据:0b11
	
	00000000	00000000	00000000	00000011 原码(同时也是反码和补码,正数)
	
	
	补码:
		00000000	00000000	00000000	00000011
	(00)000000	00000000	00000000	0000001100			(使用补码左移动两位)
	
	000000	00000000	00000000	0000001100:补码--->反码---原码(正数)
	
	
	=12
	
	
	
	24 >> 2 (将24右移2位)
	
	先算出24对应的二进制:0b11000
	
	00000000	00000000	00000000	00011000(正数:原码,反码,补码都相同)
	
	补码
	00000000	00000000	00000000	00011000
 (00)00000000	  00000000	  00000000	  000110(00)   (正数:补码--反码--->原码)
  0000000000	  00000000	  00000000	  000110
 结果:6
 
 
 
 
 -24 >> 2
 
 负数
 (原码)
	10000000	00000000	00000000	00011000		
反码:
	11111111	11111111	11111111	11100111
											  +1
	-----------------------------------------------------
补码:
	11111111	11111111	11111111	11101000
	  1111111111	  11111111	  11111111	  111010(00)   (换算移动后的补码)
补码
	   1111111111	  11111111	  11111111	  111010  
												  -1
	-------------------------------------------------
反码
	   1111111111	  11111111	  11111111	  111 001
	   
原码
	   1000000000     00000000    00000000    000110
	   
	   -										6

	   
	   
-24 >>> 2
-24的原,反,补
负数
 (原码)
	10000000	00000000	00000000	00011000		
反码:
	11111111	11111111	11111111	11100111
											  +1
	-----------------------------------------------------
补码:
	11111111	11111111	11111111	11101000
	
	
无符号右移
	11111111	11111111	11111111	11101000
	  0011111111	  11111111	  11111111	  111010(00)  
	  
	   0011111111	  11111111	  11111111	  111010  (正数:补码--反码--原码)
	
*/

2)三元运算符

/*
	二目运算符:
	int a = 10 ;
	int b = 20 ;
		a > b 

	三元运算符也称为(三目运算符)
	
	格式:
		(表达式)? 执行true的结果:执行false的结果;
*/
class OperatorDemo{
	
	public static void main(String[] args){
		
		//定义两个变量
		//需求:求两个数据的最大值
		int a = 100 ;
		int b = 200 ;
		
		//定义变量
		//(表达式)? 执行true的结果:执行false的结果;
		int max = (a >b)? a : b ;
		System.out.println("两个数据的最大值是:"+max) ;
		
		System.out.println("-----------------------") ;
		
		
		//比较两个数据是否相等
		
		//定义两个变量
		int m = 10 ;
		int n = 20 ;
		//boolean flag = (m==n)? true :false ;
		//==:比较运算符 :结果就是true或则false
		//优化:改进
		boolean flag = m == n ;
		System.out.println("flag:"+flag) ;
		System.out.println("-----------------------") ;
		
		//求三个数据的最大值
		int x = 50 ;
		int y = 30 ;
		int z = 40 ;
		
		//方式1:使用中间第三方变量进行操作 (开发中常使用:推荐方式)
		//定义中间变量temp
		int temp = (x > y)? x : y ;
		//使用temp和z变量进行比较
		int result = (temp > z)? temp : z ;
		System.out.println("result:"+result) ;
		
		System.out.println("-----------------------") ;
		
		//方式2:直接三元运算符 一步走
		int result2 = (x > y) ?((x>z)? x : z) :((y>z)? y : z) ;
		//int result2 = x > y ?x>z? x : z :y>z? y : z ; // 去掉括号:阅读性差!
		System.out.println("result2:"+result2) ;
		
	}
}

3)键盘录入数据

/*

Scanner类(java.util.Scanner):文本扫描器

基本使用:
	1)导包 在Java中只要不是java.lang包下的类都需要导包
	位置在class上面, 格式import java.util.Scanner; (用哪个类导哪个类)
	

	2)固定格式:创建一个文件扫描器对象
		Scanner 对象名 = new  Scanner(System.in) ;
	
	3)接收数据:
		int 变量名=  对象名.nextInt() ;
		
	4)输出变量名即可!

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

class ScannerTest{
	public static void main(String[] args){
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//提示
		System.out.println("请您输入一个数据:") ;
		//接收数据:int类型数据
		int a = sc.nextInt() ;
		
		System.out.println("a:"+a) ;
		//没有说明类型:都是int
	}
}

4)流程控制语句

If语句

/*
	Java中的流程控制语句:
	三大类:
		1)顺序结构语句
			代码从上到下依次加载!
		2)选择结构语句
			if结构语句
				三种格式:
					if(条件表达式){
						语句;
					}
					
					//开发中:if格式2使用居多
					if(条件表达式){
						语句1;
					}else{
						语句2;
					}
					
					if(条件表达式1){
						语句1;
					}else if(条件表达式2){
						语句2;
						
					.....
					}else{
						语句n+1;
					}
					
			switch结构语句
					
		3)循环结构语句
*/
class OrderTest{                 //OrderTest.class
	
	//main()方法---->被jvm调用
	public static void main(String[] args){
	//在System类中有一个方法exit(int status): 参数为0,jvm正常终止
		
		System.out.println("程序开始了....") ;
		
		//System.exit(0) ; //终止jvm(java虚拟机)
		
		System.out.println("I love Java") ;
		
		System.out.println("程序结束了....") ;
	}
}
/*
	if语句的三种格式的第一种:
		if(条件表达式){
			语句;
		}
		
执行流程:
	1)首先判断条件表达式是否成立,
	如果成立,true,就执行语句
	否则,不会执行!
	
应用场景:
  针对单个条件判断
*/
//导包
import java.util.Scanner ;
class IfTest{
	public static void main(String[] args){
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//提示并接收
		System.out.println("请您录入一个数据:") ;
		int x = sc.nextInt() ;
		/*
			if(条件表达式){
				语句;
			}
		*/
		if(x >=5){
			System.out.println("x的值大于等于5") ;
		}
		
		System.out.println("over");
		
	}
}

注意事项:
使用If语句的注意事项:
1)有左大括号{的地方不能有分号,有分号的地方不能有左大括号{
2)if语句中如果是单个语句,{}可以省略,但是不建议!
3){}表示一个作用域,定义变量需要在{}这个作用域范围内使用

class IfTest{
	public static void main(String[] args){
		
		//定义一个变量
		int a = 10 ;
		/*
		if(a >=10){ 
			System.out.println("a大于等于10") ;
		}
		*/
		//错误写法
		if(a <10);//if语句没有意义:if没有语句体,分号表示一个语句结束
		
		//代码块:局部代码块 :限定变量的生命周期!
		{  
			int x = 10 ;
			System.out.println(x) ;
			System.out.println("a大于等于10") ;
		}
		//System.out.println(x) ; //访问x变量超出了它的作用域范围
		System.out.println("程序结束了...") ;
		
		System.out.println("--------------------------") ;
		
		int m = 5 ;
		if(m>=5)  //可以省略{},不建议
			System.out.println("大于等于5") ;
		
	}
}
/*
if语句的格式2:
		
		if(条件表达式){
			语句1;
		}else{
			语句2;
		}
		
执行流程:
	1)判断条件表达式是否成立,如果成立,执行语句1
	2)如果不成立,执行语句2;

应用场景:
	针对两种情况进行判断!
	
	
	//键盘录入两个数据,比较两个数据中的最大值
	//键盘录入一个数据,判断这个数据是否是偶数?
	
	
	三元运算符和if格式2的区别?
	三元运算符连接的是两个数据的数据值(针对这个是数据值进行比较或者判断)
	if格式2是一种流程控制语句:
		范围要比三元运算符大,不仅仅可以判断两个数据数据值还可以操作具体语句
		
	能够使用if格式2实现的不一定能够使用三元运算符;
	但是如果能够三元运算符实现的一定能够使用if格式2 
		(在开发中,针对业务逻辑判断还是使用if格式2)
*/

//导包
import java.util.Scanner;
class IfTest{
	public static void main(String[] args){
		
		//定义两个变量
		int a = 10 ;
		int b = 20 ;
		if(a>b){ //true
			System.out.println("a大于b") ;
		}else{//false
			System.out.println("a小于等于b") ;
		}
		
		System.out.println("over") ;
		System.out.println("-----------------") ;
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//提示并接收
		System.out.println("请输入第一个数据:") ;
		int firstNum = sc.nextInt() ;
		System.out.println("请输入第二个数据:") ;
		int secondNum = sc.nextInt() ;
		
		//方式1:可以直接if格式2 
		//定义变量
		int max ;
		if(firstNum>secondNum){
			max  = firstNum ;
		}else{
			max = secondNum;
		}
		System.out.println("max:"+max);
		
		//方式2:使用三元运算符
		int max2 = (firstNum > secondNum)? firstNum :secondNum ;
		System.out.println("max2:"+max2);	
		
		System.out.println("-----------------") ;
		//提示并接收
		System.out.println("请输入一个数据:") ;
		int x = sc.nextInt() ;
		
		//使用if格式2
		if(x % 2 == 0){//% :模 求余
			System.out.println("该数据是一个偶数") ;
		}else{
			System.out.println("该数据是一个奇数") ;
		}
		
		//三元运算符:
		//String s = (x % 2 == 0) ? (System.out.println("该数据是一个偶数");):  (System.out.println("该数据是一个奇数");) ;
		//System.out.println(s) ;
	}
}
/*
	if格式3:
		if(条件表达式1){
			语句1;
		}else if(条件表达式2){
			语句2;
		...
		
		...
		}else{
			语句n+1;
		}
		
执行流程:
	1)先判断条件表达式1是否成立,如果成立,执行语句1;
	2)如果条件表达式1不成立,继续判断条件表达式2是否成立,如果成立,执行语句2
	3)如果条件表达式2不成立,依次这样判断...
	4)如果以上条件都不成立,执行esle中语句n+1;
*/

/*
		需求:键盘录入一个成绩(0-100分),
		然后判断学生是"优秀","较好","一般","及格","不及格"
		
		
			90~100   优秀
			80~90	 较好
			70~80    一般
			60~70    及格
			60以下   不及格
			
			
			
		需求
		1.
		
		x和y的关系满足如下:
			x>=3, y = 2x + 1;
			-1<=x<3, y = 2x;
			x<=-1, y = 2x – 1;
			
		键盘录入x的值,求y的值;
		
		2.:键盘录入一个月份的值: 
		判断是什么季节
		
			3,4,5  春季
			6,7,8  夏季
			9,10,11 秋季
			12,1,2  冬季
*/

//导包
import java.util.Scanner ;
class IfDemo4{
	
	public static void main(String[] args){
		//创建键盘录入对象
		Scanner scanner = new Scanner(System.in) ;
		
		//提示并接收数据
		System.out.println("请您输入一个学生成绩:") ;
		int score = scanner.nextInt() ;
		/*
		if(score>=90 && score<=100){
			System.out.println("该学生成绩优秀") ;
		}else if(score>=80 && score<90){
			System.out.println("该学生成绩较好") ;
		}else if(score>=70 && score<80){
			System.out.println("该学生成绩一般") ;
		}else if(score >= 60 && score <70){
			System.out.println("该学生成绩及格") ;
		}else{
			System.out.println("不及格!!") ;
		}
		
		*/
		//这个程序写完了,存在漏洞:当前用户输入一个非法数据,没有友情提示(用户体验不好)
		
		//测试的时候:针对错误数据测试,还有测试正确数据,在边界数据!
		
		if(score>100 || score < 0){
			System.out.println("您输入的数据是一个非法数据...") ;
		}else if(score>=90 && score<=100){
			System.out.println("优秀...") ;
		}else if(score >=80 && score<90){
			System.out.println("较好...") ;
		}else if(score>=70 && score<80){
			System.out.println("一般...") ;
		}else if(score >= 60 && score <70){
			System.out.println("刚及格...") ;
		}else{
			System.out.println("不及格...")  ;
		}
		
	}
}
练习1:

​ x和y的关系满足如下:

​ x>=3, y = 2x + 1;
​ -1<=x<3, y = 2x;
​ x<=-1, y = 2x – 1;
​ 键盘录入x的值,求y的值;

//导包
import java.util.Scanner ;
class IfTest{
	public static void main(String[] args){
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//提示并接收
		System.out.println("请您输入x的值:");
		int x = sc.nextInt() ;
		
		//定义y变量
		int y = 0 ;
		if(x>=3){
			 y = 2*x+1;
		}else if(x >=-1 && x <3){
			y = 2 * x ;
		}else{
			y = 2*x - 1;
		}
		
		System.out.println("y的值是:"+y) ;
		System.out.println("-------------------------") ;
		
练习2:

​ 键盘录入一个月份的值:
​ 判断是什么季节

​ 3,4,5 春季
​ 6,7,8 夏季
​ 9,10,11 秋季
​ 12,1,2 冬季

import java.util.Scanner;
class IfTest1{
	public static void main(String[] args){
//提示并接收数据
		System.out.println("请您输入一个月份的值:") ;
		int month = sc.nextInt() ;
		
		if(month > 12 || month < 1){
			System.out.println("地球没有该月份...") ;
		}else if(month >= 3 && month <= 5){
			System.out.println("春季") ;
		}else if(month >= 6 && month <= 8){
			System.out.println("夏季") ;
		}else if(month >= 9 && month <= 11){
			System.out.println("秋季") ;
		}else{
			System.out.println("冬季") ;
		}
	}
}
/*
	if格式2的嵌套
		if(条件表达式1){
			if(条件表达式2){
				
			}else{
			
			}
		}else{
			if(条件表达式3){
			
			}else{
				
			}
	
		}
练习3:

键盘录入三个数据,获取最大值

import java.util.Scanner;
class IfTest2{
	public static void main(String[] args){
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//提示并录入
		System.out.println("请输入第一个数据:") ;
		int a = sc.nextInt() ;
		System.out.println("请输入第二个数据:") ;
		int b = sc.nextInt() ;
		System.out.println("请输入第三个数据:") ;
		int c = sc.nextInt() ;
		//之前的写法:中间第三方变量 + 三元运算符
		int temp = (a>b)? a: b ;
		int max = (temp > c)? temp : c ;
		System.out.println("max:"+max) ;
		System.out.println("-----------------------") ;
		//if格式嵌套;
		int max2 ;
		if(a>b){
			if(a>c){
				max2 = a ;
			}else{
				max2 = c ;
			}
		}else{
			if(b>c){
				max2 = b ;
			}else{
				max2 = c ;
			}
		}
		
		System.out.println("max2:"+max2) ;
	}
}

switch语句

/*
switch 选择结构语句

格式:
	
	switch(表达式){
	case 值1:
		语句1;
		break ;		
	case 值2: 
		语句2;
		break ;
	...
	...
	default:
		语句n+1;
		break ;
	}

执行流程:
1)switch后面的表达式需要和case语句中的值进行匹配
如果值1匹配了,就执行语句1,遇见break 结束switch语句;
如果值1不匹配,就看值2是否匹配,如果匹配,执行语句2,遇见break结束;


如果上面都不匹配,执行default中的语句n+1,break结束语句;

​ break ; 属于跳转控制语句中一种: “结束,中断” ,

​ 应用场景:是在switch以及loop(循环语句中使用)

面试题:
		switch后面表达式可以是什么样的数据类型?
​		一般情况:可以byte,short,char,int类型的	
​		JDK5以后,是可以跟枚举 (enum)类型的 (引用类型)
​		JDK7以后,是可以跟String类型的(引用类型)

练习1:

​ 键盘录入一个数据,判断星期几
​ 1,星期一
​ 2,星期二
​ …

//导包
import java.util.Scanner;
class SwitchDemo{
	public static void main(String[] args){
		
		//break ; //单独使用不了; 在 switch 或 loop 外部中断
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		//提示并接收
		System.out.println("请您输入一个数据(1-7):") ;
		int week = sc.nextInt() ;
		switch(week){
		case 1 :
			System.out.println("星期一") ;
			break ;
		case 2:
			System.out.println("星期二") ;
			break ;
		case 3:
			System.out.println("星期三") ;
			break ;
		case 4:
			System.out.println("星期四") ;
			break ;
		case 5:
			System.out.println("星期五") ;
			break ;
		case 6:
			System.out.println("星期六") ;
			break ;
		case 7:
			System.out.println("星期日") ;
			break ;
			
		default:
			System.out.println("数据不合法...") ;
			break ;
		}
		
	}
}
重点:
/*
	switch语句使用的注意事项:
		1)default语句是可以放在语句中的任何位置,不影响执行流程!
		(建议default语句使用的时候放在语句末尾)
			如果放在语句中,最好带上break,否则会造成case穿透!
		2)switch语句的结束条件:
			遇见break结束或者程序默认执行到末尾!
			
		3)case语句后面的值只能是常量,不能变量(Java是一种强类型语言)			
		
		
		javascript:前端,简称js,弱类型语言 (switch语句的case后面既可以是常量也可以变量)
	
*/

import java.util.Scanner;
class SwitchDemo2{
	public static void main(String[] args){
		
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		//提示并接收
		System.out.println("请您输入一个数据(1-7):") ;
		int week = sc.nextInt() ;
		int b = 3 ;
		switch(week){
		
		default:
			System.out.println("数据不合法...") ;
			//break ;
		case 1 :
			System.out.println("星期一") ;
			//break ;
		case 2:
			System.out.println("星期二") ;
			break ;
		//case b: //需要常量表达式  :错误的写法
		case 3:
			System.out.println("星期三") ;
			break ;
		case 4:
			System.out.println("星期四") ;
			//break ;
		case 5:
			System.out.println("星期五") ;
			//break ;
		case 6:
			System.out.println("星期六") ;
			//break ;
		case 7:
			System.out.println("星期日") ;
			//break ;
					
		}
		
	}
}

键盘录入:

小细节:
先录入整数,在录入字符串类型,会出现字符串数据漏掉了

​ 原因就是回车符号的问题
​ (录入完整数,按"回车符号",将回车当做了字符串录入,所以后面字符串被漏掉了)

解决方案:

​ 在录入字符串的时候,重新创建一个键盘录入对象

//导包
import java.util.Scanner;
class SwitchTest{
	public static void main(String[] args){
		
		//录入一个整数类型,在录入字符串类型(String)
		Scanner sc = new Scanner(System.in) ;
		
		
		//接收整数
		int a = sc.nextInt() ;
			//录入字符串
			
		//此时:创建一个新的键盘录入对象
		Scanner sc2 = new Scanner(System.in) ;
		String b = sc2.nextLine() ; //正式的录入字符串:nextLine()
	
		System.out.println("a:"+a+",b:"+b);
		
	}
}
练习2:
//看程序,写结果
class SwitchTest{
	public static void main(String[] args){
		//int x = 2 ;
		//int y = 3 ;
		/*
		switch(x){
		
			default:	//当前case后面的值都和switch中的表达式不匹配,才执行default语句;
				y++ ;
			
			
			case 2 :
				y ++ ;	 //3+1=4		//遇见break,程序默认执行到末尾
			case 4:
				y ++ ; //4+1 = 5
		}
		*/
		int x = 2 ;
		int y = 3 ;
		switch(x){
		
			default:	//当前case后面的值都和switch中的表达式不匹配,才执行default语句;
				y++ ; //3+1 = 4 ;
			
			case 3 :
				y ++ ;	 //4+1 = 5
				break ;
			case 4:
				y ++ ; //5+1
		}
		
		System.out.println("y:"+y);
		int a = 2 ;
		int b = 3 ;
		switch(a){
			default:
				b ++ ;
				break ;
			case 2:
				b++;
			case 3:
				b++;
		}
		System.out.println("b:"+b); //5
	}

}
练习3:
/*
	需求:
		使用switch语句模拟一个单项选择题:
			'A','B','C','D'
			
分析:

	0)模拟
	你喜欢的明星是谁?
	"65 高圆圆"
	...
	
	1)'A'----->对应ASCII码表的值:65
	  'B'						 66
	  'C'						 67
	  'D'						 68
	2)使用键盘录入一个字符(Scanner不能录入字符的),但是可以录入int类型数据			录入字符串:String nextLine()
	然后将int类型强制转换成char类型
	3)switch(转换char类型数){
	case 'A':
		语句;
		break;
	...
	}
	  
	 
	
	
*/
//导包
import java.util.Scanner;
class SwitchTest2{
	public static void main(String[] args){
		
		//提供几个选项
		System.out.println("您喜欢什么饮料?") ;
		System.out.println("65 可乐") ;
		System.out.println("66 雪碧") ;
		System.out.println("67 冰峰") ;
		System.out.println("68 水") ;
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		//提示并接收
		System.out.println("选择您的答案:") ;
		int choice = sc.nextInt() ;	
		
						//String str = sc.nextLine() ;(推荐这个方式录入字符串)	String str = sc.next() ;
		//将int类型强制char类型
		char choiceNumber = (char)choice;
		switch(choiceNumber){
			case 'A':
				System.out.println("您选择的答案正确!") ;
				break ;
			case 'B':
				System.out.println("您选择的答案错误!") ;
				break ;
			case 'C':
				System.out.println("您选择的答案错误!") ;
				break ;
			case 'D':
				System.out.println("您选择的答案错误!") ;
				break ;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值