顺序控制

image.png
前面定义了变量 后面才可以引用,向前引用 不是向后

分支结构

让程序有选择的的执行,分支控制有三种

1) 单分支 if
2) 双分支 if-else
3) 多分支 if-else if -….-else

单分支 if

  1. //if的快速入门
  2. import java.util.Scanner;//导入
  3. public class If01 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. //编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,
  7. //则输出 "你年龄大于18,要对自己的行为负责,送入监狱"
  8. //
  9. //思路分析
  10. //1. 接收输入的年龄, 应该定义一个Scanner 对象
  11. //2. 把年龄保存到一个变量 int age
  12. //3. 使用 if 判断,输出对应信息
  13. //应该定义一个Scanner 对象
  14. Scanner myScanner = new Scanner(System.in);
  15. System.out.println("请输入年龄");
  16. //把年龄保存到一个变量 int age
  17. int age = myScanner.nextInt();
  18. //使用 if 判断,输出对应信息
  19. if(age > 18) {
  20. System.out.println("你年龄大于18,要对自己的行为负责,送入监狱");
  21. }
  22. System.out.println("程序继续...");//这一句总会执行
  23. }
  24. }


双分支结构 if else

  1. //if-else的快速入门
  2. import java.util.Scanner;//导入
  3. public class If02 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. //编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,
  7. //则输出 "你年龄大于18,要对
  8. //自己的行为负责, 送入监狱"。否则 ,输出"你的年龄不大这次放过你了."
  9. //
  10. //思路分析
  11. //1. 接收输入的年龄, 应该定义一个Scanner 对象
  12. //2. 把年龄保存到一个变量 int age
  13. //3. 使用 if-else 判断,输出对应信息
  14. //应该定义一个Scanner 对象
  15. Scanner myScanner = new Scanner(System.in);
  16. System.out.println("请输入年龄");
  17. //把年龄保存到一个变量 int age
  18. int age = myScanner.nextInt();
  19. //使用 if-else 判断,输出对应信息
  20. if(age > 18) {
  21. System.out.println("你年龄大于18,要对自己的行为负责,送入监狱");
  22. } else {//双分支
  23. System.out.println("你的年龄不大这次放过你了");
  24. }
  25. System.out.println("程序继续...");
  26. }
  27. }

image.png
上面会输出 韩顺平教育
因为根据判断x>5成立 所以为真进入内层循环,外层的else “x is” + x不会执行
内层判断y>5不成立所以 x+y 不会输出 因为还在内层 会继续往下走 会输出 韩顺平教育

  1. //单分支和双分支的练习
  2. //
  3. public class IfExercise01 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. //编写程序,声明2个double型变量并赋值。
  7. //判断第一个数大于10.0,且第2个数小于20.0,打印两数之和
  8. //思路分析
  9. double d1 = 33.5;
  10. double d2 = 2.6;
  11. if(d1 > 10.0 && d2 < 20.0) {
  12. System.out.println("两个数和=" + (d1 + d2));
  13. }
  14. //【课后自己练】定义两个变量int,判断二者的和,
  15. //是否能被3又能被5整除,打印提示信息
  16. //
  17. //思路分析
  18. //1. 定义两个变量int num1, num2
  19. //2. 定义一个变量 int sum = num1 + num2;
  20. //3. sum % 3 , 5 后 等于0 说明可以整除
  21. //4. 使用 if - else 来提示对应信息
  22. //走代码
  23. int num1 = 10;
  24. int num2 = 1;
  25. int sum = num1 + num2;
  26. if(sum % 3 == 0 && sum % 5 == 0) {
  27. System.out.println("和可以被3又能被5整除");
  28. } else {
  29. System.out.println("和不能被3和5整除..");
  30. }
  31. //判断一个年份是否是闰年,闰年的条件是符合下面二者之一:
  32. //(1)年份能被4整除,但不能被100整除;(2)能被400整除
  33. //
  34. //思路分析
  35. //1. 定义 int year 保存年
  36. //2. 年份能被4整除,但不能被100整除,
  37. // => year % 4 == 0 && year % 100 != 0
  38. //3. 能被400整除 => year % 400 == 0
  39. //4. 上面的 2 和 3 是 或的关系
  40. //代码实现
  41. int year = 2028;
  42. if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) {
  43. System.out.println(year + " 是 闰年");
  44. } else {
  45. System.out.println(year + " 不是 闰年");
  46. }
  47. }
  48. }

