大家国庆过得怎样?
1 switch结构
1.1 switch的格式
switch(表达式){
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default
语句体n+1;
break;
}
执行流程:
1、先计算括号中表达式的值。
2、将结果依次和case后面的值比较,匹配上的就执行case对应的语句体,遇到break就结束switch结构。
3、当所有的case值都不匹配时,执行default后面的语句体n+1, default中省略break,效果一样。
案例代码:
/*
* 需求:根据键盘录入的1-7,输出对应的星期一到星期日
*/
// 导包
import java.util.Scanner;
public class SwitchDemo {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 提示用户输入
System.out.println("请输入一个数字:");
// 接收用户输入
int week = sc.nextInt();
// 使用switch结构实现判断
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;
}
}
}
1.2 switch的注意事项
- switch的小括号中表达式的值只能是byte short char int , 枚举, 字符串。
- case 后面的值不能重复,不能是变量,只能是常量。
- break用于结束switch语句 ,break可以省略,省略后会有case穿透现象。
1.3 case穿透案例
/*
春夏秋冬
需求:
一年有12个月,分属于春夏秋冬4个季节,键盘录入一个月份,
请用程序实现判断该月份属于哪个季节,并输出。
春:3、4、5
夏:6、7、8
秋:9、10、11
冬:12、1、2
*/
import java.util.Scanner;
public class SwitchDemo {
public static void main(String[] args) {
//键盘录入月份数据,使用变量接收
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个月份:");
int month = sc.nextInt();
//case穿透
switch(month) {
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("你输入的月份有误");
}
}
}
练习:
//键盘输入数字1~5,控制台输出工作日,输入6,7时,输出休息日。
/*
分析:
1、导包并创建Scanner对象。
2、提示用户输入数字
3、使用nextInt()方法获取键盘录入的整数
4、使用switch结构判断数字的值,输出对应的内容。
*/
//导包
import java.util.Scanner;
public class SwitchDemo{
public static void main(String[] args){
// 1、创建Scanner对象。
Scanner sc = new Scanner(System.in);
// 2、提示用户输入数字
System.out.println("请输入一个整数(1~7):");
// 3、使用nextInt()方法获取键盘录入的整数
int week = sc.nextInt();
// 4、使用switch结构判断数字的值,输出对应的内容。
// 利用case穿透现象优化代码
switch(week){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("您输入的数字有误!");
break;
}
}
}
【练习题1】以下程序的打印结果是什么?
int x = 2;
int y = 3;
switch(x){
case 2:
y++; //y=4
case 3:
y++; //y=5
default:
y++; //y=6
}
System.out.println(y); //6
2 循环结构
循环语句可以在满足循环条件的情况下,反复执行某一段代码。
循环结构组成:初始化语句,条件判断语句,循环体语句,条件控制语句。
初始化语句:对循环条件进行初始化。
条件判断语句:判断循环是否执行。
循环体语句:反复执行的代码。
条件控制语句:修改循环条件的值。
2.1 for循环
for循环格式
for (初始化语句; 条件判断语句; 条件控制语句) {
循环体语句;
}
//案例:for循环打印5次HelloWorld
for(int i=1; i<=5; i++){
System.out.println("HelloWorld");
}
执行流程
1、执行初始化语句:int i = 1(只会执行一次)。
2、执行条件判断语句 i<=5,如果为true,执行循环体语句,如果为false,则结束循环。
3、执行循环体语句 : System.out.println("HelloWorld");
4、执行条件控制语句 :i++
5、回到第2步继续往下执行。
for循环输出数据
/*
需求:
使用for循环输出1~5
使用for循环输出5~1
*/
public class ForDemo{
public static void main(String[] args){
//1~5
for(int i=1; i<=5; i++){
System.out.println(i);
}
System.out.println("-------------");
//5~1
for(int i=5; i>=1; i--){
System.out.println(i);
}
}
}
for循环求和
/*
需求:
使用for循环求1~5之间的整数和,并在控制台输出。
*/
public class ForDemo2{
public static void main(String[] args){
//定义变量,存放求和结果
int sum = 0;
for(int i=1; i<=5; i++){
//累加变量不能定义在循环里面
//int sum= 0;
sum+=i;
}
//循环结束,打印求和结果
System.out.println(sum);
}
}
for循环求偶数和
/*
需求:
使用for循环求出1~100之间的偶数和,并在控制台输出结果。
步骤:
1. 使用for循环获得1~100之间的每一个整数
2. 在循环体中使用if判断并得到每一个偶数 (如果 a%2==0, a就是偶数)
3. 对得到的偶数进行累加求和。
4. 循环结束, 输出结果。
*/
public class ForDemo3{
public static void main(String[] args){
// 定义求和变量
int sum = 0;
// 循环累计求和
for(int i=1; i<=100; i++){
//对偶数累计求和
if( i%2==0 ){
sum+=i;
}
}
//输出结果
System.out.println("1~100的偶数和为:"+sum);
}
}
//实现方式2
public class ForDemo3{
public static void main(String[] args){
// 定义求和变量
int sum = 0;
// 循环累计求和
for(int i=2; i<=100; i+=2){
sum+=i;
}
//输出结果
System.out.println("1~100的偶数和为:"+sum);
}
}
for循环求水仙花数
1、什么是水仙花数?100~999
水仙花数指的是一个三位数,其个位、十位、百位的数字立方和等于该数本身。
例如:153 = 1*1*1 + 5*5*5 + 3*3*3 =1 + 125 +27
2、如何获取每一位的数?
例如153
个位:153%10 = 3
十位:153/10%10 = 15%10 = 5
百位:153/100%10 = 1
规律: 求一个数n位上的数值,将该数除以n变成个位,再对10取余即可。
/*
需求:
控制台打印水仙花数
步骤:
1 for循环获取所有三位数
2 得到每个三位数的个,十,百位上的数字
3 判断是否是水仙花数
4 打印水仙花数
*/
public class ForDemo4 {
public static void main(String[] args) {
//定义统计变量,存储水仙花数的个数
int count = 0;
// 1. for循环获取所有三位数
for(int i=100; i<1000; i++) {
// 2. 得到每个三位数的个,十,百位上的数字
int ge = i%10;
int shi = i/10%10;
int bai = i/100;
// 3. 判断是否是水仙花数 : 个, 十, 百位立方和等于该三位数本身
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
//4. 打印水仙花数
System.out.println(i);
count++;
}
}
//循环结束,输出count的值
System.out.println(count);
}
}
for循环统计水仙花数
/*
需求:
使用for循环统计水仙花数的个数
*/
public class ForDemo5 {
public static void main(String[] args) {
//定义统计变量
int count = 0;
// 1. for循环获取所有三位数
for(int i=100; i<1000; i++) {
// 2. 得到每个三位数的个,十,百位上的数字
int ge = i%10;
int shi = i/10%10;
int bai = i/100;
// 3. 判断是否是水仙花数 : 个, 十, 百位立方和等于该三位数本身
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
//4. 统计个数
count++;
}
}
// 5. 循环结束打印个数
System.out.println(count);
}
}
【单选】下面哪一个写法会导致死循环?( )
A:for(int k=0; k<0; k++)
B:for(int k=10; k>0; k--)
c:for(int k=0; k<10; k--)
D:for(int k=0; k>0; k++)
2.2 while循环
while循环格式
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}
//案例:while循环打印5次HelloWorld
int i=1;
while( i<=5 ){
System.out.println("HelloWorld");
i++;
}
执行流程图
while循环求偶数个数
/*
需求:
使用for循环求1~100的偶数个数
使用while循环求1~100的偶数个数
*/
public class WhileDemo{
public static void main(String[] args){
//使用for循环求1~100的偶数个数
/*
int count = 0;
for(int i = 1; i<=100; i++){
//筛选偶数
if(i%2==0){
count++;
}
}
System.out.println("1-100的偶数个数为:"+count);
*/
//使用while循环求1~100的偶数个数
//定义一个统计变量
int count = 0;
int i = 1;
while(i<=100){
if(i%2==0){
count++;
}
i++;
}
System.out.println("1-100的偶数个数为:"+count);
}
}
珠穆朗玛峰
/*
需求:
使用while循环计算出0.1毫米的纸,折多少次可以折成珠穆朗玛峰的高度(8844.43米)8844430mm
分析:
第一次对折 0.1*2 = 0.2
第二次对折 0.2*2 = 0.4
第三次对折 0.4*2 = 0.8
以此类推,发现每次对折后的纸张厚度是原先的2倍
需要折叠多次,但具体次数又不知道,所以可以使用while循环。
使用计数器累计折叠的次数,每对折一次,计数器加1
循环什么时候结束?
当对折的厚度大于等于珠峰高度8844430毫米的时候,结束循环。
也就是说,当纸张厚度小于珠峰高度时,循环要继续执行。
*/
public class WhileTest{
public static void main(String[] args){
//初始化纸张厚度
double paper = 0.1;
//定义统计变量,记录对折次数
int count = 0;
//当纸张厚度小于珠峰高度时,循环要继续执行
while(paper<8844430){
//在循环体中,对纸张进行对折
paper*=2;
//每对折一次,统计变量加1
count++;
}
//循环结束,输出结果
System.out.println("折叠次数:"+count);
}
}
2.3 do-while循环(了解)
do-while循环格式
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
//使用do-while循环在控制台打印5次HelloWorld
int i = 1;
do{
System.out.println("HelloWorld");
i++;
}while(i<=5);
执行流程
1、执行初始化语句。(只执行一次)
2、执行循环体语句。
3、执行条件控制语句。
4、执行条件判断语句,如果为false则结束循环,如果为true则回到第2步继续执行。
注意:do-while循环至少会执行一次循环体语句。
2.4 三种循环的区别(了解)
for | while | do-while | |
---|---|---|---|
特点 | 先判断,再执行 | 先判断,再执行 | 先执行,后判断(至少执行一次) |
初始化变量 | for循环外无法使用初始化变量 | 循环结束后,初始化变量能继续使用 | 循环结束后,初始化变量能继续使用 |
适用场景 | 循环次数确定的情况 | 需要用到死循环或者循环次数不确定的情况 | 循环至少需要执行一次 |
依次推荐使用:for循环 、while循环 、do-while循环
简单的说,只有一个区别,即for循环和while循环先判断后执行,do -while循环先执行后判断。
三种循环的死循环简单写法:
//1、for循环
for(;;){}
//2、while循环
while(true){
}
//3、do-while循环
do{
}while(true);
2.5 跳转控制语句
break关键字
break使用场景:
1、在switch中,用于结束switch结构。
2、在循环中,用于结束break所在循环。
3、可以为循环加上标签,让break结束指定循环。(了解)
注意:
break语句后面不能直接跟其他语句,否则会编译报错。
continue关键字
continue使用场景:
1. continue只能在循环中使用,用于跳过一次循环,开始下一次循环。
2. 可以为循环加上标签,continue跳到指定循环继续执行。(了解)
注意:
continue后面不能直接跟其他语句,否则会编译报错。
continue是再来一次,break是循环结束。
//break和continue案例
public class ControlDemo{
public static void main(String[] args){
for(int i=1; i<=5; i++){
if( i%2==0 ){
continue; //遇到continue开始下次循环
//break; //遇到break结束整个循环
}
System.out.println(i);
}
}
}
continue练习
/*
需求:打印1~10之间的整数,遇到3的倍数时跳过不打印。
*/
public class ContinueDemo{
public static void main(String[] args){
//使用for循环获取1-10
//循环内判断3的倍数时,使用continue跳过本次打印,不是3的倍数直接打印
}
}
break练习
/*
模拟一个用户管理系统
控制台显示一个操作菜单:
输入数字选择您要的操作:
1.添加用户 2.修改用户 3.删除用户 4.查看总用户数 5.退出系统
键盘输入对应的编号进行操作,当输入5时退出系统。
*/
import java.util.Scanner;
public class BreakDemo{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//死循环
xh:while(true){
System.out.println("输入数字选择您要的操作:");
System.out.println("1.新增用户 2.修改用户 3.删除用户 4.查看总用户数 5.退出系统");
int num = sc.nextInt();
switch(num){
case 1:
System.out.println("新增成功");
break;
case 2:
System.out.println("修改成功");
break;
case 3:
System.out.println("删除成功");
break;
case 4:
System.out.println("当前用户数1000");
break;
case 5:
System.out.println("欢迎使用本软件");
//结束指定循环xh
break xh;
default:
System.out.println("您的输入有误,请重新输入!");
}
}
}
}
2.6 循环嵌套
循环嵌套的执行步骤:
外循环执行一次,内循环执行一个循环周期。
整个循环次数:外循环 乘以 内循环
课堂案例:
/*
需求:
在控制台输出一天的小时和分钟
分钟和小时的范围:
分钟:0 <= minute < 60
小时:0 <= hour < 24
*/
public class ForForDemo {
public static void main(String[] args) {
//外循环控制小时的范围
for(int hour=0; hour<24; hour++) {
//内循环控制分钟的范围
for(int minute=0; minute<60; minute++) {
System.out.println(hour + "时" + minute + "分");
}
System.out.println("--------");
}
}
}
/*
嵌套练习:使用嵌套for循环打印3行4列的*型
****
****
****
*/
public class ManyLoop1{
public static void main(String[] args){
/*
System.out.println("****");
System.out.println("****");
System.out.println("****");
*/
//使用循环打印****
/*
不换行打印 System.out.print(需要打印的内容);
*/
for(int hang =1; hang<=3; hang++){
for(int lie=1; lie<=4; lie++){
System.out.print("*"); //*****
}
//换行
System.out.println();
}
}
}
3 Random
Random类的作用
Random是JDK中提供的工具类,位于【 java.util 】包下,用于产生随机数。
Random类的使用步骤
1.导包
import java.util.Random;
2.创建对象
Random r = new Random();
3.产生随机数
int num = r.nextInt(100);
说明:
nextInt( 数值 ):代表随机生成并返回一个整数,如果括号数值为10,表示生成0-9的整数,数值20,表示生成0-19的整数。
/*
需求:
随机生成一个1~100之间的整数.
*/
//1.导包
import java.util.Random;
public class RandomDemo{
public static void main(String[] args){
//2.创建Random对象
Random r = new Random();
//3.调用方法产生随机数
int num = r.nextInt(100)+1;
System.out.println(num);
}
}
手机验证码
/*
需求:
随机生成一个长度为6,数字为0~9之间的手机验证码,并在控制台打印.
打印后换行:System.out.println();
打印不换行:System.out.print();
*/
public class RandomTest {
public static void main(String[] args) {
//创建对象
Random r = new Random();
for(int i=1; i<=6; i++){
//调用方法,产生0-9的随机数
int num = r.nextInt(10);
System.out.print(num);
}
}
}
猜数字小游戏
需求:
-
随机生成1~100之间的数字,用户来猜这个随机数是多少。
-
当猜的数字比实际数大了,提示"你猜的数字大了"
-
当猜的数字比实际数小了,提示"你猜的数字小了"
-
当猜的数字和实际数相等,提示"恭喜你猜中了"
分析步骤:
1、使用Random随机生成1~100之间的随机数。
2、使用Scanner获取键盘输入的数。
3、比较随机生成的数与键盘输入的数。
4、使用循环控制第2和第3步,直到用户猜对了才结束循环。
代码实现:
import java.util.Random;
import java.util.Scanner;
public class RandomGame {
public static void main(String[] args) {
//1、生成1~100的随机数
Random r = new Random();
int result = r.nextInt(100)+1;
//2、创建键盘录入对象
Scanner sc = new Scanner(System.in);
//使用循环控制
while(true){
//提示用户输入
System.out.println("请输入你要猜的数(1-100之间):");
//获取输入的数
int scNum = sc.nextInt();
//3、比较随机数与输入的数
if(scNum > result){
System.out.println("你猜的数字大了");
}else if(scNum < result){
System.out.println("你猜的数字小了");
}else{
System.out.println("恭喜你猜中了");
//用户猜中后,循环停止,程序结束
break;
}
}
}
}
拓展练习
/*
【扩展练习1】打印如下图案的三角形
*
**
***
****
*****
*/
for(int hang=1; hang<=5; hang++){
for(int lie=1; lie<=hang; lie++){
//不换行打印
System.out.print("*");
}
System.out.println();
}
/*
【扩展练习2】打印九九乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
*/
public class NineLoop{
public static void main(String[] args){
//外层循环控制行
for(int hang=1; hang<=9; hang++){
//内层循环控制列
for(int lie=1; lie<=hang; lie++){
System.out.print( lie+"*"+hang+"="+(lie*hang)+"\t" );
}
System.out.println();
}
}
}
/*
【扩展练习3】输出1~100之间的所有偶数, 每5个换一行
System.out.println(); //输出并换行
System.out.print(); //不换行输出
*/
public class Nice03{
public static void main(String[] args){
int num = 0;
for(int i=1;i<=100;i++){
if(i%2==0){
System.out.print(i+" ");
num += 1;
}
if(num%5==0){
System.out.println();
}
}
}
}
/*
【扩展练习4】随机生成长度为4的网站登录验证码,验证码由随机生成的数字0~9,英文大小写字母组成。
*/
总结
switch结构
格式:
switch(表达式){
case 常量值1:
语句体1;
break;
case 常量值2:
语句体1;
break;
case 常量值3:
语句体1;
break;
default:
语句体n+1;
}
表达式的值只能是 byte short char int 字符串 枚举
for循环
for(int i =1; i<=5; i++){
System.out.println(i);
}
while循环
int i =1;
while( i<=5){
System.out.println(i);
i++;
}
do-while循环 (了解)
int i =1;
do{
System.out.println(i);
i++;
}while(i<=5);
三种循环的区别
for循环和while循环是可以等价转换的,都是先判断后执行
do-while循环先执行,后判断
三种循环的死循环
for(;;){
}
while(true){
}
do{
}while(true);
break 和 continue
continue 是结束一次循环,开始下次循环
break 是直接结束整个循环
Random工具类:用于产生随机数
步骤:
1、导包 import java.util.Random;
2、创建对象 Random r = new Random();
3、调用方法,产生随机数 int num = r.nextInt(10); //产生0-9的随机数
//2-10之间的随机数
int num = r.nextInt(9)+2; //产生2-10之间的随机数