1.三元运算符

一般条件判断 ? 结果1:结果2 (结果必须是数据,任意数据类型)
<1>.如果条件判断为true  最终返回结果1  
<2>.如果条件判断为false 最终返回结果2
int javaScore=90;
int sqlScore=87; 
int res1=javaScore>sqlScore?javaScore-sqlScore:sqlScore-javaScore;

对比if分支结构
int res2=0;
if(javaScore>sqlScore){
    res2=javaScore-sqlScore;
}else{
    res2=sqlScore-javaScore;
}
对比之下 三元运算符更为简洁

总结一下:
1.能够用三元运算符解决的问题一定可以if分支结构解决

2.能够用if分支结构解决的问题不一定能够用三元运算符解决
3元运算符是一个运算符号,必须要有返回值,对于打印输出内容的情况下不能使用三元运算符
比如 int age=20; 判断是否成年
if(age>=18){
	System.out.println("成年");
}else{
	System.out.println("未成年");
}
绝对不能
<1>.定义3个整数变量num1,num2,num3,找到其中的最大值和最小值?
可以选择用if 也可以选择用3元运算符,或者2个都用。

2.Scanner

Scanner:获取键盘输入的一个工具类(开发人员帮我们写了的一个工具类,里面写了很多工具方法)
//1.先定义Scanner类型的变量 
(可以得到一个Scanner类型的变量,这个变量就是sc,通过sc就可以使用开发人员帮我们写好的一些工具方法)
Scanner sc=new Scanner(System.in);
//2.提醒用户输入什么类型的数据(比如,请用户输入用户名,请用户输入密码)  提示性的信息
System.out.println("请输入一个整数:");
//3.获取键盘输入的整数,并且将获取到的整数保存到自己定义的变量中
int num1=sc.nextInt();
//4.获取键盘输入的小数,并且定义小数类型变量保存
double num2=sc.nextDouble();
//其他基本数据类型 next类型名字  nextByte() nextBoolean().....

//5.获取键盘输入的字符串,并且定义字符串类型的变量保存
String str1=sc.next();//遇到空格和回车自动结束
注意:无法获取键盘输入的字符类型 nextChar()没有这个功能方法?
扩展:
1.sc.nextLine();//遇到回车才会自动结束
2.如何获取控制台输入的字符类型?
将字符串中的第一个符号转成字符l类型:
"china" ==>'c'
"c"===>'c'
String str="china";
char c1=str.charAt(0);//'c'
char c2=str.charAt(1);//'h'
.....
str.length();//返回字符串的长度(长度:字符由多少个符号组成)    
--------------------------------------------------------------------------------------
hashNextInt():判断控制台输入的是否是一个整数(如果是整数返回true 不是整数返回false)
hashNextDouble():判断控制台输入的是否是一个小数(输入的是小数返回true,不是小数返回false)    
其他类型同理.....    
   
1.控制台输入单个字母  如果是小写字母 要求转成大写字母输出,如果是大写字母要求转成小写字母输出

3.switch-case(了解一下)

注意:
	switch-case能够做的,使用多重if选择结构一定能够完成,但是多重if选择结构能够做的,switch-case不一定可以实现。
switch-case:针对等值判断进行进行多分支选择结构。(多分段,等值)
对比
多重if选择结构:多分支选择结构(多分支...)

具体语法结构:
switch(变量){
     case 常量1:{
         //代码块1
     }break;  
    case 常量2:{
        //代码块2
    } break;
    case 常量3:{
        //代码块3
    }break;    
    default:{
        //代码块4
    }   
}
System.out.println("程序结束");
变量的数据类型:byte,short,int,char, jdk7之后 又支持了String类型

<1>.当变量的值等于常量值1  执行代码块1  遇到break就会直接跳出switch语句块  程序结束
<2>.当变量的值不等于常量1  但是等于常量2  执行代码块2  遇到后面break 跳出语句块 程序结束
<3>.当变量的值不等于常量1,常量2 但是等于常量3  执行代码块3 遇到后面break 跳出语句块 程序结束
<4>.当变量的值不等于常量1,2,3 执行代码块4  程序结束。

