程序逻辑控制【JavaSE】
1. 顺序结构
语句顺序决定了执行顺序
例:
public class TestDemo {
public static void main(String[] args) {
System.out.println("1");
System.out.println("2");
System.out.println("3");
}
}
2. 分支结构
2.1 if语句
同C语言,区别在于Java的条件判断都是布尔表达式,且左括号要在上一行
语法结构1
单分支
if(布尔表达式){
//条件满足则执行语句
}
语法结构2
双分支
if(布尔表达式1){
//条件满足则执行语句1
}else{
//条件满足则执行语句1
}
语法结构3
多分支
if(布尔表达式1){
//条件满足则执行语句1
}else if(布尔表达式2){
//条件满足则执行语句2
}else{
//条件都不满足则执行语句3
}
2.1.1 例
判断闰年:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。(百度百科)
判断闰年我们再熟悉不过,以此例感受逻辑控制的重要性
- 这是一个分支结构的逻辑,所以我们要找到不同的分支,它们之间必须有关系.例如普通闰年不是一百的倍数,世纪闰年是整百数.这是第一层分支.
- 在不是整百数的分支判断4的倍数
- 在是整百数的分支判断400的倍数
int year = 2000;
if(year % 100 == 0){
if(year % 4 == 0){
System.out.println(year+"是闰年");
}else{
System.out.println(year+"不是闰年");
}
}else{
if(year % 400 == 0){
System.out.println(year+"是闰年");
}else{
System.out.println(year+"不是闰年");
}
}
结果:2000是闰年
- 这样写虽然逻辑清晰,但代码有些冗余,可以利用逻辑运算符(&&、||)短路的特性将分支连接.但要注意顺序.
int year = 2005;
if( (year % 100 != 0 && year % 4 == 0) || year % 400 == 0){
System.out.println(year+"是闰年");
}else{
System.out.println(year+"不是闰年");
}
这里将第一层分支(year % 100 != 0
)作为&&的前件,它为ture时则进入第一个分支,否则进入第二个分支.这是逻辑控制的妙处.
2.1.2 注意事项
- 不论分支内要执行的语句有多少句,即使只有一句也要加上括号
- 代码风格:虽然C的传统写法在Java中是合法的,但依然建议左括号要紧跟在
if/else if
后面. - 条件判断后不要加
‘;‘
,它是语句执行结束的标志
注:代码好坏与否首先取决于它的可读性(代码风格、注释等),其次才是代码效率
2.2 switch语句
语法格式
switch(整数|枚举|字符|字符串){
case 内容1 : {
//内容满足时执行语句;
break;
}
case 内容2 : {
//内容满足时执行语句;
break;
}
...
default:{
//内容都不满足时执行语句;
break;
}
}
switch语句用法大致同C语言,但switch入口只能是整数、枚举、字符、字符串.注意事项也是相同的.
- 每个switch最好都要有一个default出口
- 每个分支最好都要有break
- 不能表达类似区间不等式这样的复杂条件(if语句可以轻松完成),所以switch使用频率比较低
- 尽量不要嵌套,因为比较难读懂(可读性)
注:Java的枚举需要学完反射、类和对象、继承之后才会学习,是比C复杂的存在.
switch的局限性这么多,还是老老实实用if语句吧.
3. 循环结构
3.1 while循环
基本语法
while(循环条件){
循环语句
}
- 循环条件是布尔表达式
例1:打印9~1
int n = 10;
while(n != 0){
System.out.println(n);
n--;
}
- 不能像C语言一样,循环条件写成
while(n)
例2:计算5的阶乘
int n = 5;
int ret = 1;
while(n != 0){
ret *= n;
n--;
}
System.out.println(ret);
结果:120
例3:计算1!+2!+3!+4!+5!
int n = 1;
int ret = 1;
int num = 0;
while(n <= 5){
int m = 1;
ret = 1;
while(m <= n){
ret *= m;
m++;
}
num += ret;
n++;
}
结果:153
计算阶乘的题我们再熟悉不过,这里是为了使结构更清晰:一层计算阶乘,一层累加.实际上它们可以在同一层循环内,降低时间复杂度
- 注意事项与if语句相同
3.2 for循环
for循环和while循环完全等价,区别就是它们的起始条件和计数器的位置不一样.
语法结构
for(表达式1;表达式2;表达式3){
循环体;
}
- 表达式1:循环初始条件
- 表达式2:循环条件
- 计数器(更新循环变量)
例1:打印1~9
for (int i = 1; i < 10; i++) {
System.out.println(i);
}
例2:计算5的阶乘
int ret = 1;
for (int i = 1; i <= 5 ; i++) {
ret *= i;
}
System.out.println(ret);
结果:120
例3:计算1!+2!+3!+4!+5!
int ret = 1;
int num = 0;
for (int i = 1; i <= 5 ; i++) {
ret = 1;
for (int j = 1; j <= i ; j++) {
ret *= j;
}
num += ret;
}
System.out.println(num);
结果:153
- 注意事项同if语句
3.3 break
作用:结束最近的一层循环
例:找到1~10中第一个3的倍数的数字
for (int i = 1; i <= 10 ; i++) {
if(i % 3 == 0){
System.out.println(i);
break;
}
}
结果:3
当符合条件,直接终止当层循环.break多用于循环语句中,switch也可以
3.4 continue
作用:跳过最近的这层循环的当次循环,继续下一次循环
例:找到1~10中所有是3的倍数的数字
for (int i = 1; i < 10 ; i++) {
if(i % 3 != 0){
continue;
}else{
System.out.println(i);
}
}
结果:3 6 9
当符合条件,跳过当前循环,直接开始下一次循环
do…while循环
do{
执行语句;
}while(表达式);
例:打印1~9
int i = 0;
do{
i++;
System.out.println(i);
}while(i <= 8);
- 不要漏掉最后的分号
- 循环体至少执行一次(注意例中的条件)
4. 输入输出
4.1 输出到控制台
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
- printlen自动换行;print不换行
- printf用法和C语言相同
例
System.out.println("hello world");
System.out.print("hello");
System.out.print("world");
结果:
hello world
helloworld
4.2 从键盘输入
使用 Scanner 读取字符串/整数/浮点数
import java.util.Scanner; // 需要导入 util 包
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法
sc.close();
类似C语言的fclose()
函数
使用 Scanner 循环读取 N 个数字
Scanner sc = new Scanner(System.in);
double sum = 0.0;
int num = 0;
while (sc.hasNextDouble()) {
double tmp = sc.nextDouble();
sum += tmp;
num++;
}
System.out.println("sum = " + sum);
System.out.println("avg = " + sum / num);
sc.close();
- 要终止输入多个数据,用ctrl+z(win)/crtl+d(Linux/mac)
键入:
10
40.0
50.5
^Z(键入结束)
结果:
sum = 150.5
avg = 30.1
日志
5/1/2022
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程