1 顺序结构

image.png

2 分支结构

2.1 if-else

2.1.1 if-else三种格式

image.png
image.png

2.1.2 if-else使用说明

image.png
image.png

  1. // 上面的练习进阶版:
  2. int x = 4;
  3. int y = 1;
  4. if (x > 2)
  5. if (y > 2)
  6. System.out.println(x + y);
  7. else //就近原则
  8. System.out.println("x is " + x); // 输出4
  9. //课后练习:测算狗的年龄
  10. int dogAge = 6;
  11. if(dogAge >= 0 && dogAge <= 2){
  12. System.out.println("相当于人的年龄:" + dogAge * 10.5);
  13. }else if( dogAge > 2){
  14. System.out.println("相当于人的年龄:" + (2 * 10.5 + (dogAge - 2) * 4));
  15. }else{
  16. System.out.println("狗狗还没出生呢!");
  17. }
  18. //课后练习:如何获取一个随机数:10 - 99
  19. int value = (int)(Math.random() * 90 + 10);
  20. // [0.0,1.0) --> [0.0,90.0) --->[10.0, 100.0) -->[10,99]
  21. System.out.println(value);
  22. //公式:[a,b] : (int)(Math.random() * (b - a + 1) )+ a

2.2 switch-case

2.2.1 switch-case格式

image.png

2.2.2 switch-case使用说明

image.png

  1. //**************如下的两种情况都编译不通过*********************
  2. //情况一:switch表达式不能是布尔值
  3. /*
  4. boolean isHandsome = true;
  5. switch(isHandsome){
  6. case true:
  7. System.out.println("我好帅啊~~~");
  8. break;
  9. case false:
  10. System.out.println("我好丑啊~~~");
  11. break;
  12. default:
  13. System.out.println("输入有误~~~");
  14. }
  15. */
  16. //情况二:case子句必须是常量
  17. /*
  18. int age = 10;
  19. switch(age){
  20. case age > 18:
  21. System.out.println("成年了");
  22. break;
  23. default:
  24. System.out.println("未成年");
  25. }
  26. */

2.2.3 switch-case与if-else对比