多分支结构

多分支演示
1) 信用分为100分时,输出 信用极好;
2) 信用分为(80,99]时,输出 信用优秀; ( ] 前开后闭合 证明大于80 小于99但包含99

3) 信用分为[60,80]时,输出 信用一般;
4) 其它情况 ,输出 信用 不及格
请从键盘输入保国的芝麻信用分,并加以判断

  1. //课堂练习
  2. import java.util.Scanner;
  3. public class If03 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. /*
  7. 输入保国同志的芝麻信用分:
  8. 如果:
  9. 信用分为100分时,输出 信用极好;
  10. 信用分为(80,99]时,输出 信用优秀;
  11. 信用分为[60,80]时,输出 信用一般;
  12. 其它情况 ,输出 信用 不及格
  13. 请从键盘输入保国的芝麻信用分,并加以判断
  14. 假定信用分数为int
  15. */
  16. Scanner myScanner = new Scanner(System.in);
  17. //接收用户输入
  18. System.out.println("请输入信用分(1-100):");
  19. //请思考:如果小伙伴输入的不是整数,而是hello..
  20. //==>这里我们后面可以使用异常处理机制搞定-》老师点一下
  21. int grade = myScanner.nextInt();
  22. //先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
  23. if(grade >=1 && grade <= 100) {
  24. //因为有4种情况,所以使用多分支
  25. if(grade == 100) {
  26. System.out.println("信用极好");
  27. } else if (grade > 80 && grade <= 99) { //信用分为(80,99]时,输出 信用优秀;
  28. System.out.println("信用优秀");
  29. } else if (grade >= 60 && grade <= 80) {//信用分为[60,80]时,输出 信用一般
  30. System.out.println("信用一般");
  31. } else {//其它情况 ,输出 信用 不及格
  32. System.out.println("信用不及格");
  33. }
  34. } else {
  35. System.out.println("信用分需要在1-100,请重新输入:)");
  36. }
  37. }
  38. }

image.png

嵌套分支结构

不建议超过三层
案例
参加歌手比赛,如果初赛成绩大于 8.0 进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。【可以让学员先练习下】, 输入成绩和性别,进行判断和输出信息

  1. //课堂练习
  2. import java.util.Scanner;
  3. public class If03 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. /*
  7. 输入保国同志的芝麻信用分:
  8. 如果:
  9. 信用分为100分时,输出 信用极好;
  10. 信用分为(80,99]时,输出 信用优秀;
  11. 信用分为[60,80]时,输出 信用一般;
  12. 其它情况 ,输出 信用 不及格
  13. 请从键盘输入保国的芝麻信用分,并加以判断
  14. 假定信用分数为int
  15. */
  16. Scanner myScanner = new Scanner(System.in);
  17. //接收用户输入
  18. System.out.println("请输入信用分(1-100):");
  19. //请思考:如果小伙伴输入的不是整数,而是hello..
  20. //==>这里我们后面可以使用异常处理机制搞定-》老师点一下
  21. int grade = myScanner.nextInt();
  22. //先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
  23. if(grade >=1 && grade <= 100) {
  24. //因为有4种情况,所以使用多分支
  25. if(grade == 100) {
  26. System.out.println("信用极好");
  27. } else if (grade > 80 && grade <= 99) { //信用分为(80,99]时,输出 信用优秀;
  28. System.out.println("信用优秀");
  29. } else if (grade >= 60 && grade <= 80) {//信用分为[60,80]时,输出 信用一般
  30. System.out.println("信用一般");
  31. } else {//其它情况 ,输出 信用 不及格
  32. System.out.println("信用不及格");
  33. }
  34. } else {
  35. System.out.println("信用分需要在1-100,请重新输入:)");
  36. }
  37. }
  38. }

image.png

  1. import java.util.Scanner;
  2. public class test {
  3. public static void main(String[] args){
  4. Scanner myScanner = new Scanner(System.in);
  5. System.out.println("请输入当前月份:");
  6. int months = myScanner.nextInt();
  7. System.out.println("请输入客户年龄:");
  8. int age = myScanner.nextInt();
  9. if(months > 4 && months < 10){
  10. if (age >18 && age < 60){
  11. System.out.println("旺季销售 票价60元");
  12. }else if(age < 18){
  13. System.out.println("旺季销售 儿童票半价 30元");
  14. }else if(age > 60){
  15. System.out.println("旺季销售 老年票20元");
  16. }
  17. }else{
  18. if(age > 18){
  19. System.out.println("淡季销售 票价40");
  20. }else{
  21. System.out.println("淡季销售 票价20");
  22. }
  23. }
  24. }
  25. }

