「Java题库」循环结构(理论+操作)

64 阅读6分钟

理论试题

一、选择题

  1. 下面哪个循环会至少执行一次循环体? A) while循环
    B) for循环
    C) do...while循环
    D) 以上都不是
    答案: C
    解析: do...while循环就像"先上车后补票",不管条件如何都会先执行一次循环体,while和for都是先看条件再决定执不执行。

  2. 这段代码会输出什么?

    int i = 5;
    while(i > 0){
        System.out.print(i + " ");
        i--;
    }
    

    A) 5 4 3 2 1
    B) 4 3 2 1 0
    C) 5 4 3 2 1 0
    D) 无限循环
    答案: A
    解析: 循环从i=5开始,每次输出i的值后减1,当i=0时条件不成立退出循环,所以不会输出0。

  3. 想要打印1到100的偶数,for循环空白处应该填什么?

    for(int i = 1; _______; i++){
        if(i % 2 == 0){
            System.out.println(i);
        }
    }
    

    A) i <= 100
    B) i < 100
    C) i >= 100
    D) i == 100
    答案: A
    解析: 要包含100这个数,所以用i<=100而不是i<100,i从1开始每次加1,通过if条件筛选出偶数。

二、填空题

  1. 下面代码输出结果是________。

    int count = 3;
    do {
        System.out.print(count * 2 + " ");
        count++;
    } while(count < 5);
    

    答案: 6 8
    解析: 第一次count=3输出6,count变成4;第二次count=4输出8,count变成5后不满足条件退出。

  2. 下面代码空白处应该填________才能输出3次"Hello"。

    for(int i = 0; ________; i++){
        System.out.println("Hello");
    }
    

    答案: i < 3
    解析: i从0开始,i=0,1,2时循环,共3次,i=3时退出。

  3. 下面while循环等价于for循环:________。

    int j = 10;
    while(j > 0){
        System.out.println(j);
        j -= 2;
    }
    

    答案:

    for(int j = 10; j > 0; j -= 2){
        System.out.println(j);
    }
    

    解析: 把while循环的初始化、条件判断和迭代部分整合到for循环的三个表达式中。

三、程序分析题

  1. 下面代码有什么问题?如何修改?
    int k = 1;
    while(k < 10)
        System.out.println(k);
        k++;
    
    答案:
    int k = 1;
    while(k < 10){
        System.out.println(k);
        k++;
    }
    
    解析: 原代码缺少大括号,导致只有println在循环内,k++在循环外,会造成无限循环。加上大括号把两条语句都包含在循环体内。
  2. 下面两个循环的输出结果相同吗?为什么?
    // 循环1
    for(int m = 0; m < 3; m++){
        System.out.print(m + " ");
    }
    
    // 循环2
    int n = 0;
    do {
        System.out.print(n + " ");
        n++;
    } while(n < 3);
    
    答案: 输出结果相同,都是"0 1 2 "
    解析: 虽然一个是for循环一个是do...while,但循环条件和迭代方式相同,在初始条件相同的情况下输出结果一致。区别在于do...while至少执行一次,而这里条件满足所以不影响结果。

编程题

编写一个Java程序,使用for循环输出如下数字金字塔:

    1
   222
  33333
 4444444
555555555

参考答案:

# 源文件保存为“Pyramid.java”
public class Pyramid {
    public static void main(String[] args) {
        for(int i = 1; i <= 5; i++) {
            // 打印空格
            for(int j = 1; j <= 5 - i; j++) {
                System.out.print(" ");
            }
            // 打印数字
            for(int k = 1; k <= 2 * i - 1; k++) {
                System.out.print(i);
            }
            System.out.println();
        }
    }
}

解析:外层循环控制行数,第一个内层循环控制每行前面的空格数量(随行数增加而减少),第二个内层循环控制每行数字的个数(呈奇数增长)。这种嵌套循环是处理图形输出的典型方法,外层控制行,内层控制每行的内容。

操测题

程序填空

  1. 补全代码,实现1-100所有7的倍数的和
public class SevenMultiples {
    public static void main(String[] args) {
        int sum = 0;
        int number = 1;
        while(________) {
            if(________) {
                sum += number;
            }
            ________;
        }
        System.out.println("1-100所有7的倍数的和为:" + sum);
    }
}

