【原】Java学习笔记006 - 流程控制
1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 需求:写一万次"我错了!" 6 7 // 方式1、使用CV大法 8 System.out.println("我错了!"); 9 System.out.println("我错了!"); 10 System.out.println("我错了!"); 11 System.out.println("我错了!"); 12 // ... 13 14 // 方式2、机械的重复的动作,很傻,考虑让计算机去做,引入了循环的概念 15 // 循环怎么理解? 16 // 循:按照一定的规律 17 // 环:闭合的圆,重复的 18 19 // 循环的形式: 20 /* 21 * 1、while循环 22 * 2、do...while循环 23 * 3、for循环 24 */ 25 } 26 }
1 package cn.temptation; 2 3 public class Sample02 { 4 public static void main(String[] args) { 5 // while循环(当型循环) 6 7 /* 8 * while(条件) { ... } 9 * 当条件满足时,一直做某事,直到条件不满足为止 10 * 11 * while结构中的 { ... } 包含的内容称为循环体 12 */ 13 14 // 需求:打印显示"我错了!"这句话3遍 15 // 定义次数变量 16 int count = 0; 17 18 while (count < 3) { 19 // 做打印显示的事情 20 System.out.println("我错了!"); 21 22 // 对次数进行统计(即做了一次打印显示,就让次数加1) 23 // count = count + 1; 24 // count += 1; 25 // count++; 26 ++count; 27 28 System.out.println("当前为第" + count + "次"); 29 } 30 } 31 }
1 package cn.temptation; 2 3 public class Sample03 { 4 public static void main(String[] args) { 5 // 需求:使用while循环输出10以内的奇数:1、3、5、7、9 6 int i = 1; 7 8 // 写法1、考虑连续的奇数之间的间隔为2 9 // while (i < 10) { 10 // System.out.println(i); 11 //// i = i + 2; 12 //// i += 2; 13 // 14 // // Invalid argument to operation ++/-- 15 //// i++++; 16 //// (i++)++; 17 // 18 // // 非要使用自增 19 // i++; 20 // i++; 21 // } 22 23 // 写法2、考虑在while循环中使用自增,但是只对那些和2求余数为1的数字才显示出来 24 while (i < 10) { 25 // 结合选择结构 26 // 判断是否为和2求余数为1的数字 27 if (i % 2 == 1) { 28 System.out.println(i); 29 } 30 31 i++; 32 } 33 } 34 }
1 package cn.temptation; 2 3 public class Sample04 { 4 public static void main(String[] args) { 5 // 需求:计算从1+2+3+...+100的和 6 int i = 1; 7 int result = 0; 8 9 // 分步来看1+2+3+...+100这个加法算式 10 // result += 1; 11 // result += 2; 12 // // ... 13 // result += 100; 14 15 // 因为有一定的规律,且重复的在操作,所以考虑使用循环 16 while (i <= 100) { 17 System.out.println(i); 18 19 result += i; 20 21 // i每次加法操作后都要做一下自增 22 i++; 23 } 24 25 System.out.println("1+2+3+...+100的总和为:" + result); 26 } 27 }
1 package cn.temptation; 2 3 public class Sample05 { 4 public static void main(String[] args) { 5 // 需求:世界最高峰珠穆朗玛峰有8848米,现在有一张很大很大的纸,纸的厚度为0.001米,折叠多少次后可以超过珠峰的高度? 6 7 // 思路:纸每次折叠,厚度都会是上一次厚度的2倍 8 9 // 纸的初始厚度 10 int height = 1; 11 // 折叠次数 12 int count = 0; 13 14 while (height <= 8848000) { 15 // 纸每次折叠,厚度都会是上一次厚度的2倍 16 height = height * 2; 17 18 // 折叠一次,折叠次数加1 19 count++; 20 } 21 22 System.out.println("折叠了" + count + "次后,就会超过珠峰的高度"); 23 } 24 }
1 package cn.temptation; 2 3 public class Sample06 { 4 public static void main(String[] args) { 5 // 需求:存折中现在有1000块钱,银行的年利息为3.5%,问在银行里放多少年后,连本带利能翻倍? 6 7 // 定义存折的金额 8 double cash = 1000.00; 9 // 定义目标金额 10 double total = cash * 2; 11 // 定义年数 12 int year = 0; 13 14 while (cash < total) { 15 // 本金和利息记为后一年的本金 16 cash = (1 + 0.035) * cash; 17 18 year++; 19 } 20 21 System.out.println("在银行里放" + year + "年后,连本带利能翻倍"); 22 } 23 }
1 package cn.temptation; 2 3 public class Sample07 { 4 public static void main(String[] args) { 5 // while循环的要点:条件放上头,控制里面走 6 int i = 1; 7 8 while (i < 5) { 9 i++; // 显示:2、3、4、5 10 System.out.println(i); 11 // i++; // 显示:1、2、3、4 12 } 13 14 // 循环编写时,特别要注意循(按照一定的规律)的规律的归纳总结,这是写好循环的关键 15 } 16 }
1 package cn.temptation; 2 3 public class Sample08 { 4 public static void main(String[] args) { 5 // 需求:统计100 ~ 999之间的水仙花数并计算有多少个? 6 7 // 规则:以三位数字为例,数字的值 = (百位上的数字 * 百位上的数字 * 百位上的数字) 8 // + (十位上的数字 * 十位上的数字 * 十位上的数字) 9 // + (个位上的数字 * 个位上的数字 * 个位上的数字),则称为是一个水仙花数 10 // 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 11 12 // 定义数字变量并赋值 13 int number = 100; 14 // 定义统计个数用的变量 15 int count = 0; 16 17 while (number <= 999) { 18 // 关键点:如何获取百位上的数字、十位上的数字、个位上的数字? 19 // 个位上的数字 20 int i = number / 1 % 10; 21 // 十位上的数字 22 int j = number / 10 % 10; 23 // 百位上的数字 24 int k = number / 100 % 10; 25 26 // 根据上面的分析,得到通用的公式,注意求余的10表示的是十进制的含义 27 28 // 规则:以三位数字为例,数字的值 = (百位上的数字 * 百位上的数字 * 百位上的数字) 29 // + (十位上的数字 * 十位上的数字 * 十位上的数字) 30 // + (个位上的数字 * 个位上的数字 * 个位上的数字),则称为是一个水仙花数 31 // 结合选择结构进行判定 32 if (number == i * i * i + j * j * j + k * k *k) { 33 System.out.println(number); 34 // 统计用的变量需要自增 35 count++; 36 } 37 38 // 统计的范围从100~999,所以数字需要自增 39 number++; 40 } 41 42 System.out.println("【100~999】之间的水仙花数有:" + count + "个"); 43 } 44 }
1 package cn.temptation; 2 3 public class Sample09 { 4 public static void main(String[] args) { 5 // 需求:大蜀山上有一段台阶,级数不知道,但是知道如果两个台阶一起跨,还剩1个台阶; 6 // 如果三个台阶一起跨,还剩2个台阶;如果四个台阶一起跨,还剩3个台阶; 7 // 如果五个台阶一起跨,还剩4个台阶;如果六个台阶一起跨,还剩5个台阶; 8 // 如果七个台阶一起跨,一个台阶都不剩。 9 // 问:这段台阶最少有多少级? 10 11 // 定义台阶变量 12 int step = 1; 13 14 // 思路:运用穷举思想,一个数字一个数字的来尝试是否满足规则 15 16 // 写法1、当台阶数不满足规则的,需要做自增;当找到第1个满足规则的台阶数时,就是最少的满足规则的台阶级数,不用自增了 17 // while (!((step % 2 == 1) && (step % 3 == 2) && (step % 4 == 3) && (step % 5 == 4) && (step % 6 == 5) && (step % 7 == 0))) { 18 // step++; 19 // } 20 // 21 // System.out.println("这段台阶最少有" + step + "级"); 22 23 // 写法2、构造一个死循环,不断的做自增,在循环体中判断是否满足规则,当找到第1个满足规则的数字时,终止循环跳出 24 // while死循环的结构 25 // while (true) { 26 // System.out.println("死循环了么?"); 27 // } 28 29 boolean flag = true; 30 while (flag) { 31 // 对台阶级数进行规则判断 32 if ((step % 2 == 1) && (step % 3 == 2) && (step % 4 == 3) && (step % 5 == 4) && (step % 6 == 5) && (step % 7 == 0)) { 33 System.out.println("这段台阶最少有" + step + "级"); 34 flag = false; 35 } 36 37 step++; 38 } 39 } 40 }
1 package cn.temptation; 2 3 public class Sample10 { 4 public static void main(String[] args) { 5 // 需求:百钱百鸡问题:母鸡一只5元,公鸡一只3元,小鸡三只1元,有100元,如何买到100只鸡?母鸡多少只?公鸡多少只?小鸡多少只?(母鸡、公鸡、小鸡都有) 6 7 // 思路: 8 // 从需求中得到一些等式 9 // 母鸡数量 + 公鸡数量 + 小鸡数量 = 100 10 // 母鸡单价 * 母鸡数量 + 公鸡单价 * 公鸡数量 + 小鸡单价 * 小鸡数量 = 100 11 // 小鸡数量是3的倍数 12 13 // 运用"穷举法" 14 // 如果买1只母鸡,再买1只公鸡,还能买多少只小鸡 15 // 如果买1只母鸡,再买2只公鸡,还能买多少只小鸡 16 // ... 17 // 如果买2只母鸡,再买1只公鸡,还能买多少只小鸡 18 // 如果买2只母鸡,再买2只公鸡,还能买多少只小鸡 19 // ... 20 21 // 母鸡数量 22 int i = 0; 23 // 公鸡数量 24 int j = 0; 25 // 小鸡数量 26 int k = 0; 27 28 System.out.println("计算百钱百鸡问题的结果:"); 29 30 // while循环的嵌套 31 // 注意:使用while循环的嵌套时,格外要注意内层while循环的循环条件;同时也要考虑到while循环的执行效率 32 33 // 下句语句其实效率不高,可以改进 34 // while (i < 100) { // 统计买母鸡的只数 35 while (i < 20) { // 统计买母鸡的只数 36 // 注意:必须在后一次的内层循环之前,把变量j的值重新赋值一下,否则这个变量j的值还是上一次内层循环结束时得到的那个值 37 j = 0; 38 39 // 下句语句其实效率不高,可以改进 40 // while (j < 100) { // 统计买公鸡的只数 41 while (j < 33) { // 统计买公鸡的只数 42 // 可以根据母鸡数量 和 公鸡数量 就可以得到小鸡数量 43 k = 100 - i - j; 44 45 // 根据思路分析中列出的等式 46 if ((5 * i + 3 * j + k / 3 == 100) && (k % 3 == 0) && (i != 0) && (j != 0) && (k != 0)) { 47 System.out.println("母鸡为:" + i + "只,公鸡为:" + j + "只,小鸡为:" + k + "只"); 48 } 49 50 j++; 51 } 52 i++; 53 } 54 55 } 56 }
1 package cn.temptation; 2 3 public class Sample11 { 4 public static void main(String[] args) { 5 // do...while循环(直到型循环) 6 // 格式: 7 // do { 8 // System.out.println("直到型循环"); 9 // } while (condition); 10 11 int i = 1; 12 13 // do { 14 // System.out.println(i); 15 // i++; 16 // } while (i < 4); 17 18 // while循环 和 do...while循环的区别: 19 // 1、可以设置断点,结合调试分析 20 // while循环的条件写在最上面,一上来就先判断条件是否满足,满足了才会进入循环体执行语句 21 // do...while循环的条件写在最后,一上来就先进入循环体并执行循环体中的语句,再判断循环条件是否满足,满足的话继续循环 22 // 注意:do...while循环在相同的条件(condition)不成立的情况下会比while循环多执行一次 23 // 2、while结构就是一个语句块;do...while结构后必须要有一个分号,否则就产生语法错误 24 25 // do...while循环在相同的条件(condition)成立的情况下和while循环的执行次数相同 26 while (i < 3) { 27 System.out.println(i); 28 i++; 29 } 30 31 do { 32 System.out.println(i); 33 i++; 34 } while (i < 3); 35 36 // do...while循环在相同的条件(condition)不成立的情况下会比while循环多执行一次 37 while (i < 1) { 38 System.out.println(i); 39 i++; 40 } 41 42 do { 43 System.out.println(i); 44 i++; 45 } while (i < 1); 46 } 47 }
1 package cn.temptation; 2 3 public class Sample12 { 4 public static void main(String[] args) { 5 // 需求:使用do...while循环输出1~100之间的数字 6 // 需求:使用do...while循环计算1+2+...+100和 7 int i = 1; 8 9 do { 10 System.out.println(i); 11 i++; 12 } while (i <= 100); 13 14 // 因为此时i == 101,所以需要把i进行重置 15 i = 1; 16 int sum = 0; 17 18 do { 19 sum += i; 20 i++; 21 } while (i <= 100); 22 23 System.out.println("1+2+...+100=" + sum); 24 } 25 }
1 package cn.temptation; 2 3 public class Sample13 { 4 public static void main(String[] args) { 5 // 需求:使用do...while循环列出1~100之间所有的奇数 6 int i = 1; 7 8 // 写法1、奇数的间隔为2 9 // do { 10 // System.out.println(i); 11 // i += 2; 12 // } while (i <= 100); 13 14 // 写法2、奇数是和2求余数为1的数字 15 do { 16 if (i % 2 == 1) { 17 System.out.println(i); 18 } 19 20 i++; 21 } while (i <= 100); 22 } 23 }