switch结构

image.png

请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
a 表示星期一,b 表示星期二 …

根据用户的输入显示相应的信息.要求使用 switch 语句完成
穿透: 如果表达式等于常量1 执行完常量1下的语句块 如果常量1 语句块下没有break 会直接执行常量2的语句块而不会判断常量2是否符合标准 常量2没有break 继续穿透
穿透是从匹配到的语句往后穿透 前面没有匹配到的不会执行

如果所有的语句都没有break 则都会执行 default也会执行

  1. import java.util.Scanner;
  2. public class Switch01 {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. /*
  6. 案例:Switch01.java
  7. 请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
  8. a表示星期一,b表示星期二 …
  9. 根据用户的输入显示相应的信息.要求使用 switch 语句完成
  10. 思路分析
  11. 1. 接收一个字符 , 创建Scanner对象
  12. 2. 使用switch 来完成匹配,并输出对应信息
  13. 代码
  14. */
  15. Scanner myScanner = new Scanner(System.in);
  16. System.out.println("请输入一个字符(a-g)");
  17. char c1 = myScanner.next().charAt(0);//
  18. //在java中,只要是有值返回,就是一个表达式
  19. switch(c1) {
  20. case 'a' : //这里是冒号
  21. System.out.println("今天星期一,猴子穿新衣");
  22. break;
  23. case 'b' :
  24. System.out.println("今天星期二,猴子当小二");
  25. break;
  26. case 'c' :
  27. System.out.println("今天星期三,猴子爬雪山..");
  28. break;
  29. //.....
  30. default:
  31. System.out.println("你输入的字符不正确,没有匹配的");
  32. // default后面可以没有 break 一样执行完退出循环
  33. }
  34. System.out.println("退出了switch ,继续执行程序");
  35. }
  36. }


switch细节

