Lesson 08
字面量规范
使用原值
代码中 如果有 计算出来的字面量, 那么需要写是怎么计算的
使用前
1 2 3 4 5 6 7 8 int[] arr = {6, 7, 3, 8, 4}; for (int i = 0; i < 5; i++) { Console.print(arr[i]); if (i != 4) { Console.print(", "); }}
使用后
1 2 3 4 5*6 7 8 int[] arr = {6, 7, 3, 8, 4}; for (int i = 0; i < 5; i++) { Console.print(arr[i]); if (i != 5 - 1) { Console.print(", "); }}
为业务值定义变量
使用前
1 2 3 4 5 6 7 8 int[] arr = {6, 7, 3, 8, 4}; for (int i = 0; i < 5; i++) { Console.print(arr[i]); if (i != 5 - 1) { Console.print(", "); }}
使用后
1 2+3*4 5*6 7 8 int[] arr = {6, 7, 3, 8, 4};int size = 5;for (int i = 0; i < size; i++) { Console.print(arr[i]); if (i != size - 1) { Console.print(", "); }}
注意
引用变量
任何值 如果能从已知变量中计算出来, 那么就使用 已知变量
使用前
1 2 3 4 5 6 7 8 int[] arr = {6, 7, 3, 8, 4}; for (int i = 0; i < 5; i++) { Console.print(arr[i]); if (i != 5 - 1) { Console.print(", "); }}
使用后
1 2 3*4 5*6 7 8 int[] arr = {6, 7, 3, 8, 4}; for (int i = 0; i < arr.length; i++) { Console.print(arr[i]); if (i != arr.length - 1) { Console.print(", "); }}
最终效果
程序中只能出现 业务数据 和 -1, 0, 1, 2
原始数据值 只能出现一次
复杂嵌套
概览
基础规则
if, switch, for, while 可以随意嵌套
样例
1 2 3 4 5 6 7 8 9 10 11 for (...) { if (...) { ... } while(...) { if (...) { ... } }}
留意
换行缩进
变量作用域及生命周期
循环嵌套
需求
小明 每天 吃3顿饭, 吃完了就睡觉
三天过去了, 小明干了什么
< < < < < < < < < < < <吃饭吃饭吃饭睡觉吃饭吃饭吃饭睡觉吃饭吃饭吃饭睡觉
代码
1 2 3 4 5 6 7 8 9 10 11 12 Console.println("吃饭");Console.println("吃饭");Console.println("吃饭");Console.println("睡觉");Console.println("吃饭");Console.println("吃饭");Console.println("吃饭");Console.println("睡觉");Console.println("吃饭");Console.println("吃饭");Console.println("吃饭");Console.println("睡觉");
消除重复1
1+2 3 4 5 6+7-8-9-10-11-12-13-14-for (int i = 0; i < 3; i++){ Console.println("吃饭"); Console.println("吃饭"); Console.println("吃饭"); Console.println("睡觉");}Console.println("吃饭");Console.println("吃饭");Console.println("吃饭");Console.println("睡觉");Console.println("吃饭");Console.println("吃饭");Console.println("吃饭");Console.println("睡觉");
消除重复2
1 2+3 4+5-6-7 8 for (int i = 0; i < 3; j++){ for (int j = 0; j < 3; i++){ Console.println("吃饭"); } Console.println("吃饭"); Console.println("吃饭"); Console.println("睡觉");}
内外循环
内循环
外循环
执行顺序
内循环 | 秒针 |
外循环 | 分针 |
秒针走一圈,分针走一格
11 for (12; 13; 14) { 21 for (22; 23; 24) { 31 } 25 } 15 11 12 13 21, 22 23, 31 24 23, 31 24 23, ... 31 24 23, 25, 14 13 21, 22 23, 31 24 23, 31 24 23, ... 31 24 23, 25, 14 13 ... 21, 22 23, 31 24 23, 31 24 23, ... 31 24 23, 25, 14 13 15
复杂嵌套编程方法
代码消除
跟 一般 for 语句一样
练习 1
< < < < <* * * * ** * * * * * * * * *
练习 2
< < < <1 x 1 = 1, 1 x 2 = 2, ... 1 x 9 = 92 x 2 = 4, 2 x 3 = 6, ... 2 x 9 = 9...8 x 8 = 64, 8 x 9 = 729 x 9 = 81
剥洋葱大法
原始问题
1 // 输出 100 以内所有的质数
使用 for 降级
1+2 3+for (int i = 2; i <= 100; i++) { // 给定一个数 i, 如果是质数, 就把它输出出来}
使用 if 降级
1 2+3 4 5+6+7+8 for (int i = 2; i <= 100; i++) { boolean test; // 检测一个数 i, 是否是质数 if (test) { Console.println(i); }}
伪代码分析
质数是只能被 1 和 自己整除
也就是说, 从 2 到 它自己, 没有任何数能把它整除
1 2*3 4 5 6 7 8 9 10*11 12 13 for (int i = 2; i <= 100; i++) { boolean isPrime = true; // 对 i 进行检查 // (从 2 到 i, 不包含 i) { // 应该没有任何能整除 i 的 // 一旦发现, 就不是质数了 // } if (isPrime) { Console.println(i); }}
使用 for 降级
1 2 3 4+5 6 7+8 9 10 11 12 for (int i = 2; i <= 100; i++) { boolean isPrime = true; for (int factor = 2; factor < i; factor++){ // 应该没有任何能整除 i 的 // 一旦发现, 就不是质数了 } if (isPrime) { Console.println(i); }}
伪代码分析
1 2 3 4 5*6*7*8 9 10 11 12 13 for (int i = 2; i <= 100; i++) { boolean isPrime = true; for (int factor = 2; factor < i; factor++){ // 如果 (factor 能整除 i) { // i 就不是质数 // } } if (isPrime) { Console.println(i); }}
使用 if 降级
1 2 3 4 5*6*7*8*9 10 11 12 13 14 for (int i = 2; i <= 100; i++) { boolean isPrime = true; for (int factor = 2; factor < i; factor++){ if (i % factor == 0){ isPrime = false; break; } } if (isPrime) { Console.println(i); }}