image.png

  1. /*
  2. 练习题:
  3. 从键盘分别输入年、月、日,判断这一天是当年的第几天
  4. 注:判断一年是否是闰年的标准:
  5. 1)可以被4整除,但不可被100整除
  6. 2)可以被400整除
  7. 说明:
  8. 1. 凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
  9. 2. 我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多),
  10. 又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。
  11. */
  12. import java.util.Scanner;
  13. class SwitchCaseExer {
  14. public static void main(String[] args) {
  15. Scanner scan = new Scanner(System.in);
  16. System.out.println("请输入year:");
  17. int year = scan.nextInt();
  18. System.out.println("请输入month:");
  19. int month = scan.nextInt();
  20. System.out.println("请输入day:");
  21. int day = scan.nextInt();
  22. //定义一个变量来保存总天数
  23. int sumDays = 0;
  24. switch(month){
  25. case 12:
  26. sumDays += 30;
  27. case 11:
  28. sumDays += 31;
  29. case 10:
  30. sumDays += 30;
  31. case 9:
  32. sumDays += 31;
  33. case 8:
  34. sumDays += 31;
  35. case 7:
  36. sumDays += 30;
  37. case 6:
  38. sumDays += 31;
  39. case 5:
  40. sumDays += 30;
  41. case 4:
  42. sumDays += 31;
  43. case 3:
  44. //判断year是否是闰年
  45. if((year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0){
  46. sumDays += 29;
  47. }else{
  48. sumDays += 28;
  49. }
  50. case 2:
  51. sumDays += 31;
  52. case 1:
  53. sumDays += day;
  54. }
  55. System.out.println(year + "年" + month + "月" + day + "日是当年的第" + sumDays + "天");
  56. }
  57. }
  58. /*
  59. 例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
  60. 说明:如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
  61. */
  62. class SwitchCaseTest1 {
  63. public static void main(String[] args) {
  64. int score = 78;
  65. switch(score / 10){
  66. case 0:
  67. case 1:
  68. case 2:
  69. case 3:
  70. case 4:
  71. case 5:
  72. System.out.println("不及格");
  73. break;
  74. case 6:
  75. case 7:
  76. case 8:
  77. case 9:
  78. case 10:
  79. System.out.println("及格");
  80. break;
  81. }
  82. //更优的解决方案:
  83. switch(score / 60){
  84. case 0:
  85. System.out.println("不及格");
  86. break;
  87. case 1:
  88. System.out.println("及格");
  89. break;
  90. }
  91. }
  92. }

3 循环结构

image.png

3.1 for循环

image.png

image.png

  1. //练习:
  2. int num = 1;
  3. for(System.out.print('a');num <= 3;System.out.print('c'),num++){
  4. System.out.print('b');
  5. }
  6. //输出结果:abcbcbc
  7. /*
  8. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
  9. 比如: 12和20的最大公约数是4,最小公倍数是60。
  10. 说明: break关键字的使用。
  11. */
  12. import java.util.Scanner;
  13. public class Test{
  14. public static void main(String[] args){
  15. Scanner scan = new Scanner(System.in);
  16. System.out.println("请输入第一个整数:");
  17. int num1 = scan.nextInt();
  18. System.out.println("请输入第二个整数:");
  19. int num2 = scan.nextInt();
  20. // 求最大公约数
  21. int min = (num1 <= num2)? num1 : num2;
  22. for(int i = min; i >= 1; i--){
  23. if(num1 % i == 0 && num2 % i == 0){
  24. System.out.println("最大公约数是:" + i);
  25. break;
  26. }
  27. }
  28. // 求最小公倍数
  29. int max = (num1 >= num2)? num1 : num2;
  30. for (int i = max; i <= num1*num2; i++){
  31. if(i % num1 == 0 && i % num2 == 0){
  32. System.out.println("最小公倍数为:" + i);
  33. break;
  34. }
  35. }
  36. }
  37. }

3.2 while循环

image.png

  1. class WhileTest{
  2. public static void main(String[] args) {
  3. //遍历100以内的所有偶数
  4. int i = 1;
  5. while(i <= 100){
  6. if(i % 2 == 0){
  7. System.out.println(i);
  8. }
  9. i++;
  10. }
  11. //出了while循环以后,仍可以调用。
  12. System.out.println(i);//101
  13. }
  14. }

3.3 do-while循环

image.png

  1. //遍历100以内的偶数,并计算所有偶数的和及偶数的个数
  2. int num = 1;
  3. int sum = 0;//记录总和
  4. int count = 0;//记录个数
  5. do{
  6. if(num % 2 == 0){
  7. System.out.println(num);
  8. sum += num;
  9. count++;
  10. }
  11. num++;
  12. }while(num <= 100);
  13. System.out.println("总和为:" + sum);
  14. System.out.println("个数为:" + count);
  15. //*************体会do-while至少执行一次循环体***************
  16. int number1 = 10;
  17. while(number1 > 10){
  18. System.out.println("hello:while");//不会输出
  19. number1--;
  20. }
  21. int number2 = 10;
  22. do{
  23. System.out.println("hello:do-while");//会输出
  24. number2--;
  25. }while(number2 > 10);

3.4 循环其他知识点

3.4.1 无限循环

不在循环条件部分限制次数的结构:for(;;) while(true)

结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break

  1. /*
  2. 题目:
  3. 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,
  4. 输入为0时结束程序。
  5. */
  6. import java.util.Scanner;
  7. class ForWhileTest {
  8. public static void main(String[] args) {
  9. Scanner scan = new Scanner(System.in);
  10. int positiveNumber = 0;//记录正数的个数
  11. int negativeNumber = 0;//记录负数的个数
  12. for(;;){//while(true){
  13. int number = scan.nextInt();
  14. //判断number的正负情况
  15. if(number > 0){
  16. positiveNumber++;
  17. }else if(number < 0){
  18. negativeNumber++;
  19. }else{
  20. //一旦执行break,跳出循环
  21. break;
  22. }
  23. }
  24. System.out.println("输入的正数个数为:" + positiveNumber);
  25. System.out.println("输入的负数个数为:" + negativeNumber);
  26. }
  27. }

3.4.2 循环嵌套

image.png

嵌套循环的使用:

  1. 嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
  • 外层循环:循环结构B
  • 内层循环:循环结构A
  1. 说明 ① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
  2. 技巧:外层循环控制行数内层循环控制列数

练习一:九九乘法表

  1. public class Hello {
  2. public static void main(String[] args) {
  3. for (int row = 1; row <= 9; row++) {
  4. for (int col = 1; col <= row; col++) {
  5. System.out.print(row + " * " + col + " = " + (row*col) + " ");
  6. }
  7. System.out.println();
  8. }
  9. }
  10. }

练习二:求100以内的质数

(第一版)【思路】
100个小人排队进景点,从前门进,先穿上一个黄马甲,然后进审核区,
裁判经过一些过程评定小人是不是质数,若最终判定小人不是质数就在黄马甲上打一个叉,
然后来到后门,若马甲是干净的就从后门进入景点,若马甲脏了,就不能进入景点,而且把马甲洗干净送回到前门给下一个小人穿上,然后下一个小人继续。。。。

  1. class PrimeNumberTest {
  2. public static void main(String[] args) {
  3. boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值
  4. for(int i = 2; i <= 100; i++){ // 遍历100以内的自然数
  5. for(int j = 2; j < i; j++){ // j:被i去除
  6. if(i % j == 0){ // i被j除尽
  7. isFlag = false;
  8. }
  9. }
  10. if(isFlag == true){
  11. System.out.println(i);
  12. }
  13. // 重置isFlag
  14. isFlag = true;
  15. }
  16. }
  17. }

(第二版)【思路优化】
整体流程不变,主要是审核区的裁判,判定小人是不是质数的时间变快了

  1. class PrimeNumberTest1 {
  2. public static void main(String[] args) {
  3. boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
  4. int count = 0;//记录质数的个数
  5. for(int i = 2;i <= 100;i++){//遍历100以内的自然数
  6. //优化二:对本身是质数的自然数是有效的。
  7. //for(int j = 2;j < i;j++){
  8. for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
  9. if(i % j == 0){ //i被j除尽
  10. isFlag = false;
  11. break;//优化一:只对本身非质数的自然数是有效的。
  12. }
  13. }
  14. if(isFlag == true){
  15. //System.out.println(i);
  16. count++;
  17. }
  18. //重置isFlag
  19. isFlag = true;
  20. }
  21. System.out.println("质数的个数为:" + count);
  22. }
  23. }

