Java课程学习笔记4

2025-03-20

该笔记主要记录浙江大学翁恺的java入门与进阶课程的学习笔记,主要包括第3小节的循环的内容,包括while、do-while等循环的相关知识

1 循环

对于之前买票的程序,现有的仅能够购买一张票整个程序就结束了,但是实际上应该在现实中是不停的一次次买票,这就需要利用循环的相关知识了:

原有代码如下:

import java.util.Scanner;

public class compare {
    public static void main(String[] args) {
        System.out.print("请投入一定金额的货币:");
        Scanner in = new Scanner(System.in);
        int amount=in.nextInt();
        if (amount>=10){
            System.out.println("找零:"+(amount-10));
            System.out.println("************************");
            System.out.println("java 城际铁路车票");
            System.out.println("票价:10元");
            System.out.println("************************");
        }
        else {
            System.out.println("您投入的金额不足");
        }
    }
}

可以看到,只有一次输出车票之后整个系统就结束了,这是并不适合实际使用的:

image-20250320221215945

为了应对这个内容,我们需要让上述过程反复的进行,这时就可以使用while的语句:

import java.util.Scanner;

public class compare {
    public static void main(String[] args) {
        System.out.print("请投入一定金额的货币:");
        while(True){
            Scanner in = new Scanner(System.in);
            int amount=in.nextInt();
            if (amount>=10){
                System.out.println("找零:"+(amount-10));
                System.out.println("************************");
                System.out.println("java 城际铁路车票");
                System.out.println("票价:10元");
                System.out.println("************************");
            }
            else {
                System.out.println("您投入的金额不足");
            }
       }
    }
}

这是运行的结果:

image-20250320221502422

不难发现,我们的程序面临以下的几个问题,首先是单次金额不足但多次投币后达到金额,却无法购买相应的票,其次是我们的程序永远不会停止

为了应对零钱累计,其实很简单,多增加一个累计的变量就行了:

import java.util.Scanner;

public class compare {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int balance=0;
        while (true) {
            System.out.print("请投入一定金额的货币:");
            int amount = in.nextInt();
            balance=balance+amount;
            if (balance >= 10) {
                System.out.println("找零:" + (balance - 10));
                System.out.println("************************");
                System.out.println("java 城际铁路车票");
                System.out.println("票价:10元");
                System.out.println("************************");
                balance=0;
            } else {
                System.out.println("您投入的金额不足");
            }
        }
    }
}

2 数数字

import java.util.Scanner;

public class CountNumber {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("欢迎来到判断位数");
        System.out.print("请输入需要判断的数: ");
        int amount= in.nextInt();
        int count=0;
        while (amount>0)
        {
            amount=amount/10;
            count=count+1;
        }
        System.out.println(count+"位数");
    }
}

只需要不停的除以10就可以实现了

这里的while后面的括号就是while循环成立的条件,如果条件成立那么循环始终是运行着的。需要注意的是,只有当循环体结束一次之后才会回到判断条件的地方进行下一次循环是否进行的判断

3 循环验证

image-20250320223853587

其实不难发现,上述我们的程序对于0以及负数都是不能work的,这是因为对这种情况,input的数连循环体本身的判断条件都不符合,相当于一次循环都没有进行就直接结束了。

4 do-while语句

对于上述的情况,我们可以先做一次循环的内容,再进行判断,这时可以使用do-while语句

do{
	operation;
}while(condition);

特别需要注意do-while循环里面的while后面的分号

5 计数循环

计数循环用于控制循环执行多少次

image-20250321104955129

这个实际上跑了101轮,最后的count是输出-1,这与count>=0这个条件设置有关系,如果我们改成count>0那么此时只会跑100次,且最后一个输出的是0

同时,先print还是先count-1也会影响我们输出的范围,比如说此时就会从100开始print

有时候拿不准循环轮次的时候,可以选用小的循环轮数测试一下

6 task:计算平均数

image-20250321105721518

import java.util.Scanner;

public class AverageCalculate {
    public static void main(String[] args) {
        int count=0,sum=0,number;
        Scanner in = new Scanner(System.in);
        do {
            System.out.print("请输入数字:");
            number=in.nextInt();
            count=count+1;
            sum=sum+number;
        } while (number!=-1);
        if (count-1>0) {
            double average=(sum+1)*1.0/(count-1);
            System.out.println("平均值是:"+average);
        }

    }
}

一些小细节:一开始就是-1的时候,那么此时count是0

7 task:猜数游戏

任务:让计算机想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,输出用户猜了多少次

那么问题可以分解成以下部分:

  • 计算机随机生成一个数
  • 计数变量初始化为0
  • 让用户输入一个数字
  • 计数器迭代+1
  • 判断a和随机数的大小,如果随机数大则输出大,反之则输出小
  • 如果a和随机数不相等则程序回到让用户输入数字,反之则输出猜中以及次数,最后结束
//随机数的生成
Math.random() //这里生成的是[0,1);

最后的代码如下图所示:

import java.util.Scanner;

public class GuestingNumber {
    public static void main(String[] args) {
        int number=(int)(Math.random()*100+1);
        Scanner in= new Scanner(System.in);
        int input_num,count=0;
        do {
            System.out.print("请输入一个1-100之间的数:");
            input_num=in.nextInt();
            count=count+1;
            if (input_num>number){
                System.out.println("太大了");
            }
            else if (input_num<number){
                System.out.println("太小了");
            }
        }while(input_num != number);
        System.out.println("猜对了,共猜了"+count+"次");
    }
}

8 task:整数分解

利用%10可以获得个位数,而/10则可以抹掉个位数

import java.util.Scanner;

public class SplitInt {
    public static void main(String[] args) {
        Scanner in= new Scanner(System.in);
        System.out.print("Enter a number: ");
        int num = in.nextInt();
        int mod;
        do{
            mod=num%10;
            num=num/10;
            System.out.print(mod);
        }while (num>0);
    }
}

这种面临的问题是,当遇到700,他倒着输出得到的是007