<1>.控制台输入A,B,C,D等级  打印出对应的评价(A优秀,B良好,C.及格,D 不及格)

<2>.ATM后台选择功能
***************************
1.存钱
2.取钱
3.转账
4.退出系统
****************************
请输入1-4:
1
您当前正在执行存钱的操作....
2
您当前正在执行取钱的操作....    
3
您当前正在执行转账的操作....     
4   
欢迎下次光临    
补充判断2个字符串是否相等
String str1="123";
String str2="123";
str1.eqauls(str2):判断2个字符串内容是否相等,相等返回true 不相等 返回false
------------------------------------------------------------------------
<3>.控制台输入一个年份,输入一个月份,要求输出当月总共有多少天?
    1,3,5,7,8,10,12  (31天)
    4,6,9,11(30天)
    2月(闰年29天 平年 28天)
 --------------------------------------------------------------
 int month=sc.nextInt();
		int days=0;
		switch(month) {
			case 4:
			case 6:
			case 9:
			case 11:{
				days=30;
			}break;
			case 2:{
				//根据年份判断是否是闰年  闰年29天 平年 28天
				if((year%4==0&&year%100!=0)||(year%400==0)) {
					days=29;
				}else {
					days=28;
				}
			}break;
			default:{
				days=31;
			}
		}
		System.out.println(year+"年"+month+"月总共有"+days+"天");

4.for循环(重点)

什么是循环?
1.学编程--->赚钱---->娶老婆---->生孩子
学编程---->赚钱---->娶老婆----生孩子
.....
-------------------------------------------------
项目中循环?
用户填写注册信息的时候
1.填写信息---->验证用户填写的信息---->验证不通过--->提醒用户重新输入,并且告诉他该怎么填写
--->填写信息-->...... (无法预测到底什么时候能够填写正确...)
2........
----------------------------------------------------------------------------
循环:重复做某件事情,应用到程序中重复执行某个代码块。。。
for循环的基本结构:
for(表达式1;表达式2;表达式3){
	//代码块1(重复要执行的任务)
}
表达式1:一般用于做初始化一些数据
表达式2:用于判断能够进入循环(返回值是boolean  如果返回值是true 进入循环,如果返回值是false终止序循环)
表达式3:一般用于改变循环条件的(为了防止循环陷入死循环)
代码块1: 重复要做的事情
-----------------------------------------------------
for循环的执行流程
表达式1--->
表达式2(true)--->代码块1--->表达式3  1
表达式2 (true)--->代码块1---->表达式3  2
表达式2 (true)--->代码块1---->表达式3  3
....
表达式2 (false) 循环结束....
<1>.要求在控制台打印,100遍 我错了...    
表达式1: int i=1;
表达式2: i<=100   1-100 都是true (101 false)
表达式3: i++;//每循环一次次数累加1
<2>.计算1+2+3+...+100 之和
int sum=0;
i=1  sum+=1;   sum=1
i=2  sum+=2    sum=1+2    
i=3  sum+=3    sum=1+2+3
.....
i=99  sum+=99  sum=1+2+3+....+99;    
i=100 sum+=100 sum=1+2+3+...+99+100;
	  
	  sum+=i;//重复要做的事情
---------------------------------------------
int sum=0;
for(int i=1;i<=100;i++) {
	sum+=i;
}
System.out.println("1-100之和为:"+sum);		
-----------------------------------------------------------------------------------
<3>.计算1-100之间所有的奇数之和
<4>.计算1-100之间所有的偶数之和
<5>.计算1-100之间个位数为3的所有数之和
--------------------------------------------------------------------------------------
<6>.有5个人做到一起,小明问第五个人多大了,比第四个人大2岁,第四个人比第三个人大2岁,
第三个人比第二个人大2岁,第二个人比第一个人大2岁,第一个人说我5岁了,请问第五个人多大了?
------------------------------------------------------------------------------------    
<7>.一小球从100米的高处落下,每一次反弹的高度为上一次的一半,问小球第10次落地经历的路程为多少?以及下一次反弹的高度是多少?
<8>.现有50瓶饮料,3个空瓶子可以换一瓶饮料,问最终能够喝到多少瓶饮料,如果喝到最后,2个空瓶,可以借一瓶?
75?
总结:对于循环次数固定的使用for循环更加简洁.