image.png

  1. public class SwitchDetail {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //细节1
  5. //表达式数据类型,应和case 后的常量类型一致,
  6. //或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是 int
  7. //细节2
  8. //switch(表达式)中表达式的返回值必须是:
  9. //(byte,short,int,char,enum[枚举],String) 新版本好像可以string字符串?
  10. //细节3
  11. //case子句中的值必须是常量(1,'a')或者是常量表达式,而不能是变量
  12. //
  13. //细节4
  14. //default子句是可选的,当没有匹配的case时,执行default
  15. //如果没有default 子句,有没有匹配任何常量,则没有输出
  16. //
  17. //细节5
  18. //break语句用来在执行完一个case分支后使程序跳出switch语句块;
  19. //如果没有写break,程序会顺序执行到switch结尾,除非执行到break
  20. char c = 'b';
  21. char c2 = 'c';
  22. switch(c) {
  23. case 'a' : // case 20 不会报错 char 于int之间可以相互转换
  24. System.out.println("ok1");
  25. break;
  26. case 'b' : //如果这里写 case 'hello' 编译会报错 char>string报错
  27. System.out.println("ok2");
  28. break;
  29. case c2 : //报错 这里不允许是变量名字
  30. System.out.println("ok2");
  31. break;
  32. default :
  33. System.out.println("ok3");
  34. }
  35. System.out.println("退出了switch,继续执行..");
  36. }
  37. }
  1. import java.util.Scanner;
  2. public class SwitchExercise {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. //使用 switch 把小写类型的
  6. //char型转为大写(键盘输入)。只转换 a->A, b->B, c, d, e.
  7. //其它的输出 "other"。
  8. //创建Scanner对象
  9. Scanner myScanner = new Scanner(System.in);
  10. System.out.println("请输入a-e");
  11. char c1 = myScanner.next().charAt(0);
  12. switch(c1) {
  13. case 'a' :
  14. System.out.println("A");
  15. break;
  16. case 'b' :
  17. System.out.println("B");
  18. break;
  19. case 'c' :
  20. System.out.println("C");
  21. break;
  22. case 'd' :
  23. System.out.println("D");
  24. break;
  25. case 'e' :
  26. System.out.println("E");
  27. break;
  28. default :
  29. System.out.println("你的输入有误~");
  30. }
  31. }
  32. }
  1. public class SwitchExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //对学生成绩大于60分的,输出"合格"。低于60分的,
  5. //输出"不合格"。(注:输入的成绩不能大于100), 提示 成绩/60
  6. //思路分析
  7. // 结果只有两种 一个是合格 一个是不合格 所以需要把用户输入转换
  8. // 整型相除 没有余数和小数
  9. // 如果成绩在 [60,100] , (int)(成绩/60) = 1
  10. // 如果成绩在 [0,60) , (int)(成绩/60) = 0
  11. //代码实现
  12. double score = 1.1;
  13. //使用if-else 保证输入的成绩有有效的 0-100
  14. //看了当老师的分析和代码演示后,自己一定要独立完成(不看老韩代码,也能写)
  15. if( score >= 0 && score <= 100) {
  16. switch ((int)(score / 60)) {
  17. case 0 :
  18. System.out.println("不合格");
  19. break;
  20. case 1 :
  21. System.out.println("合格");
  22. break;
  23. // default :
  24. // System.out.println("输入有误");
  25. }
  26. } else {
  27. System.out.println("输入的成绩在0-100");
  28. }
  29. }
  30. }
  31. }
  1. import java.util.Scanner;
  2. public class SwitchExercise {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. //根据用于指定月份,
  6. //打印该月份所属的季节。
  7. //3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
  8. //[课堂练习, 提示 使用穿透 ]
  9. //
  10. //思路分析
  11. //1. 创建Scanner对象, 接收用户输入
  12. //2. 使用 int month 接收
  13. //3. 使用switch 来匹配 ,使用穿透来完成,比较简洁
  14. //4. 因为 3 4 5月是一个结果 所以3 4 5可以穿透 其它季节也是一样
  15. Scanner myScanner = new Scanner(System.in);
  16. System.out.println("输入月份");
  17. int month = myScanner.nextInt();
  18. switch(month) {
  19. case 3:
  20. case 4:
  21. case 5:
  22. System.out.println("这是春季");
  23. break;
  24. case 6:
  25. case 7:
  26. case 8:
  27. System.out.println("这是夏季");
  28. break;
  29. case 9:
  30. case 10:
  31. case 11:
  32. System.out.println("这是秋季");
  33. break;
  34. case 1:
  35. case 2:
  36. case 12:
  37. System.out.println("这是冬季");
  38. break;
  39. default :
  40. System.out.println("你输入的月份不对(1-12)");
  41. }
  42. }
  43. }

switch和if的使用场景

1) 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。
2) 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广

for 循环控制

让你的代码可以循环的执行
举例
打印 10 句 “你好,韩顺平教育!”。
没有循环的方法
System.out.println(“你好,韩顺平教育!”);
System.out.println(“你好,韩顺平教育!”);

写十行

缺点

  1. 代码很冗余 重复的代码大量出现
  2. 修改很麻烦,如果要输出1000行,再改为500行,在改10000行,修改工作量会很大。 ```java

public class For01 {

  1. //编写一个main方法
  2. public static void main(String[] args) {
  3. //打印10句 "你好,韩顺平教育!"
  4. //传统的方法
  5. // System.out.println("你好,韩顺平教育");
  6. // System.out.println("你好,韩顺平教育");
  7. // System.out.println("你好,韩顺平教育");
  8. // System.out.println("你好,韩顺平教育");
  9. // System.out.println("你好,韩顺平教育");
  10. // System.out.println("你好,韩顺平教育");
  11. // System.out.println("你好,韩顺平教育");
  12. // System.out.println("你好,韩顺平教育");
  13. // System.out.println("你好,韩顺平教育");
  14. // System.out.println("你好,韩顺平教育");
  15. //
  16. // 使用for循环控制
  17. for( int i = 1; i <= 10; i++) { // 1(int i = 1; 变量初始化)2( i <= 10; 循环条件) 4(i++ 循环变量迭代)
  18. System.out.println("你好,韩顺平教育" + i); //3(System.out.println("你好,韩顺平教育" + i); 循环操作)
  19. }
  20. }

}

  1. 1. for 关键字,表示循环控制
  2. 1. for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
  3. 1. 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码
  4. 1. 如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略
  5. <br />
  6. <a name="OudMq"></a>
  7. ### for循环细节
  8. 1) 循环条件是返回一个布尔值的表达式<br />2) for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
  9. 3) 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。<br />4) 使用内存分析法,老师分析输出下面代码输出什么?
  10. 1
  11. ```java
  12. //演示for的使用细节
  13. public class ForDetail {
  14. //编写一个main方法
  15. public static void main(String[] args) {
  16. //for(;循环判断条件;)
  17. //中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略
  18. // 使用for循环控制
  19. int i = 1; //循环变量初始化 可以写到全局 一般用于迭代的对象需要在全局使用这样的情况。
  20. for( ; i <= 10 ; ) {
  21. System.out.println("hello,韩顺平教育" + i);
  22. i++; //循环变量迭代 可以写到这里
  23. }
  24. System.out.println("i=" + i);//11 ok
  25. // int j = 1;
  26. // //补充
  27. // for(;;) { //表示一个无限循环,死循环
  28. // System.out.println("ok~" + (j++));
  29. // }
  30. }
  31. }
  1. //演示for的使用细节
  2. public class ForDetail {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. //循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,
  6. //循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
  7. // 分析代码输出什么
  8. int count = 3;
  9. for (int i = 0,j = 0; i < count; i++, j += 2) {
  10. System.out.println("i=" + i + " j=" + j);
  11. }
  12. }
  13. }

