程序逻辑控制

旧城等待, 2024-04-01 12:29 130阅读 0赞

目录

  1. 顺序结构

  2. 分支结构

2.1 if 语句

2.2 switch 语句

  1. 循环结构

3.1 while 循环

3.2 break

3.3 continue

3.4 for 循环

3.5 do while 循环

  1. 输入输出

4.1 输出到控制台

4.2 从键盘输入

  1. 猜数字游戏

1. 顺序结构

顺序结构比较简单,按照代码书写的顺序一行一行执行。

  1. System.out.println("aaa");
  2. System.out.println("bbb");
  3. System.out.println("ccc");
  4. // 运行结果
  5. aaa
  6. bbb
  7. ccc

如果调整代码的书写顺序, 则执行顺序也发生变化

  1. System.out.println("aaa");
  2. System.out.println("ccc");
  3. System.out.println("bbb");
  4. // 运行结果
  5. aaa
  6. ccc
  7. bbb

2. 分支结构

2.1 if 语句

  1. 语法格式1

如果布尔表达式结果为true,执行if中的语句,否则不执行。

  1. if(布尔表达式){
  2. // 语句
  3. }
  1. 语法格式2

如果布尔表达式结果为true,则执行if中语句,否则执行else中语句。

  1. if(布尔表达式){
  2. // 语句1
  3. }else{
  4. // 语句2
  5. }
  6. public static void main(String[] args) {
  7. int a=10;
  8. if(a==10)
  9. {
  10. System.out.println("a==10");
  11. }
  12. else
  13. System.out.println("a!=10");
  14. }
  1. 语法格式3

表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3

  1. if(布尔表达式1){
  2. // 语句1
  3. }else if(布尔表达式2){
  4. // 语句2
  5. }else{
  6. // 语句3
  7. }

比如:成绩

  1. if(score >= 90){
  2. System.out.println("优秀");
  3. }else if(score >= 80 && score < 90){
  4. System.out.println("良好");
  5. }else if(score >= 70 && score < 80){
  6. System.out.println("中等");
  7. }else if(score >= 60 && score < 70){
  8. System.out.println("及格");
  9. }else if(score >= 0 && score < 60){
  10. System.out.println("不及格");
  11. }else{
  12. System.out.println("错误数据");
  13. }

【练习】

  1. 判断一个数字是奇数还是偶数

    public static void main(String[] args) {

    1. int num=10;
    2. if(num%2==0){
    3. System.out.println("偶数");
    4. }else{
    5. System.out.println("奇数");
    6. }

    }

  2. 判断一个数字是正数,负数,还是零

    public static void main(String[] args) {

    1. int num=10;
    2. if(num>0){
    3. System.out.println("正数! ");
    4. }else if(num<0){
    5. System.out.println("负数! ");
    6. }else{
    7. System.out.println("0 ");
    8. }

    }

  3. 判断一个年份是否为闰年

    public static void main(String[] args) {

    1. int year=2022;
    2. if(year % 100 ==0){
    3. if(year % 400==0){
    4. System.out.println(year+"是闰年!");
    5. }else{
    6. System.out.println(year+"不是闰年!");
    7. }
    8. }else{
    9. if(year%4==0){
    10. System.out.println(year+"是闰年!");
    11. }
    12. else{
    13. System.out.println(year+"不是闰年!");
    14. }
    15. }

    }

化简

  1. public static void main(String[] args) {
  2. int year=2022;
  3. if(year%400==0|| (year%100!=0 && year%4==0)){
  4. System.out.println(year+"是闰年");
  5. }else{
  6. System.out.println(year+"不是闰年");
  7. }
  8. }

分号问题

  1. int x = 20;
  2. if (x == 10);
  3. {
  4. System.out.println("hehe");
  5. }
  6. // 运行结果
  7. hehe

此处多写了一个 分号, 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块.

悬垂 else 问题

  1. int x = 10;
  2. int y = 10;
  3. if (x == 10)
  4. if (y == 10)
  5. System.out.println("aaa");
  6. else
  7. System.out.println("bbb");

2.2 switch 语句

