Java基础4
Scanner 键盘输入功能的实现
使用Scanner获取不同类型数据的步骤:
- 导包: import java.util.Scanner
- 提供(或创建)一个Scanner类的实例
- 调用Scanner类中的方法,获取指定类型的变量
- 关闭资源,调用Scanner类的close( )
注意:
Scanner类中提供了获取byte \ short \ int \ long \ float \ double \ boolean \ String类型变量的方法,但是!没有提供获取char类型变量的方法,需要使用next().charAt(0)获取
import java.util.Scanner //步骤一 导包 class ScannerTest{ public static void main(String[] args){ Scanner scan = new Scanner (System.in);//步骤二 创建一个Scanner类实例 System.out.println("请输入你的名字"); String name = scan.next(); //步骤三 调用Scanner类中的方法 System.out.println("name=" +name);
scan.close(); } }
random随机数
Math类的random()的调用会返回一个[0.0,1.0)范围的一个double型值
需求1:获取一个[0,100]范围内的随机整数:
int num1 = (int)(Math.random()*101); //[0.0 , 1.0) --> [0.0 , 101.0) --> [0,100]
需求2:获取一个[1,100]范围内的随机整数:
int num1 = (int)(Math.random()*100)+1; //[0.0 , 1.0) --> [0.0 , 100.0) --> [0,99]+1 -->[1,100]
需求3:获取[a,b]范围内的随机整数:
int num1 = (int)(Math.random()*(b-a+1))+a; //[0.0 , 1.0) --> [0.0 , (b-a+1).0) --> [0,b-a]+a -->[a,b]
流程控制语句
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
三种流程结构:
顺序结构 程序从上到下逐行执行,中间没有任何判断和跳转
分支结构 根据条件,选择性的执行某段代码。有if-else和switch-case两种分支语句
循环结构 根据循环条件,重复性的执行某段代码。有for、while、do-while三种循环语句
顺序结构
程序从上到下逐行的执行语句,表达式语句都是顺序执行,并且对上一行某个变量的修改对下一行会产生影响。
分支结构
if-else条件判断结构
说明:if-else语句中的执行语句块中只有一行执行语句时,这行执行语句所在的一对{ }可以省略,但是不建议。
//案例一:成年人心率的正常范围是每分钟60-100次,体检时心率不在此范围内则重新检查 int heartBeats = 89; if (heartBeats >= 60 && heartBeats <=100): //不能写为 if (60<= heartBeats <= 100) 因为先执行60<= heartBeats 结果是boolean不可以参与后面判断 System.out.println("正常"); else: System.out.println("重新检查!");
if-else嵌套使用:
//对三个数从小到大输出 int num1 = 34; int num2 = 35; int num3 = 92; if (num1 > num2){ if (num3>num1){ System.out.println(num2 + "<"+ num1 + "<" + num3); }else if (num3<num2){ System.out.println(num3 + "<"+ num2 + "<" + num1); }else{ System.out.println(num2 + "<"+ num3 + "<" + num1);} }else{ if (num3>num2){ System.out.println(num1 + "<"+ num2 + "<" + num3); }else if (num3<num1){ System.out.println(num3 + "<"+ num1 + "<" + num2); }else{ System.out.println(num1 + "<"+ num3 + "<" + num2);} }
switch-case选择结构
语法格式:
执行过程:
根据表达式中的值,依次匹配case语句,一旦与某一个case中的常量相等,那么就执行此case中的执行语句。
注意:执行完此执行语句之后,
情况1:遇到break,则执行break后,跳出当前的switch-case结构
情况2:没有遇到break,则继续执行其后的case中的执行语句....直到遇到break或者执行完所有的case及default中的语句,退出当前的switch-case结构
说明:
- switch中的表达式只能是特定的数据类型。如下:byte \ short \ char \ int \ 枚举(JDK5.0新增) \ String(JDK7.0新增)
- case后跟的都是常量,使用表达式与这些常量做相等的判断,不能进行范围的判断。
- 开发中,使用switch-case时,通常case匹配的情况都有限。
- break:可以使用在switch-case中,一旦执行此break关键字,就跳出当前的switch-case结构。
- default:类似于if-else中的else结构,default是可选的,而且位置是灵活的。
//对于一门满分100的课程,用switch-case输出及格或者不及格 Scanner scan = new Scanner(System.in); int score = scan.nextInt(); //方式一: switch (score/10) { case 1: case 2: case 3: case 4: case 5: System.out.println("不及格"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("及格"); break; default: System.out.println("成绩有误!"); break; } //方式二: switch (score/60) { case 0: System.out.println("不及格"); break; case 1: System.out.println("及格"); break; default: System.out.println("成绩有误!"); break; }
switch-case 与 if-else 之间的转换
① 开发中凡是可以使用switch-case结构的场景,都可以写成if-else。反之不成立。
② 开发中,如果一个具体的问题既可以使用switch-case,又可以使用if-else的时候,推荐使用switch-case,因为switch-case时间复杂度o(1),if-else是o(n)。
if分支和switch分支语句的异同之处
if-else语句优势:
- if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,适用范围更广。
- switch语句的条件是一个常量值(byte、short、int、char、枚举、String)只能判断某个变量或表达式的结果是否等于某个常量值,使用场景更狭窄。
switch语句优势:
- 当条件判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多,因为效率稍高。当条件是区间范围的判断时,只能使用if语句。
- 使用switch可以利用穿透性,同时执行多个分支,而if-else没有穿透性。
循环结构
循环结构分类:
① for循环 ② while循环 ③ do-while循环
循环结构四要素:
① 初始化部分 ② 循环条件 ③ 循环体 ④ 迭代部分
for循环
基本格式
int num = 1; for (System.out.println("a"); num<3; System.out.println("c"), num ++){ System.out.println("b"); } //输出:abcbc
说明:
- 我们可以在循环结构中使用break,一旦执行break,就跳出(或结束)当前循环结构、
- 如何结束一个循环结构? ① 循环条件不满足(即循环条件执行完以后是false) ② 在循环体中执行了break
举例:
// 以12和20为例,最大公约数4,最小公倍数是60 int m = 12; int n = 20; //获取m和n中的较小值 int min = (m<n) ? m : n; //最大公约数 //方式1 int result = 1; for (int i = 1; i < min; i ++){ if (m % i == 0 && n % i == 0){ result = i; //不能在这一行输出,因为最大的那个才是我们要找的。 } } System.out.println("最大公约数是:" + result); //方式2 更推荐!方式1 将所有的都要遍历一遍,方式2只用从大的往小找 找到第一个就可以输出 for (int i = min; i >= 1; i --){ if (m % i == 0 && n % i == 0){ System.out.println("最大公约数是:" + i); break; } } //最小公倍数 int max = (m>n) ? m : n; for (int i = max; i <= n * m; i ++){ if ( i % m == 0 && i % n ==0 ){ System.out.println("最小公倍数是:" + i); break; } }
while循环
基本格式
注意:for循环与while循环可以相互转换!
for循环和while训话你的小区别: 初始化条件的作用域范围不同,while循环中的初始化条件在while循环结束后,依然有效。
// 猜数字游戏 1-100以内 并输出猜的次数 int num = (int) (Math.random()*100)+1; int count = 1; System.out.println("请输入你的猜测:"); Scanner scan = new Scanner(System.in); int gease = scan.nextInt(); while (gease != num){ if (num > gease) System.out.println("猜小了!"); else System.out.println("猜大了!"); count += 1; System.out.println("请再猜一次:"); gease = scan.nextInt(); } System.out.println("恭喜猜对啦!我的数字是:"+num + " 你一共猜了"+ count +"次!");
do-while循环
语法格式:
说明:
- do-while循环至少执行一次循环体。
- for、while、do-while循环三者之间是可以相互转换的。
- do-while循环结构,在开发中,相较于for、while循环来讲,使用的较少。
// ATM取款 Scanner scan = new Scanner(System.in); int balance = 0; boolean flag = true; do{ System.out.println("================ATM==================="); System.out.println(" 1、存款"); System.out.println(" 2、取款"); System.out.println(" 3、显示余额"); System.out.println(" 4、退出"); System.out.println(" 请选择(1-4):"); int table = scan.nextInt(); if (table == 1){ System.out.println("请输入您的存款金额:"); int money = scan.nextInt(); balance += money; }else if (table == 2){ System.out.println("请输入您的取款金额:"); int money = scan.nextInt(); balance -= money; }else if (table == 3){ System.out.println("您的余额:" + balance); }else{ flag = false; } }while(flag);
如何选择三种循环:
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,选择while循环
- 如果循环体语句块至少执行一次,可以考虑使用do-while循环
- 本质上:三种循环之间完全可以相互转换,都能实现循环的功能
嵌套循环
所谓嵌套循环,是指一个循环结构A的循环体是另一个循环结构B。比如,for循环里面还有一个for循环。其中,for、while、do-while均可以作为外层循环或者内层循环。
说明:设外层循环次数为m次,内层为n次,则内层循环的循环体实际上要执行m*n次。
for (int i = 1; i < 6; i ++){ for (int j = 1; j <= i ; j++){ System.out.print("*"); }System.out.println(""); }
//上半部分 for (int i = 1; i <=5; i ++){ for (int j = 1; j <= (10-2*i);j++){ System.out.print(" "); } for (int k = 1; k <= (2*i-1); k++){ System.out.print("* "); } System.out.println(""); } //下半部分 for (int i = 4; i >= 1; i --){ for (int j = (10-2*i); j >= 1 ;j--){ System.out.print(" "); } for (int k = (2*i-1); k >= 1 ; k--){ System.out.print("* "); } System.out.println(""); }
关键字break和continue的使用
break和continue的说明
//输出100以内的质数: for (int i = 2; i <=100; i++){ for (int j = 2; j <= i ;j++){ if (i % j == 0 && j != i) break; if (j == i) System.out.print(i + "是质数!"); } } //更优解: for (int i = 2; i <= 100 ; i++){ boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j ++){ if (i % j == 0){ flag = false; break; } } if (flag){ System.out.print(i +"是质数!"); } }
带标签的break和continue
说明:
- break和continue语句在多层嵌套循环语句体中时,也可以通过标签指明要跳过的时哪一层循环。
- 标号语句必须紧接在循环的头部,标号语句不能用在非循环语句的前面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具