(第三版)【思路优化】
小人不用再穿马甲了,每个小人排队从前门进入审核区,如果裁判认定小人不是质数,小人当场就消失了,
下一个小人补入继续判断,只有判定是质数的小人才能从后门进入景点。

  1. class PrimeNumberTest2 {
  2. public static void main(String[] args) {
  3. int count = 0;//记录质数的个数
  4. label:for(int i = 2;i <= 100;i++){//遍历100以内的自然数
  5. for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
  6. if(i % j == 0){ //i被j除尽
  7. continue label;
  8. }
  9. }
  10. //能执行到此步骤的,都是质数
  11. count++;
  12. }
  13. System.out.println("质数的个数为:" + count);
  14. }
  15. }


3.4.3 关键字(break、continue、return)

image.png

image.png
image.png

break 与 continue 的比较:
image.png

  1. class BreakContinueTest {
  2. public static void main(String[] args) {
  3. for(int i = 1;i <= 10;i++){
  4. if(i % 4 == 0){
  5. break;//123
  6. //continue;//123567910
  7. //System.out.println("今晚迪丽热巴要约我!!!"); // 会报错
  8. }
  9. System.out.print(i);
  10. }
  11. //******************************
  12. label:for(int i = 1;i <= 4;i++){
  13. for(int j = 1;j <= 10;j++){
  14. if(j % 4 == 0){
  15. //break;//默认跳出包裹此关键字最近的一层循环。
  16. //continue;
  17. //break label;//结束指定标识的一层循环结构
  18. continue label;//结束指定标识的一层循环结构当次循环
  19. }
  20. System.out.print(j);
  21. }
  22. System.out.println();
  23. }
  24. }
  25. }