编程思想解析
1. 化繁为简 : 即将复杂的需求,拆解成简单的需求,逐步完成
2. 先死后活 : 先考虑固定的值,然后转成可以灵活变化的值

举例
打印1~100之间所有是9的倍数的整数,统计个数 及 总和
思路过程

化繁为简

(1) 先完成 输出 1-100的值

  1. public class ForExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //(1) 完成 输出 1-100的值
  5. for(int i = 1; i <= 100; i++) {
  6. System.out.println("i=" + i);
  7. }
  8. }
  9. }

(2) 对输出结果,进行过滤,只输出9的倍数 i % 9 ==0

  1. public class ForExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //(1) 完成 输出 1-100的值
  5. for(int i = 1; i <= 100; i++) {
  6. if (i % 9 == 0){
  7. System.out.println("i=" + i);
  8. }
  9. }
  10. }
  11. }

(3) 统计个数 定义一个变量 int count = 0; 当 条件满足时 count++;

  1. public class fordetail {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //(1) 完成 输出 1-100的值
  5. int count = 0;
  6. for(int i = 1; i <= 100; i++) {
  7. if (i % 9 == 0){
  8. System.out.println("i=" + i);
  9. count++;
  10. }
  11. }
  12. System.out.println("count=" + count);
  13. }
  14. }

4)总和 , 定义一个变量 int sum = 0; 当条件满足时累积 sum += i;

  1. public class ForExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //(1) 完成 输出 1-100的值
  5. int count = 0;
  6. int sum = 0;
  7. for(int i = 1; i <= 100; i++) {
  8. if (i % 9 == 0){
  9. System.out.println("i=" + i);
  10. count++;
  11. sum +=i;
  12. }
  13. }
  14. System.out.println("count=" + count);
  15. System.out.println("sum=" + sum);
  16. }
  17. }

先死后活

(1) 为了适应更好的需求,把范围的开始的值和结束的值,做出变量

  1. public class ForExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //(1) 完成 输出 1-100的值
  5. int count = 0;
  6. int sum = 0;
  7. int start = 10; //增加开始结束变量
  8. int end = 500;
  9. for(int i = start; i <= end; i++) { //修改表达式中的开始 从固定值改为变量
  10. if (i % 9 == 0){
  11. System.out.println("i=" + i);
  12. count++;
  13. sum +=i;
  14. }
  15. }
  16. System.out.println("count=" + count);
  17. System.out.println("sum=" + sum);
  18. }
  19. }