5.while 循环(重点)

for(表达式1;表达式2;表达式3){
	//代码块1(重复要执行的任务)
}
对比
while循环结构

表达式1:一般用于做初始化一些数据
//用于判断能够进入循环(返回值是boolean  如果返回值是true 进入循环,如果返回值是false终止序循环)
while(表达式2){
	//代码块1(重复要做的事情)
	表达式3 :一般用于改变循环条件的(为了防止循环陷入死循环)
}
表达式1--->
表达式2(true)--->代码块1--->表达式3  1
表达式2 (true)--->代码块1---->表达式3  2
表达式2 (true)--->代码块1---->表达式3  3
<1>.要求在控制台打印,100遍 我错了...  
<2>.计算1+2+3+...+100 之和 
<3>.计算1-100之间所有的奇数之和
<4>.计算1-100之间所有的偶数之和
<5>.计算1-100之间个位数为3的所有数之和   
-----------------------------------------------------------------------------
<6>.蜗牛学院现有5000名学员,每年增长10%,预计何时人数能够达到10000人?
    
总结: 对于循环次数不固定的情况下使用while循环会更加的方便

6.do-while循环(非重点)

基本结构
for(表达式1;表达式2;表达式3){
	//代码块1(重复要执行的任务)
}
对比

表达式1:初始数据
do{
	//代码块1  (重复要做的事情)
	//表达式3 (改变循环条件,防止陷入死循环)
}while(表达式2); //控制能否进入循环(boolean数据  true 进入循环  false 不能进入循环)

表达式1===>
代码1===>表达式3  
表达式2(true)==>代码1===>表达式3  
表达式2(true)==>代码1===>表达式3  
表达式2(true)==>代码1===>表达式3  
表达式2(false)
--------------------------------------------------------------------------------------   
 <1>.1+2+...100?
 <2>.1-100之间的奇数之和以及偶数之和?
 ------------------------------------------------------------------------------
 <3>.要求控制台输入(y/n),如果输入的是n 提示 上下练习编码,下午参与考核,在进行测评
 控制台输入(y/n)  如果输入的n  提示上下练习编码,下午参与考核,在进行测评
 控制台输入(y/n)  如果输入的n ................................
    
    y 循环结束
 建议:先使用while循环  然后再使用di-while

6.1 循环总结

1.循环次数固定使用 for循环

2.循环次数不固定使用while,do-while

3.while循环先判断后执行,有可能一次都不执行

4.do-while 先执行一次,然后再判断,至少执行一次

5.常用的循环为for循环以及while循环

6.2 死循环

1.一般使用死循环的应用,都是使用while实现
while(条件判断){ 条件判断永久为true (真)

}
while(1==1){
	
}
while(true){
	
}
注意:虽然for循环也可以实现死循环

7.退出循环

for(int i=1;i<=5;i++){
	System.out.println(i);
}
1
2
3
4
5
continue:结束本次循环,立即进入下一次循环
for(int i=1;i<=5;i++){
	if(i==3){
		continue;
	}
	System.out.println(i);
}
1
2
4
5
break:跳出当前所在的循环 (正常循环还是死循环都可以直接跳出)
for(int i=1;i<=5;i++){
	if(i==3){
		break;
	}
	System.out.println(i);
}
1
2
-------------------------------------------------------------------
<1>.比如输一个整数,如果输入的是一些非数值,提示其输入不合法,然后重新输入。。。
	Scanner sc=new Scanner(System.in);
		int num=0;
		while(true) {//你输入的是整数才会跳出来...
			System.out.println("请输入一个整数:");
			if(sc.hasNextInt()) {//判断输入的是否是整数,是整数返回true,否则返回false
				num=sc.nextInt();//是整数才有接受的必要,才不会报错
				break;
			}else {
				System.out.println("您输入的格式不正确...");
				sc.nextLine();//跳过异常 ,可以重新输入
			}
		}
		System.out.println("控制台输入的整数为:"+num);
		sc.close();
