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