1.三元运算符
三元运算符/三目运算符
二目运算符
int a = 10 ;
int b = 20 ;
a>b 的结果:
三元运算符的格式:
(表达式)?执行语句1(具体的结果):执行语句2(具体的结果)
执行的流程:
1)先判断表达式的结果是否成立,如果结果为true,就执行成立的语句1;
否则不成立,则执行不成立的语句2;
例子 需求:
(1)定义三个变量,求三个变量中的最大值
class Demo1{
public static void main(String[] args){
//1)定义三个变量,求三个变量中的最大值
//定义三个变量
int x = 100 ;
int y = 120 ;
int z = 60 ;
int temp = (x > y)? x : y ;
//定义结果变量max2
int max2 = (temp>z)? temp : z ;
System.out.println("三个数据中的最大值是:"+max2) ;
System.out.println("------------------------------------") ;
//方式2:三元运算符的嵌套
int max3 = ( x > y)?((x>z)?x:y):((y>z)?y:z) ;
//int max3 = x > y?x>z?x:y:y>z?y:z ;
System.out.println("三个数据中的最大值是:"+max3) ;
2.键盘录入数据
使用步骤:
1)导包 用哪个一类,就需要导入到当前Java文件中(只要不是java.lang包下的类,都需要导入)
固定写法:
import java.util.Scanner;
2)固定格式:创建文本扫描器对象
Scanner 对象名 = new Scanner(System.in) ;
3)提示并录入数据 (默认录入int类型)
System.out.println("请您输入数据:") ;
int 变量名= 对象名.nextInt() ;
4)完成自己的业务操作:使用这个变量名(求两个数据是否相等/比较数据最大值等等...)
导包
import java.util.Scanner ;
class Demo2{
public static void main(String[] args){
//创建文本扫描器对象(键盘录入数据对象)
Scanner sc = new Scanner(System.in) ;
System.out.println("请您输入一个数据:") ;//默认int
int num = sc.nextInt() ;
//String num = sc.nextLine() ;//录入字符串类型
System.out.println("您输入的数据是:"+num) ;
}
}
练习:
1)键盘录入三个数据,比较三个数据中的最大值
import java.util.Scanner ;
class Test2{
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() ;
//方式1:分步实现
//使用a和b比较,将结果交给第三方变量:记录最大值
int temp = (a>b)?a:b;
//使用temp和c进行比较,最终求最大值
int max = (temp >c)? temp:c ;
System.out.println("三个数据中的最大值是:"+max) ;
System.out.println("---------------------------------") ;
//方式2:一步走:使用三元运算符嵌套
int max2 = (a > b)?((ra>c)? a:c):((b>c)?b:c) ;
System.out.println("三个数据中的最大值是:"+max2) ;
键盘录入数据的细节
1)录入两个int类型,分别输出
2)录入两个String类型(字符串),分别输出
3)先录入一个String,在录入int,分别输出值
4)先录入int,在录入String,分别输出
存在问题:字符串数据没有值
先录入int,在录入String----->
Scanner类:nextLine():录入字符串,录入整行数据,
当录入完int之后,按回车之后,"回车符号"的原因,
"回车符号"本身就是字符数据,导致字符串数据并没有录入,而是空行
正式用法: nextLine()
解决方案:
1)可以使用next()录入
2)在使用nextLine()方法,重新创建键盘录入数据对象
//导包
import java.util.Scanner ;
class IfDemo4{
public static void main(String[] args){
//1)录入两个int类型,分别输出
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("录入第一个数据:") ;
int a = sc.nextInt() ;
System.out.println("录入第二个数据:") ;
int b = sc.nextInt() ;
//2)录入两个String类型(字符串),分别输出 nextLine()录入
System.out.println("录入第一个数据:") ;
String a = sc.nextLine() ;
System.out.println("录入第二个数据:") ;
String b = sc.nextLine() ;
//3)先录入一个String,在录入int,分别输出值
System.out.println("录入第一个数据:") ;
String a = sc.nextLine() ;
System.out.println("录入第二个数据:") ;
int b = sc.nextInt() ;
//4)先录入int,在录入String,分别输出
System.out.println("录入第一个数据:") ;
int a = sc.nextInt() ;
System.out.println("录入第二个数据:") ;
//String b = sc.nextLine() ;
//方式1:String b = sc.next() ;
//方式2:在录入字符串之前,创建一个新的键盘录入数据对象
Scanner sc2 = new Scanner(System.in) ;
String b = sc2.nextLine() ;
System.out.println("a:"+a+",b:"+b) ;
}
}
3.流程控制语句
3.1顺序控制语句
顺序结构语句:
当进入到类中之后,jvm调用main方法,代码由上而下依次加载
除非一种特例:当jvm退出了就不会进行执行了!
后期System类中有一个功能:exit(int status) 参数里面为0,表示正常终止jvm
class Demo3{
public static void main(String[] args){
//定义变量
int a = 10 ; //局部变量(在方法定义中的变量)
System.out.println("a:"+a) ;
System.out.println("程序开始了...") ;
System.out.println("我爱Java,") ;
//正常终止正在运行的jvm,main方法就结束了
System.exit(0) ;
System.out.println("程序结束了...") ;
System.out.println("over...") ;
}
}
3.2选择控制语句
3.2.1 if语句
if语句 有三种格式
if语句格式1:
if(表达式){
语句;
}
执行流程:
1)首先表达式是否成立,成立,则执行该语句
2)不成立,不会进入if里面;
应用场景:针对一种情况判断
if语句格式注意事项:
1)有{括号的地方不能有分号;
2)当前if(表达式){
语句 ;
}
import java.util.Scanner ;
class IfDemo{
public static void main(String[] args){
//创建键盘录入数据
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入一个数据x:") ;
int x = sc.nextInt() ;
if(x>=10){
System.out.println("x大于或者等于10") ;
}
if(x<10){
System.out.println("x小于10") ;
}
//错误写法:有{地方,不能有;,冲突的!
//if(x>=10); //if语句没有意义了
/*
{
System.out.println("x大于或者等于10") ;
}
{
//局部代码块:主要的作用就是限定局部变量 "生命周期"
//y的变量只能在{}内有效,超出这个范围,就无法访问
int y = 1000 ;
System.out.println("y:"+y) ;//y:1000
}
//System.out.println(y) ;
System.out.println("over...") ;
}
if选择结构语句格式2:
针对两种情况进行判断!
if(表达式){
语句1;
}else{
语句2;
}
执行流程:
1)先判断表达式是否成立,如果成立,执行执行语句1;
2)如果不成立,则执行语句2;
需求:键盘录入两个数据,比较两个数据是否相等
举例:登录 ----->String类型 :字符串数据 equals(String str):
比较两个字符串是否相等
import java.util.Scanner ;
class IfDemo2{
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() ;
if(a==b){
System.out.println("这个两个数据相等") ;
}else{
System.out.println("这个两个数据不相等") ;
}
System.out.println("-----------------------------------") ;
//定义一个变量
boolean flag ;
if(a == b){
flag = true ;
}else{
flag = false ;
}
System.out.println("flag:"+flag) ;
}
}
开发中 在业务中进行流程判断: if...else结构会经常用到
举例:登录 ----->String类型 :字符串数据 equals(String str):
比较两个字符串是否相等
模拟登录操作:
1)用户键盘录入用户名和密码和已知存在的用户名和密码进行对比
键盘录入数据:录入字符串类型
键盘录入的对象名.nextLine()
键盘录入的对象名.nextInt():整数int
2)如果一致,"登录成功"
3)否则,"登录失败"
//导包
import java.util.Scanner ;
class IfTest{
public static void main(String[] args){
//使用String字符串类:
//已知存在用户名和密码
String username = "admin" ;
String password = "admin" ;
//创建键盘录入数据对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
//录入用户名
System.out.println("请您输入用户名:") ;
String name = sc.nextLine() ;
System.out.println("请您输入密码:") ;
String pwd = sc.nextLine() ;
//录入的用户名和密码和已知存在的用户名和密码必须都一致
//if结构
//字符串数据 equals(String str):比较
两个字符串是否相等
if(name.equals(username) && pwd.equals(password)){
//成立: 两个都一致
//提示"登录成功"
System.out.println("恭喜您,登录成功...") ;
}else{
System.out.println("对不起,用户名或者密码输入错误!!!") ;
}
}
}
[点击并拖拽以移动]
面试题:
if语句格式2和三元运算符有什么区别?
if是一个流程控制语句,不仅能够表示具体的结果,而且还可以一个输出语句体现;
但是三元运算符,一般情况:就是最终是具体的结果体现!
if范围大于三元;能够使用三元运算符实现的一定能够使用if格式2;反之,不一定!
if(表达式){
语句1;
}else{
语句2;
}
(表达式)?执行true的结果:执行false的结果;
举例:
键盘录入一个数据,判断这个数据是否是偶数!(能够被2整除...)
import java.util.Scanner ;
class IfDemo3{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入一个数据:") ;
int num = sc.nextInt() ;
//if格式2
if(num % 2 ==0){
System.out.println("当前这个数据"+num+"是一个偶数") ;
}else{
System.out.println("当前不是偶数...") ;
}
System.out.println("---------------------------------") ;
//三元运算符
//String str =
//(num % 2== 0)?System.out.println("当前这个数据"+num+"是一个偶数"):System.out.println("当前不是偶数...") ;
//System.out.println(str) ;
String str = (num%2==0)? "当前这个数据"+num+"是一个偶数":"当前不是偶数..." ;
System.out.println(str) ;
}
}
[点击并拖拽以移动]
if格式2的嵌套
if(表达式){
if(表达式1){
语句1;
}else{
语句2;
}
}else{
if(表达式2){
语句3;
}else{
语句4;
}
}
键盘录入三个数据,获取三个数据中的最大值,分别使用三元运算符/if格式2嵌套
import java.util.Scanner ;
class Test1{
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() ;
//三元运算符
//两种方式
//方式1:分步实现
int temp = (a>b)? a: b ;
int max = (temp >c)?temp:c ;
System.out.println("最大值是:"+max) ;
System.out.println("-----------------------------") ;
int max2 = (a>b)?((a>c)?a:c):((b>c)?b:c) ;
System.out.println("最大值是:"+max2) ;
System.out.println("-----------------------------") ;
//定义变量
int max3 ;
//if格式2嵌套
if(a>b){
//继续判断
if(a>c){
max3 = a ;
}else{
max3 = c ;
}
}else{
//上面不成立继续判断b和c
if(b>c){
max3 = b ;
}else{
max3 = c ;
}
}
System.out.println("最大值是:"+max3) ;
}
}
if语句格式3
针对多种情况进行判断
if(表达式1){
语句1 ;
}else if(表达式2){
语句2;
}else if(表达式3){
语句3;
.......
}else{
语句n+1;
}
执行流程:
1)首先判断表达式1是否成立,如果成立,则执行语句1;
2)如果上面表达式1不成立,继续判断表达式2是否成立,如果成立,执行语句2
3)如果表达式2也不成立,继续判断表达式3是否成立,如果成立,执行语句3
4)如果上面的条件表达式都不成立,则执行最终语句n+1 ;
举例:
键盘录入学生的成绩(1-100分),判断学生的登记
90-100 优秀
80-90 良好
70-80 较好
60-70 及格
60以下 不及格
//导包
import java.util.Scanner ;
class IfDemo5{
public static void main(String[] args){
//创建键盘录入数据对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入学生成绩:") ;
int socre = sc.nextInt() ;
if(socre>100 || socre<0){
System.out.println("您输入的数据不合法...") ;
}else if(socre>=90 && socre <=100){
System.out.println("该学生成绩优秀...") ;
}else if(socre >=80 && socre< 90){
System.out.println("该学生成绩良好...") ;
}else if(socre>=70 && socre<80){
System.out.println("该学生成绩较好...") ;
}else if(socre>=60 && socre<70){
System.out.println("该学生成绩及格...") ;
}else{
System.out.println("不及格") ;
}
}
}
[点击并拖拽以移动]
3.2.2 选择结构语句switch
switch语句的格式
switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break ;default:
语句n+1 ;
break ;
}
执行流程:很类似于if格式3
1)switch中的表达式的结果值和case语句匹配,值1和结果匹配,
就执行语句1,遇见break,switch结束;
2) 值1和switch表达式结果不匹配,继续判断值2是否匹配,如果匹配,就执行语句2,switch语句结束.
3)如果case语句后面值都不匹配,这个执行default语句,执行语句n+1,程序执行到末尾结束...
break:属于跳转控制语句中的一种
结束,中断意思! (不能单独使用,只能在switch和循环语句中使用)
面试题:
switch跟的表达式可以是什么数据类型?
能够跟的基本类型:int,byte,short,char
Jdk版本不同的跟的类型不一样
JDK5以后,可以 跟枚举: enum : 枚举类(引用类型,里面的都常量!)
JDK5以后新特性
JDK7以后:可以跟String类型
需求:键盘录入一个数据(1-7),判断星期
Switch语句的注意事项:
1)case语句后面只能是常量
2)case语句中beark 最好携带上,如果没有携带break语句,会造成"case穿透"
"case穿透":
某个case语句中没有带break,此时当跟case的值匹配,这个时候继续就往下执行,不会在判断case!
3)default语句可以在switch语句中的任何位置,不会影响switch的执行流程
如果在语句中,
default里面的break千万不能省略;省略,造成case穿透
如果在语句末尾,break可以省略不写
4)switch语句的结束条件是什么?
a)遇见break结束
b)程序默认执行到末尾
import java.util.Scanner ;
class SwitchDemo{
public static void main(String[] args){
//break;
//创建键盘录入对象
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模拟 "单项选择题"
import java.util.Scanner;
class Test10{
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();
char choiceNumber =(char)choice;
switch (choiceNumber){
case 'A' :
System.out.println("恭喜您,选项正确!");
break;j,
case 'B' :
System.out.println("对不起,选项错误!");
break;
case 'c' :
System.out.println("对不起,选项错误!");
break;
case 'D' :
System.out.println("对不起,选项错误!");
break;
default :
System.out.println("没有这个选项!");
break;
}
System.out.println("----------------");
Scanner sc =new Scanner(System.in);
System.out.println("你喜欢的篮球运动员是谁:");
System.out.println("A 杜兰特");
System.out.println("B 詹姆斯");
System.out.println("C 库里");
System.out.println("D 哈登");
String choice1 = sc.nextLine();
switch (choice1){
case "A" :
System.out.println("恭喜您,选项正确!");
break;
case "B" :
System.out.println("对不起,选项错误!");
break;
case "C" :
System.out.println("对不起,选项错误!");
break;
case "D" :
System.out.println("对不起,选项错误!");
break;
default :
System.out.println("没有这个选项!");
break;
}
}
}
3.3循环控制语句
for循环语句的格式
for(初始化语句;条件表达式;步长语句/控制体语句){
循环体语句;
}
执行流程:
1)初始化语句对变量进行赋值
2)判断条件表达式是否成立;
如果是成立,执行循环体语句;
3)继续执行控制体语句
4)继续回到2)里面判断
如果是成立,执行循环体语句;
继续回到3)
...
一直执行到条件不成立结束;
需求:输出所有的 "水仙花数"!
三位数: 100-999
每个位的立方之和是这个数据本身 :153
分析:
1)"水仙花数"是三位数,已经明确了取值范围100-999 (变量x记录)
2)水仙花数的特点:这三位数上的每各位的数据本身的立方之和的结果当前当前数据本身
153 = 1*1*1+ 5*5*5 + 3*3*3
153 % 10 余数3 :
153 / 10 % 10 余数5
153 /10 /10 % 10 余数1
3)在循环内定义三个变量:(如何计算每各数据的数据本身)
int ge = x % 10 ;
int shi = x /10 % 10 ;
int bai = x /10 /10 % 10 ;
4) 这三位数上的每各位的数据本身的立方之和的结果当前当前数据本身:
加入判断
if((ge*ge*ge + shi*shi*shi+bai*bai*bai)==x){
//输出x
}
*/
class ForTest2{
public static void main(String[] args){
//1)"水仙花数"是三位数,已经明确了取值范围100-999 (变量x记录)
for(int x = 100; x <1000 ; x ++){
//2)定义三个变量:分别带个位,十位,百位
int ge = x % 10 ;
int shi = x /10 % 10 ;
int bai = x /10/10 %10;
//3)加入判断
//这三位数上的每各位的数据本身的立方之和的结果当前当前数据本身:
if((ge*ge*ge+shi*shi*shi+bai*bai*bai)==x){
//输出x
System.out.println("水仙花数是:"+x) ;
}
/*
水仙花数是:153
水仙花数是:370
水仙花数是:371
水仙花数是:407
*/
}
}
}
常见的两种死循环
for循环的死循环格式(开发中使用不多,jdk原码中会见到这种格式)
for(;;){
当满足某个条件的时候,结束 ----->break;
循环体语句;
}
开发中,使用多:while循环:死循环格式
while(true){
当满足某个条件的时候,结束 ----->break;
循环体语句;
}
class WhileDemo3{
public static void main(String[] args){
for(;;){
System.out.println("我很开心了") ;
}
while(true){
//开发中,需要判断条件----当达到某种条件的时候,结束掉!
System.out.println("我很开心了") ;
}
}
}
3.4 循环结构语句
执行流程:
1)先初始化赋值
2)判断条件表达式是否成立,成立,则执行循环体语句-
3)执行控制体语句---继续判断条件是否成立,----循环,,,
...
4)执行到条件表达式不成立,while语句结束
1)输出所有水仙花数
2)统计水仙花数多少 个
class WhileDemo{
public static void main(String[] args){
int y = 100 ;
while(y<=999){
//定义每各为数据:个位,十位,百位
int ge = y % 10 ;
int shi = y /10 % 10;
int bai = y/10/10%10;
//满足条件:每各位的立方和是它本身
if(y==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println("水仙花数是:"+y) ;
}
y++ ;
}
System.out.println("----------------------------------") ;
//统计水仙花数多少个
//水仙花数:三位数,每各位的立方和是它本身
//定义统计变量
int count = 0 ;
//定义初始化语句
int j = 100 ;
while(j<=999){
//定义每各为数据:个位,十位,百位
int ge = j % 10 ;
int shi = j /10 % 10;
int bai = j/10/10%10;
//满足条件:每各位的立方和是它本身
if(j==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
//统计变量++
count ++ ;
System.out.println("第"+count+"个的水仙花数是:"+j) ;
}
j++ ;
}
System.out.println("水仙花数共有:"+count+"个") ;
}
}
while和for循环的区别
1)共同点:都时能够实现循环的效果;
2)从格式有些差异
通用格式:
for循环:整个操作(初始化语句;条件表达式;控制体语句){
}
初始化语句;
while(条件表达式){
循环体
控制体语句
}
注意: 当前明确循环次数时候,优先使用for循环;不明确循环次数使用的while循环
for使用最多;
需求:键盘录入数据,猜数字小游戏
分析:
1)得需要产生一个随机数---->使用jdk--->java.lang.Math:数学运算的工具类
1-100之间的随机数
产生随机数的功能
2)键盘录入一个数据:guessNumber
while(true){
3)需要不断的录入数据,
4)判断guessNumber和随机数进行比较,如果大了,提示大了
小了,提示"猜的数字小了"
如果一致,提示"恭喜您,猜中了"
break ;
}
*/
//导包
import java.util.Scanner ;
class WhileTest2{
public static void main(String[] args){
//要产生一个1-100之间的随机数
int num = (int)(Math.random()*100+1) ;
//死循环
while(true){
//需要不断的录入数据,
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入一个是数字(1-100):") ;
//键盘录入一个数据:guessNumber
int guessNumber = sc.nextInt() ;
//判断
if(guessNumber>num){
//大了
System.out.println("您要猜的数字大了...") ;
}else if(guessNumber<num){
//小了
System.out.println("您要猜的数字小了...") ;
}else{
System.out.println("恭喜您,猜中了!!!") ;
//中断循环
break ;
}
}
}
}
do-while循环语句的格式
初始化语句;
do{
循环体语句;
控制体语句;
}while(条件表达式) ;
执行的流程:
1)初始化语句赋值
2)执行循环体语句
3)执行控制体语句
4)条件表达式判断,如果条件成立,继续执行循环体...
...
条件表达式不成立,语句结束
开发中,do-while循环语句使用不多,jdk---提供的源码会涉及的
它和for,while循环语句最大的区别:
当条件不成立的时候,循环体语句至少执行一次!
开发中:优先使用for,然后在while(不明确循环次数)
class DoWhileDemo{
public static void main(String[] args){
//在dos控制台输出5次"helloworld"
int x = 6 ;
do{
System.out.println("helloworld") ;
x ++ ;
}while(x<=5) ;
}
}