<2>.控制台输入年龄,要求年龄为0-100之间的整数,符合要求最终控制台打印...(优化)
    
<3>.控制台输入性别 ,性别只能是男或者女,输入其他的一律要求重新输入....(优化)
<4>.控制台输入年份(1900-2021),月份(1-12) ,判断当月的最大天数?(优化)    
---------------------------------------------------------------------------
<5>注册个人信息,用户名 (长度3-5位组成),密码(6位组成),年龄(18-80岁之间,薪资(3000-30000)注册完成要求在控制台打印注册完成的个人信息;(优化)
String userName=null;.length()
String userPass=null; length()
int age=0; 
double salary=0; hasNextDouble()
----------------------------------------------------------------------------
<6>.登录的优化,已知一个可用账号userName="admin",userPass="123456",完成登录;
要求:1.只能用户名或者密码写错了,只有3次机会登录
---------------------------------------------------
请输入用户名:admin
请输入密码:123
用户名或者密码错误,你还有2次登录机会...
.....
3次机会用完,直接退出程序(退出循环)...    
------------------------------------------------------------
分析:1.在3次机会以内输入正确,循环终止,提示恭喜您登录成功...
     2.3次机会内都输入错误,循环终止,账号已经锁定...  
    
补充关于随机数:
Math.random():[0,1)之间的随机小数
||
产生[0,100)之间的小数?
Math.random()*100 [0,100) 之间的小数
||
产生[0,100)之间的整数?(int)(Math.ramdom()*100)
------------------------------------------------------------------
<1>.能够得到任意区间的随机整数?[a,b)
公式:(int)(Math.random()*(b-a))+a;                   
举例子测试说明:
[100,1000) : (int)(Math.random()*900)+100;
[-15,23):(int)(Math.random()*38)-15; 
循环产生100个随机4位数?打印在控制台? 
(int)(Math.random()*9000)+1000;
 
 
 回顾字符串方法:
 length():字符串的长度
 charAt(index):根据下标从字符串中找到对应的符号
 String str="china";
 str.length():5
 str.charAt(0)='c';
 str.chatAt(1)='h';...
 [0,str.length())
  int rIndex=(int)(Math.random()*5);
 str.charAt(rIndex);//随机从字符串中返回对应的符号 
  
 7. 随机验证码
 String codeStr="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
		String str="";
		//[0,codeStr.length());
		for(int i=1;i<=4;i++) {
			//1.得到随机的下标
			int rIndex=(int)(Math.random()*codeStr.length());
			//2.根据下标得到对应字符
			char c=codeStr.charAt(rIndex);
			str+=c;
		}
		System.out.println("随机验证码为:"+str);

8.嵌套循环

嵌套循环:就是将一个循环当做另一个循环的循环体。(双重循环)
比如:
for(....){
    while(){
        
    }
}
或者
while(..){
    for(...){
        
    }
}
或者
for(...){
	while(...){}
	for(...){}
}
总结:循环特点:如果满足条件判断,执行一次循环体
对于双重循环:外层循环循环一次,内存循环完整的循环一遍。。。
--------------------------------------------------------------------
三层循环:就是将一个双重循环当做另一个循环的循环体。。。

<1>.查看如下代码,统计循环的总次数
for(int i=1;i<=10;i++){
	for(int j=1;j<=20;j++){
		....
	}
}
总共循环了多少次:
i=1          i=2
内层循环20次  内层循环20次   ...
    10*20次
    
<2>.查看如下代码,统计循环的总次数
 for(int i=1;i<=10;i++){
	for(int j=1;j<=20;j++){
		for(int k=1;k<=30;k++){
		
		}
	}
}   
10*20*30;
1.打印九九乘法表
1 1x1=1
2 1x2=2  2x2=4    
3 1x3=3  2x3=6  3x3=9
....

提示:    
<1>.外层循环决定行数  9行 循环9次
<2>.内层循环决定对应行的列数  是第几行就有几列  有几列内层循环就循环几次

2.有3个班级各4名学员参赛,计算每个班级参赛学员平均分,统计成绩大于85分学员数?
<1>.外层循环决定班级? 3
<2>.内层循环决定对应班级的第几个学生? 4
3.有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?