day04-Java学习
1)switch语句的使用:
/*
键盘录入有三种:
1.早期的 main方法中的参数: String[] args 弊端:只能接收字符串数据
2.JDK5以后 Scanner类:键盘录入
3.IO流中: BufferedReader(字符缓冲流) readLine()
使用Scanner类里面的功能:public String nextLine() :可以录入一个字符串数据
*/
练习1:
键盘录入一个字符串数据,判断是哪个字符串?
//导包
import java.util.Scanner;
class SwitchTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收数据
System.out.println("请您输入一个数据:") ;
//String line = sc.nextLine() ;
//int a = sc.nextInt() ;
//java.util.InputMismatchException:运行时期异常 (你录入的数据和接收数据的类型不匹配)
//改进:防止出现异常:
//如果能够提供一个判断功能话:
//Scanner类给开发者提供一些判断功能:boolean hasNextXXX() :判断录入的下一个数据是否是XXX类型
//boolean hasNextInt():判断下一个录入的数据是否是一个int类型
if(sc.hasNextInt()){//true的结果
//如果是int类型,才接收数据!
int a = sc.nextInt() ;
System.out.println(a) ;
}else{
System.out.println("您录入的数据和接收的数据类型不匹配!") ;
}
//输出字符串
//System.out.println(line) ; //"100"
//使用switch语句
/*
switch(line){
case "hello":
System.out.println("您输入的是hello") ;
break ;
case "JavaEE":
System.out.println("您输入的是JavaEE") ;
break ;
case "php":
System.out.println("您输入的是php") ;
break ;
case "python":
System.out.println("您输入的是python") ;
break ;
default:
System.out.println("您输入的字符串不存在...") ;
break ;
}
*/
}
}
练习2:
现在使用switch实现:键盘录入月份的值,判断季节
3,4,5 春季
6,7,8 夏季
9,10,11 秋季
12,1,2 冬季
//导包
import java.util.Scanner;
class SwitchTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您输入一个数据:") ;
int month = sc.nextInt() ;
switch(month){
//直接利用case穿透
case 3:
case 4:
case 5:
System.out.println("春季") ;
break ;
case 6:
case 7:
case 8:
System.out.println("夏季") ;
break ;
case 9:
case 10:
case 11:
System.out.println("秋季") ;
break ;
case 12:
case 1:
case 2:
System.out.println("冬季") ;
break ;
default:
System.out.println("您输入的数据不合法,不存在该月份!") ;
break ;
}
}
}
2)for循环语句
循环语句的格式:
for循环
while循环
do-while循环
for循环的格式
for(初始化语句;条件表达式;步长语句(控制体语句)){
循环体语句;
}
执行流程:
1)进入for循环,给变量进行初始化,执行初始化语句
2)判断条件表达式是否满足条件 (true的结果),然后执行循环体语句
3)执行循环体完毕之后,执行步长语句(对变量进行操作:++/–)
4)继续判断条件表达式是否成立,如果成立,再次执行循环体语句----->再次执行步长语句
…
…
…
5)当前条件表达式不成立,for语句结束!
练习1:
控制台输出所有的"水仙花数";
什么是水仙花数:水仙花数指的是三位数---->范围:使用for循环 100 到1000之间(不包含)
水仙花数的特点:
三位数的每个位上的数据的立方之和是这个数据本身!
举例:
153 = 1*1*1 +5*5*5 + 3*3*3
关键:如何确定每个位上的数据:
定义三个变量,分别获取每个位上的数据
int ge = 该数据本身 % 10 ; %:模 (求余数)
int shi = 该数据本身 /10 % 10; //153 ---十位的数据:5
int bai = 该数据本身/10 /10 %10 ;
确定了每个位上的数据了,只要满足条件: 该数据本身 == ge*ge*ge+shi*shi*shi +bai*bai*bai
输出这个数据---"水仙花数"
class Flower{
public static void main(String[] args){
int a;
int b;
int c ;
for(int i = 100; i < 1000; i++){
a = i / 100 % 10;
b = i / 10 % 10;
c = i % 10;
if(a*a*a + b*b*b + c*c*c == i){
System.out.println(i);
}
}
}
}
练习2:
问题:统计所有的水仙花数有多少个?
分析:
统计思想:
1)定义一个统计变量: 默认值从0开始 count
2)获取水仙花数据
三位数,告诉我们一个范围100-999
3)确定每个位上的数据
int ge = 该数据本身 %10 ;
int shi = 该数据本身 /10 %10;
int bai = 该数据本身/10 /10 %10 ;
4)满足条件:该数据==gegege+shishishi+baibaibai
统计变量++
5)输出统计变量
class Flowers{
public static void main(String[] args){
//定义一个统计变量,默认值是0
int count = 0 ;
//获取水仙花数
for(int x = 100 ; x < 1000 ;x ++){
//每个位上的数据
int ge = x % 10 ;
int shi = x /10 % 10 ;
int bai = x /10 /10 % 10;
//满足条件
if(x==(ge*ge*ge+shi*shi*shi+bai*bai*bai )){
//统计变量++
count ++ ;
//显示一下数据
System.out.println(x) ;
}
}
//输出统计变量
System.out.println("水仙花数共有"+count+"个") ;
}
}
练习3:
使用for循环
问题:
1-100之间的和
1-100之间的偶数和
求5的阶乘!
举例:
n! = n * (n-1)!
n! = n* (n-1) * (n-2)*…;
class ForTest{
public static void main(String[] args){
//1-100之间的和
//定义一个结果变量sum
int sum = 0 ;
for(int x = 1 ; x <= 100; x ++){
sum += x ;
}
System.out.println("sum:"+sum) ;
System.out.println("----------------------") ;
//1-100之间的偶数和
//定义一个结果变量
int sum2 = 0 ;
for(int x = 1 ; x <= 100 ; x ++){
//判断是否是偶数
if(x % 2 == 0){
sum2 += x ;
}
}
System.out.println("sum2:"+sum2) ;
System.out.println("----------------------") ;
//方式2
int sum3 = 0 ;
for(int x = 0 ; x <= 100 ; x+=2) { //x=0,0<=100 ; ---> 0+2 =2
sum3 += x ;
}
System.out.println("sum3:"+sum3) ;
System.out.println("----------------------") ;
//求5的阶乘! 求阶乘思想跟求和思想一致
//5!= 5 * 4!
// = 5 * 4 * 3 * 2 * 1
//定义最终结果变量
int jc = 1 ;
for(int x = 2 ; x <= 5 ; x ++ ){
jc *= x ; //jc = jc * x ; //x =1 -- 1*1 =1 ;
}
System.out.println("jc:"+jc) ;
}
}
3)while循环语句
while循环
基本格式
while(条件表达式){
循环体语句;
步进语句;
}
扩展格式:(使用居多)
初始化语句 ;
while(条件表达式){
循环体语句;
步进语句;
}
执行流程:
1)先执行初始化语句,该变量进行初始化
2)判断条件表达式是否成立,如果成立,先执行循环体语句,----->执行步进语句
3)继续判断条件是否成立,如果还成立,继续在执行循环体语句----->执行步进语句
…
…
最终,条件表达式不成立,while循环结束!
初始化语句 ;
while(条件表达式){
循环体语句;
步长语句;
}
使用while循环
需求:1-100之间的和/偶数和
需求:输出所有的水仙花数
需求:统计所有的水仙花数有多少个
*/
class WhileDemo2{
public static void main(String[] args){
//需求:1-100之间的和
//最终结果变量
int sum = 0 ;
int i = 1 ;
while(i<=100){
sum += i ;
i++;
}
System.out.println("1-100之间的和是:"+sum) ;
System.out.println("---------------------") ;
//1-100之间的偶数和
int sum2 = 0;
int j = 1 ;
while(j<=100){
//判断
if(j % 2 ==0 ){
sum2 += j ;
}
j ++ ;
}
System.out.println("1-100之间的偶数和是:"+sum2) ;
System.out.println("---------------------") ;
//需求:输出所有的水仙花数
//初始化语句
int x = 100 ;
while(x<1000){
//获取每个位上到数据
int ge = x % 10 ;
int shi = x /10 % 10 ;
int bai = x /10 /10 % 10 ;
//满足的条件
if(x == (ge*ge*ge + shi*shi*shi+bai*bai*bai)){
System.out.println(x) ;
}
//x++ 步长语句
x ++ ;
}
System.out.println("---------------------") ;
//统计水仙花数
//定义统计变量
int count = 0 ;
int n = 100 ;
while(n < 1000){
//获取每个位上到数据
int ge = n % 10 ;
int shi = n /10 % 10 ;
int bai = n /10 /10 % 10 ;
//满足的条件
if(n == (ge*ge*ge + shi*shi*shi+bai*bai*bai)){
count ++ ;
}
n ++ ;
}
System.out.println("水仙花数共有:"+count+"个");
}
}
重点:
while循环和for循环的区别?
1)两种循环格式不一样
while循环---->
从内存角度考虑,while循环结束了,依然可以访问循环中的变量(消耗内存空间)
for循环----->
从内存角度考虑,for循环结束了,不能访问变量(变量生命周期随着for循环的结束而结束),比较省内存空间
2)从应用场景来说:
一般情况:如果明确循环次数或者明确循环的范围,优先考虑使用for循环
举例:给3次机会,模拟用户登录.. 可以使用for循环
如果不明确循环次数或者不明确的范围,使用while循环操作
举例:
猜数字游戏,(产生的随机和用户录入的数据进行比较)
---->这种情况:使用while循环操作
for和while都存在死循环,如果控制不好步长语句的话,就造成死循环!
对于死循环,要灵活运用死循环,达到某种条件的时候,结束掉死循环!
class WhileTest{
public static void main(String[] args){
//for循环的死循环
/*
for(;;){
//满足什么条件,结束(根据实际的业务需求)
System.out.println("很高兴,学习了死循环...") ;
}
*/
//使用while(true)
while(true){ //永远成立
System.out.println("很高兴,学习了死循环...") ;
}
}
}
练习1:
//猜数字小游戏
//java.lang.Math类:数学运算的类
//方法:获取随机数的方法:public static double random() 取值范围:[0.0,1.0)
键盘录入一个数据:整数类型(int) 和随机数据比较,
如果大了,提示"您录入的数据大了"
如果小了,提示"您录入的数据小了"
相等,提示"恭喜您,猜中了"
附加条件:统计 多少次猜中了
import java.util.Scanner;
class WhileTest{
public static void main(String[] args){
//获取一个随机数
//double d = Math.random() ;
//System.out.println(d) ;
//想求出:1-100之间的随机数
int number = (int)(Math.random()*100+1); //double
//System.out.println(number) ;
while(true){ //不知道录入多少次,使用while死循环
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您输入一个数据:");
int guessNum = sc.nextInt() ;
//选择结构语句
if(guessNum > number){
System.out.println("您录入的数据大了...") ;
}else if(guessNum < number){
System.out.println("您录入的数据小了...") ;
}else{
System.out.println("恭喜您,猜中了...") ;
break ; //结束循环! (中断,结束)
}
}
}
}