答案:

while(number <= 100) {
    if(number % 7 == 0) {
        sum += number;
    }
    number++;
}

解析:while循环条件控制数字范围在1-100,if判断是否能被7整除,别忘了每次循环后number要自增,不然会死循环。就像数钱时数完一张得拿下一张,不能老盯着同一张看。

  1. 用do...while改写下列for循环
for(int i=10; i>0; i-=2){
    System.out.print(i + " ");
}

答案:

int i = 10;
do {
    System.out.print(i + " ");
    i -= 2;
} while(i > 0);

解析:do...while就像"先斩后奏",先把事情做了再判断要不要继续。这里先把i=10输出,再减2,然后判断是否大于0。注意初始值要放在循环外面,步长调整放在循环体内。

程序改错

  1. 找出下面代码中的3处错误
public class LoopError {
    public static void main(String[] args) {
        int count = 1;
        do 
            System.out.println("正在执行第" + count + "次循环");
            count++
        while count < 5
    }
}

答案:

public class LoopError {
    public static void main(String[] args) {
        int count = 1;
        do {
            System.out.println("正在执行第" + count + "次循环");
            count++;
        } while (count < 5);
    }
}

解析:do...while循环体没加花括号就像没穿外套出门,count++少了分号相当于话没说完,while条件缺少括号和小括号。这就像写作文少了标点符号,计算机可看不懂。

  1. 下面代码想输出5行星号,每行递增,但实际会无限循环,请修正
int stars = 1;
while(stars <= 5) {
    for(int j=1; j<=stars; j++); {
        System.out.print("*");
    }
    System.out.println();
}

答案:

int stars = 1;
while(stars <= 5) {
    for(int j=1; j<=stars; j++) {
        System.out.print("*");
    }
    System.out.println();
    stars++;
}

解析:原代码有三个问题:for循环后面误加分号成了空语句,while循环里忘了stars++导致条件永远成立,就像电梯卡在某一层不动了。内层for循环控制每行星号数量,外层while控制行数,各行其是才能画出漂亮图形。

编程实现

  1. 用嵌套循环打印九九乘法表(只需要下半部分)
    1*1=1
    2*1=2 2*2=4
    3*1=3 3*2=6 3*3=9
    ...
    9*1=9 9*2=18 ... 9*9=81
    
    参考答案:
    # 源文件保存为“MultiplicationTable.java”
    public class MultiplicationTable {
        public static void main(String[] args) {
            for(int i = 1; i <= 9; i++) {
                for(int j = 1; j <= i; j++) {
                    System.out.print(i + "*" + j + "=" + (i*j) + "\t");
                }
                System.out.println();
            }
        }
    }
    
    解析:外层循环i控制行数和被乘数,内层循环j控制每行的列数和乘数,注意j的范围是1到i。打印时用制表符\t对齐更美观,就像表格的列对齐。每完成一行记得换行,好比写完一行字要另起一行。
  2. 编写一个猜数字游戏,随机生成1-100的整数,用户输入猜测,提示"大了"或"小了",直到猜中为止,统计猜测次数。 参考答案:
    import java.util.Scanner;
    import java.util.Random;
    
    public class GuessNumber {
        public static void main(String[] args) {
            Random rand = new Random();
            int target = rand.nextInt(100) + 1;
            Scanner sc = new Scanner(System.in);
            int guess, count = 0;
            
            do {
                System.out.print("请输入你的猜测(1-100):");
                guess = sc.nextInt();
                count++;
                
                if(guess > target) {
                    System.out.println("大了");
                } else if(guess < target) {
                    System.out.println("小了");
                }
            } while(guess != target);
            
            System.out.println("恭喜!你猜了" + count + "次终于猜中了!");
        }
    }
    
    解析:用Random.nextInt(100)+1生成1-100随机数,就像抽奖箱里摸号码。do...while循环确保至少猜一次,每次记录猜测次数。提示信息要友好,最后公布战绩时要有点仪式感,毕竟猜中不容易。Scanner记得放在循环外避免重复创建,就像不用每次问问题都找个新话筒。