(2) 还可以更进一步 9 倍数也做成变量 int t = 9;

  1. public class ForExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //打印1~100之间所有是9的倍数的整数,统计个数 及 总和.[化繁为简,先死后活]
  5. //老韩的两个编程思想(技巧)
  6. //1. 化繁为简 : 即将复杂的需求,拆解成简单的需求,逐步完成
  7. //2. 先死后活 : 先考虑固定的值,然后转成可以灵活变化的值
  8. //
  9. //思路分析
  10. //打印1~100之间所有是9的倍数的整数,统计个数 及 总和
  11. //化繁为简
  12. //(1) 完成 输出 1-100的值
  13. //(2) 在输出的过程中,进行过滤,只输出9的倍数 i % 9 ==0
  14. //(3) 统计个数 定义一个变量 int count = 0; 当 条件满足时 count++;
  15. //(4) 总和 , 定义一个变量 int sum = 0; 当条件满足时累积 sum += i;
  16. //先死后活
  17. //(1) 为了适应更好的需求,把范围的开始的值和结束的值,做出变量
  18. //(2) 还可以更进一步 9 倍数也做成变量 int t = 9;
  19. int count = 0; //统计9的倍数个数 变量
  20. int sum = 0; //总和
  21. int start = 10;
  22. int end = 200;
  23. int t = 5; // 倍数
  24. for(int i = start; i <= end; i++) {
  25. if( i % t == 0) { //把这里的固定值改为变量值
  26. System.out.println("i=" + i);
  27. count++;
  28. sum += i;//累积
  29. }
  30. }
  31. System.out.println("count=" + count);
  32. System.out.println("sum=" + sum);
  33. }
  34. }

完成下面的表达式输出
image.png
化繁为简
先输出0-5

  1. public class ForExercise02{
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //化繁为简
  5. for( int i = 0; i <= 5; i++) {
  6. System.out.println(i );
  7. }
  8. }
  9. }

根据图片 i + (5-i) = 5 前面的计算公式可以写成

  1. public class ForExercise02 {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //化繁为简
  5. for( int i = 0; i <= 5; i++) {
  6. System.out.println(i + "+" + (5-i) + "=" + 5);
  7. }
  8. }
  9. }

由死变活 把固定值改为变量

  1. public class ForExercise02 {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //化繁为简
  5. //先死后活
  6. int n = 9;
  7. for( int i = 0; i <= n; i++) {
  8. System.out.println(i + "+" + (n-i) + "=" + n);
  9. }
  10. }
  11. }

while循环

image.png

image.png

  1. //while循环的案例
  2. //
  3. public class While01 {
  4. //编写一个main方法
  5. public static void main(String[] args) {
  6. //输出10句 你好,韩顺平教育
  7. int i = 1; //循环变量初始化
  8. while( i <= 10 ) {//循环条件
  9. System.out.println("你好,韩顺平教育" + i);//执行语句
  10. i++;//循环变量迭代
  11. }
  12. System.out.println("退出while ,继续.." + i); // 11
  13. }
  14. }
  1. public class WhileExercise {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. // 打印1―100之间所有能被3整除的数 [使用while, 老师评讲 ]
  5. // 化繁为简, 先死后活
  6. int i = 1;
  7. int endNum = 100;
  8. while( i <= endNum) {
  9. if( i % 3 == 0) {
  10. System.out.println("i=" + i);
  11. }
  12. i++;//变量自增 自增是while循环自增 所以写在外面。
  13. }
  14. // 打印40―200之间所有的偶数 [使用while, 课后练习]
  15. // 化繁为简, 先死后活(利于思考)
  16. //
  17. System.out.println("========");
  18. int j = 40; //变量初始化
  19. while ( j <= 200) {
  20. //判断
  21. if( j % 2 == 0) {
  22. System.out.println("j=" + j);
  23. }
  24. j++;//循环变量的迭代
  25. }
  26. }
  27. }

do..while循坏控制

循环变量初始化; do{
循环体(语句);循环变量迭代;
}while(循环条件);
image.png
do while至少先执行一次。

image.png

  1. public class DoWhile01 {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //输出10句 你好,韩顺平教育
  5. int i = 1; //循环变量初始化
  6. do {
  7. //循环执行语句
  8. System.out.println("你好,韩顺平教育" + i);
  9. //循环变量迭代
  10. i++;
  11. }while(i <= 10);
  12. System.out.println("退出 do..while 继续执行.." + i);//11
  13. }
  14. }
  1. public class DoWhileExercise01 {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. //统计1---200之间能被5整除但不能被3整除的 个数
  5. //化繁为简
  6. //(1) 使用do-while输出 1-200
  7. //(2) 过滤 能被5整除但不能被3整除的数 %
  8. //(3) 统计满足条件的个数 int count = 0;
  9. //先死后活
  10. //(1) 范围的值 1-200 你可以做出变量
  11. //(2) 能被5整除但不能被3整除的 , 5 和 3 可以改成变量
  12. int i = 1;
  13. int count = 0; //统计满足条件的个数
  14. do {
  15. if( i % 5 == 0 && i % 3 != 0 ) {
  16. System.out.println("i=" + i);
  17. count++;
  18. }
  19. i++;
  20. }while(i <= 200);
  21. System.out.println("count=" + count);
  22. }
  23. }
  1. import java.util.Scanner;
  2. public class DoWhileExercise02 {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. //如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为
  6. //[System.out.println("老韩问:还钱吗?y/n")] do...while ..
  7. //
  8. //化繁为简
  9. //(1) 不停的问还钱吗?
  10. //(2) 使用char answer 接收回答, 定义一个Scanner对象
  11. //(3) 在do-while 的while 判断如果是 y 就不在循环
  12. //一定自己动脑筋..
  13. Scanner myScanner = new Scanner(System.in);
  14. char answer = ' ';
  15. do {
  16. System.out.println("老韩使出五连鞭~");
  17. System.out.println("老韩问:还钱吗?y/n");
  18. answer = myScanner.next().charAt(0);
  19. System.out.println("他的回答是" + answer);
  20. }while(answer != 'y');//判断条件很关键 这个的判断条件是必须是布尔值类型 true false 这里是继续循环需要满足的条件
  21. System.out.println("李三还钱了");
  22. }
  23. }