基本语法

  1. switch(表达式){
  2. case 常量值1:{
  3. 语句1;
  4. [break;]
  5. }
  6. case 常量值2:{
  7. 语句2;
  8. [break;]
  9. }

执行流程:

  1. 先计算表达式的值

  2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束

  3. 当表达式的值没有与所列项匹配时,执行default

代码示例:

  1. public static void main(String[] args) {
  2. //不能做switch的参数的数据类型是什么?
  3. //long float double boolean
  4. int a=10;
  5. switch(a){
  6. case 1:
  7. System.out.println("1");
  8. break;
  9. case 2:
  10. System.out.println("2");
  11. break;
  12. default:
  13. System.out.println("输入有误");
  14. break;
  15. }
  16. }

【注意事项】

多个case后的常量值不可以重复

switch的括号内只能是以下类型的表达式:

  • 基本类型:byte、char、short、int,注意不能是long类型
  • 引用类型:String常量串、枚举类型

    double num = 1.0;
    switch(num) {

    1. case 1.0:
    2. System.out.println("hehe");
    3. break;
    4. case 2.0:
    5. System.out.println("haha");
    6. break;

    }
    // 编译出错
    Test.java:4: 错误: 不兼容的类型: 从double转换到int可能会有损失
    switch(num) {
    ^
    1 个错误

break 不要遗漏, 否则会失去 “多分支选择” 的效果

  1. int day = 1;
  2. switch(day) {
  3. case 1:
  4. System.out.println("星期一");
  5. // break;
  6. case 2:
  7. System.out.println("星期二");
  8. break;
  9. }
  10. // 运行结果
  11. 星期一
  12. 星期二

switch 不能表达复杂的条件

  1. // 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
  2. // 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
  3. if (num > 10 && num < 20) {
  4. System.out.println("hehe");
  5. }

3. 循环结构

3.1 while 循环

基本语法格式:

  1. while(循环条件){
  2. 循环语句;
  3. }

循环条件为 true, 则执行循环语句; 否则结束循环.

代码示例1: 打印 1 - 10 的数字

  1. int num = 1;
  2. while (num <= 10) {
  3. System.out.println(num);
  4. num++;
  5. }

代码示例2: 计算 1 - 100 的和

  1. int n = 1;
  2. int result = 0;
  3. while (n <= 100) {
  4. result += n;
  5. n++;
  6. }
  7. System.out.println(num);

代码示例3: 计算 5 的阶乘

  1. int n = 1;
  2. int result = 1;
  3. while (n <= 5) {
  4. result *= n;
  5. n++;
  6. }
  7. System.out.println(num);

代码示例4: 计算 1! + 2! + 3! + 4! + 5!

  1. int num = 1;
  2. int sum = 0;
  3. // 外层循环负责求阶乘的和
  4. while (num <= 5) {
  5. int factorResult = 1;
  6. int tmp = 1;
  7. // 里层循环负责完成求阶乘的细节.
  8. while (tmp <= num) {
  9. factorResult *= tmp;
  10. tmp++;
  11. }
  12. sum += factorResult;
  13. num++;
  14. }
  15. System.out.println("sum = " + sum);

当一个代码中带有多重循环的时候, 代码的复杂程度就大大提高了. 而比较复杂的代码就更容易出错.

后面我们会采用更简单的办法来解决这个问题.

注意事项

  1. 和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }

  2. 和 if 类似, while 后面的 { 建议和 while 写在同一行.

  3. 和 if 类似, while 后面不要多写 分号, 否则可能导致循环不能正确执行.

    int num = 1;
    while (num <= 10); {

    1. System.out.println(num);
    2. num++;

    }

// 执行结果

[无任何输出, 程序死循环]

此时 ; 为 while 的语句体(这是一个空语句), 实际的 { } 部分和循环无关. 此时循环条件 num <= 10 恒成立, 导致代码死循环了.

3.2 break

break 的功能是让循环提前结束.

代码示例: 找到 100 - 200 中第一个 3 的倍数

  1. int num = 100;
  2. while (num <= 200) {
  3. if (num % 3 == 0) {
  4. System.out.println("找到了 3 的倍数, 为:" + num);
  5. break;
  6. }
  7. num++;
  8. }
  9. // 执行结果
  10. 找到了 3 的倍数, 为:102

3.3 continue

continue 的功能是跳过这次循环, 立即进入下次循环.

代码示例: 找到 100 - 200 中所有 3 的倍数

  1. int num = 100;
  2. while (num <= 200) {
  3. if (num % 3 != 0) {
  4. num++; // 这里的 ++ 不要忘记! 否则会死循环.
  5. continue;
  6. }
  7. System.out.println("找到了 3 的倍数, 为:" + num);
  8. num++;
  9. }

执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句.

3.4 for 循环

【基本语法】

for(表达式①;布尔表达式②;表达式③){ 表达式④; }

  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
  • 表达式2: 循环条件,满则循环继续,否则循环结束
  • 表达式3: 循环变量更新方式(执行完循环体后执行的语句)

【执行过程】

①②④③—->②④③—->②④③—->②④③—->②④③—->②④③—->…—->②为false,循环结束。

【代码示例】

  1. 打印 1 - 10 的数字

    for (int i = 1; i <= 10; i++) {

    1. System.out.println(i);

    }

  2. 计算 1 - 100 的和

    int sum = 0;
    for (int i = 1; i <= 100; i++) {

    1. sum += i;

    }
    System.out.println(“sum = “ + sum);

  3. 计算 5 的阶乘

    int result = 1;
    for (int i = 1; i <= 5; i++) {

    1. result *= i;

    }
    System.out.println(“result = “ + result);

  4. 计算 1! + 2! + 3! + 4! + 5!

    int sum = 0;
    for (int i = 1; i <= 5; i++) {

    1. int tmp = 1;
    2. for (int j = 1; j <= i; j++) {
    3. tmp *= j;
    4. }
    5. sum += tmp;

    }
    System.out.println(“sum = “ + sum);

  5. 和 if 类似, for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }

  6. 和 if 类似, for 后面的 { 建议和 while 写在同一行.

  7. 和 if 类似, for 后面不要多写 分号, 否则可能导致循环不能正确执行.

  8. 和while循环一样,结束单趟循环用continue,结束整个循环用break

3.5 do while 循环

【基本语法】

  1. do{
  2. 循环语句;
  3. }while(循环条件);

先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束。

例如:打印 1 - 10

  1. int num = 1;
  2. do {
  3. System.out.println(num);
  4. num++;
  5. } while (num <= 10);

【注意事项】

  1. do while 循环最后的分号不要忘记

  2. 一般 do while 很少用到, 更推荐使用 for 和 while.

4. 输入输出

4.1 输出到控制台

基本语法

  1. System.out.println(msg); // 输出一个字符串, 带换行
  2. System.out.print(msg); // 输出一个字符串, 不带换行
  3. System.out.printf(format, msg); // 格式化输出

4.2 从键盘输入

使用 Scanner 读取字符串/整数/浮点数

  1. import java.util.Scanner; // 需要导入 util 包
  2. Scanner sc = new Scanner(System.in);
  3. System.out.println("请输入你的姓名:");
  4. String name = sc.nextLine();
  5. System.out.println("请输入你的年龄:");
  6. int age = sc.nextInt();
  7. System.out.println("请输入你的工资:");
  8. flfloat salary = sc.nextFloat();
  9. System.out.println("你的信息如下:");
  10. System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
  11. sc.close(); // 注意, 要记得调用关闭方法

使用 Scanner 循环读取 N 个数字,并求取其平均值

  1. Scanner sc = new Scanner(System.in);
  2. int sum = 0;
  3. int num = 0;
  4. while (sc.hasNextInt()) {
  5. int tmp = sc.nextInt();
  6. sum += tmp;
  7. num++;
  8. }
  9. System.out.println("sum = " + sum);
  10. System.out.println("avg = " + sum / num);
  11. sc.close();

注意事项: 当循环输入多个数据的时候, 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl+ d).

5. 猜数字游戏

游戏规则:

系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 “低了”, 如果输入的数字比该随机数大, 提示 “高了” , 如果输入的数字和随机数相等, 则提示 “猜对了” .

代码

  1. import java.util.Random;
  2. import java.util.Scanner;;
  3. class Test {
  4. public static void main(String[] args) {
  5. Random random = new Random(); // 默认随机种子是系统时间
  6. Scanner sc = new Scanner(System.in);
  7. int toGuess = random.nextInt(100);
  8. // System.out.println("toGuess: " + toGuess);
  9. while (true) {
  10. System.out.println("请输入要输入的数字: (1-100)");
  11. int num = sc.nextInt();
  12. if (num < toGuess) {
  13. System.out.println("低了");
  14. } else if (num > toGuess) {
  15. System.out.println("高了");
  16. } else {
  17. System.out.println("猜对了");
  18. break;
  19. }
  20. }
  21. sc.close();
  22. }
  23. }

发表评论

表情:
评论列表 (有 0 条评论,130人围观)

还没有评论,来说两句吧...

相关阅读