多重循环控制 难点

1) 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】

2)实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环[听不懂,走案例]。

设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次
image.png

image.png

  1. public class MulFor {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. for(int i = 0; i < 2; i++) { //先思考
  5. for( int j = 0; j < 3; j++) {
  6. System.out.println("i=" + i + "j=" + j);
  7. }
  8. }
  9. }
  10. }
  1. import java.util.Scanner;
  2. public class MulForExercise01 {
  3. //编写一个main方法
  4. public static void main(String[] args) {
  5. //统计3个班成绩情况,每个班有5名同学,
  6. //求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
  7. //统计三个班及格人数,每个班有5名同学。
  8. //
  9. //思路分析:
  10. //化繁为简
  11. //(1) 先计算一个班 , 5个学生的成绩和平均分 , 使用for
  12. //1.1 创建 Scanner 对象然后,接收用户输入
  13. //1.2 得到该班级的平均分 , 定义一个 doubel sum 把该班级5个学生的成绩累积
  14. //(2) 统计3个班(每个班5个学生) 平均分
  15. //(3) 所有班级的平均分
  16. //3.1 定义一个变量,double totalScore 累积所有学生的成绩
  17. //3.2 当多重循环结束后,totalScore / (3 * 5)
  18. //(4) 统计三个班及格人数
  19. //4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
  20. //4.2 如果 >= 60 passNum++
  21. //(5) 可以优化[效率,可读性, 结构]
  22. //创建 Scanner 对象
  23. Scanner myScanner = new Scanner(System.in);
  24. double totalScore = 0; //累积所有学生的成绩
  25. int passNum = 0;//累积 及格人数
  26. int classNum = 3; //班级个数
  27. int stuNum = 5;//学生个数
  28. for( int i = 1; i <= classNum; i++) {//i 表示班级
  29. double sum = 0; //一个班级的总分
  30. for( int j = 1; j <= stuNum; j++) {//j 表示学生
  31. System.out.println("请数第"+i+"个班的第"+j+"个学生的成绩");
  32. double score = myScanner.nextDouble();
  33. //当有一个学生成绩>=60, passNum++
  34. if(score >= 60) {
  35. passNum++;
  36. }
  37. sum += score; //累积
  38. System.out.println("成绩为" + score);
  39. }
  40. //因为sum 是 5个学生的总成绩
  41. System.out.println("sum=" + sum + " 平均分=" + (sum / stuNum));
  42. //把 sum 累积到 totalScore
  43. totalScore += sum;
  44. }
  45. System.out.println("三个班总分="+ totalScore
  46. + " 平均分=" + totalScore / (classNum*stuNum));
  47. System.out.println("及格人数=" + passNum);
  48. }
  49. }

image.png

  1. public class fordetail {
  2. public static void main(String[] args) {
  3. for (int m=1;m<=9;m++){
  4. for(int i=1;i<=m;i++){
  5. int a=i*m;
  6. System.out.print(i+"*"+m+"="+a+"\t");
  7. }
  8. System.out.println();
  9. }
  10. }
  11. }

打印空心金字塔

化繁为简 分解步骤

  1. 先打印五行* ```java public class fordetail { public static void main(String[] args) {

    1. for(int i = 1; i <=5; i++){
    2. System.out.println("*****"); //println会自动换行
    3. }

    } }

  1. 2. 打印半个金字塔<br />分解过程<br /> * //第1层 有 1个*<br /> ** //第2层 有 2个*<br /> *** //第3层 有 3个*<br /> **** //第4层 有 4个*<br /> ***** //第5层 有 5个*
  2. ```java
  3. public class fordetail {
  4. public static void main(String[] args) {
  5. for(int i = 1; i <=5; i++){
  6. //内循环控制打印*的个数
  7. for (int j=1; j<=i;j++){
  8. System.out.print("*");
  9. }//每打印完一个内循环就换行
  10. System.out.println("");
  11. }
  12. }
  13. }
  1. 3. 打印整个金字塔<br />分解过程<br /> * //第1层 有 1个* 2 * 1 -1 有4=(总层数-1)个空格 <br /> *** //第2层 有 3个* 2 * 2 -1 有3=(总层数-2)个空格<br /> ***** //第3层 有 5个* 2 * 3 -1 有2=(总层数-3)个空格<br /> ******* //第4层 有 7个* 2 * 4 -1 有1=(总层数-4)个空格<br />********* //第5层 有 9个* 2 * 5 -1 有0=(总层数-5)个空格<br />不计算空格的编码
  1. public class fordetail {
  2. public static void main(String[] args) {
  3. for(int i = 1; i <=5; i++){
  4. //内循环控制打印*的个数
  5. for (int j=1; j<=2*i-1;j++){ // 2 * 层数 -1
  6. System.out.print("*");
  7. }//每打印完一个内循环就换行
  8. System.out.println("");
  9. }
  10. }
  11. }

加上空格 输出实心三角形

  1. public class fordetail {
  2. public static void main(String[] args) {
  3. for(int i = 1; i <=5; i++){
  4. for (int k =1; k<= 5-i;k++){ // (总层数-1)个空格
  5. System.out.print(" ");
  6. }
  7. //内循环控制打印*的个数
  8. for (int j=1; j<=2*i-1;j++){
  9. System.out.print("*");
  10. }//每打印完一个内循环就换行
  11. System.out.println("");
  12. }
  13. }
  14. }
  1. 4. 打印空心的金字塔 [最难的]<br /> * //第1层 有 1个* 当前行的第一个位置是*,最后一个位置也是*<br /> * * //第2层 有 2个* 当前行的第一个位置是*,最后一个位置也是*<br /> * * //第3层 有 2个* 当前行的第一个位置是*,最后一个位置也是*<br /> * * //第4层 有 2个* 当前行的第一个位置是*,最后一个位置也是*<br />********* //第5层 有 9个* 全部输出*
  1. public class fordetail {
  2. public static void main(String[] args) {
  3. for(int i = 1; i <=5; i++){
  4. for (int k =1; k<= 5-i;k++){
  5. System.out.print(" ");
  6. }
  7. //内循环控制打印*的个数
  8. for (int j=1; j<=2*i-1;j++){
  9. if (j == 1 || j == 2*i-1 || i == 5){ // 通过一个for循环判断是第1个 最后一个 和总数为5输出*
  10. System.out.print("*");
  11. }else{
  12. System.out.print(" "); //其余情况输出空格填充
  13. }
  14. }//每打印完一个内循环就换行
  15. System.out.println("");
  16. }
  17. }
  18. }

5先死后活 把固定值改为变量

  1. public class Stars {
  2. //编写一个main方法
  3. public static void main(String[] args) {
  4. /*
  5. 先死后活
  6. 5 层数做成变量 int totalLevel = 5;
  7. */
  8. int totalLevel = 20; //层数
  9. for(int i = 1; i <= totalLevel; i++) { //i 表示层数
  10. //在输出*之前,还有输出 对应空格 = 总层数-当前层
  11. for(int k = 1; k <= totalLevel - i; k++ ) {
  12. System.out.print(" ");
  13. }
  14. //控制打印每层的*个数
  15. for(int j = 1;j <= 2 * i - 1;j++) {
  16. //当前行的第一个位置是*,最后一个位置也是*, 最后一层全部 *
  17. if(j == 1 || j == 2 * i - 1 || i == totalLevel) {
  18. System.out.print("*");
  19. } else { //其他情况输出空格
  20. System.out.print(" ");
  21. }
  22. }
  23. //每打印完一层的*后,就换行 println本身会换行
  24. System.out.println("");
  25. }
  26. }
  27. }