• 张向英
    2019-06-03
    最后说的比着老师的程序抄十遍,应该是认真的吧

    作者回复: 如果是之前没有编程经验的同学,我是认真的。
    编程要培养感觉,看懂学会不等于会用,抄十遍和锻炼身体一样,有一定的重复,才能形成本能。而且,在抄的时候,要一边写一边想为什么。这才是目的。目的是抄几遍之后,自己能够想着写出来,更进一步,可以对其中的代码进行改善。这才是消化吸收的过程。

    
     4
  • 南风北风
    2019-12-16
    int bigRandom = (int)(Math.random() * rangeEnd * 100); //首先,Math.random()是一个从0到1的数字,所以,肯定要乘以一个大点的整数,才能保证随机性。比如说,如果rangeEnd是60,Math.random()是0.001,那么结果就是0.6了,强转整数就是0了。这个程序这么看可能更好理解:(int)(Math.random() * 100 * rangeEnd),那么Math.random() * 100就是一个从0到100的随机数,再乘以rangeEnd,那么就是一个从0到rangeEnd*100的随机数了。
    int unmberToGuess = (bigRandom % mod) + rangeStart; //理解了上面的,下面就好理解了,rangeStart是保证了最小数,bigRandom % mod是让这个从0到rangeEnd*100的随机数变成一个从0到mod的随机数,也就是从0到rangeEnd - rangeStart,两者加在一起就是一个从rangeStart到rangeEnd 的随机数了。

    老师,mod=rangeEnd - rangeStart, int bigRandom = (int)(Math.random() * rangeEnd * 100),对应的值范围是:0~rangeEnd*100,我看视频中,rangeStart=30,rangEnd=90,因此mod等于90-30=60;因此带入具体值:int bigRandom = (int)(Math.random() * rangeEnd * 100) 实际的值范围为[0,9000),
    bigRandom % mod的值范围是[0,8999.999/60)=[0,60)
    int unmberToGuess = (bigRandom % mod) + rangeStart 的值范围为[30,8999%60+30)=[30,90)
    展开

    作者回复: 嗯呐。边界可以特殊处理一下。我记得可以给rangeEnd加1

    
     1
  • 彧豪
    2020-01-02
    差不多两周不见了,哈哈,一直在忙其他的项目,刚看完你的这期视频,遇到几个问题,想请老师解答一下:
    1. 在写信号量的时候,布尔类型,Boolean和boolean,两个都行,我看一个是来自什么java.lang,一个是像int一样基本类型,二者有什么区别呢?
    2. String b = null;这句ide没报错,应该给b赋值一个字符串,但是我给它赋的值是null,不报错合理吗?为什么呢?以及我看了下我的笔记,在一开始的java基本数据类型一节中,似乎没有提到null是什么类型的,那我就顺带问一下哈:null是什么类型的呢?

    作者回复:
    1)从Java 5开始,Java支持了自动装箱和拆箱(auto boxing, auto unboxing)。意思就是在需要的时候,会把基础类型(boolon,int等)和其对应的封装类型(Boolean,Integer等)自动转换。基础类型是没有任何方法的,就是一个纯粹的数据。不确定你是怎么做信号量的,如果只是使用一个布尔的值,那么这两种是没有区别的,如果要用到一些方法,比如wait之类的,那么其实是使用的Boolean类型的。

    2)null是引用的缺省值,不是类型。就好像int的缺省值是0,boolean的缺省值是false。引用可以认为是一种存储对象地址的基础类型,它的缺省值就是null(落到实际内存的存储上,其实就是0,但是因为没有任何一个对象的地址会是0,所以引用对应的内存的值如果是0,那么Java就知道,这个引用其实是空,也就是不指向任何对象)。所有的引用都可以用null赋值,包括你上面提到的String的引用。

    
    
  • 南风北风
    2019-12-15
    我还没明白老师的意思,mod不是除数吗,怎么一下子范围就到了

    作者回复: 100 % 9 = 1
    取余数

    
    
  • 南风北风
    2019-12-15
    老师,我发理解这个话的意思:bigRandom % mod是让这个从0到rangeEnd*100的随机数变成一个从0到mod的随机数 这个不是求余吗,怎么就变成了一个0到mod的随机数了

    作者回复: bigRandom本身是个随机数,而且远大于mod
    mod是求余数,那么余数必定是在0和mod之间
    两个条件放在一起满足,就是一个0到mod的随机数

    
    
  • Geek_ae270e
    2019-11-13
    老师,您这行代码我能求出来,但不明白他的原理?您能讲解下吗?
    int mod = rangeEnd - rangeStart; // 两数差
    int bigRandom = (int)(Math.random() * rangeEnd * 100); //这一步的用意是什么呢?乘100和乘1000有区别码?
    int unmberToGuess = (bigRandom % mod) + rangeStart; // 为什么bigRandom % mod 的值的原理是什么呢?
    展开

    作者回复: int bigRandom = (int)(Math.random() * rangeEnd * 100); //首先,Math.random()是一个从0到1的数字,所以,肯定要乘以一个大点的整数,才能保证随机性。比如说,如果rangeEnd是60,Math.random()是0.001,那么结果就是0.6了,强转整数就是0了。这个程序这么看可能更好理解:(int)(Math.random() * 100 * rangeEnd),那么Math.random() * 100就是一个从0到100的随机数,再乘以rangeEnd,那么就是一个从0到rangeEnd*100的随机数了。
    int unmberToGuess = (bigRandom % mod) + rangeStart; //理解了上面的,下面就好理解了,rangeStart是保证了最小数,bigRandom % mod是让这个从0到rangeEnd*100的随机数变成一个从0到mod的随机数,也就是从0到rangeEnd - rangeStart,两者加在一起就是一个从rangeStart到rangeEnd 的随机数了。

    当然这不是唯一的方法,这几行code就是要做到两点:
    1:得到一个从rangeStart到rangeEnd的整数
    2:这个数足够随机

    你可以试着想想别的方法

    
    
  • 左撇子的菜鸟
    2019-10-23
    老师,为什么要用这么多得布尔值去做判断呢,如果不加这些判断会有什么问题

    作者回复:
    每个判断都有其作用呀。你可以给个代码,我们来看看这个判断是什么作用。

     2
    
  • ~@竹@~
    2019-08-16
    老师好,scanner输入后,按Alt+Enter 键没有,import class怎么调出来这个功能?

    作者回复: 这个是IntelliJ默认的快捷键,如果你没有改过&&类名输入正确的情况下,最多稍微等等,IntelliJ就能反应过来。

    
    
  • ~@竹@~
    2019-08-16
    老师好,我是新来的学生,一直没想明白代码的一段
    int numberToGuess=((int)rangNum*randEnd*100)%mod;
    这段代码为啥不用随机数rangNum*1000替代?随机数乘以任何大数,不都是放大几倍的随机数吗?

    作者回复: 随机数可能是从0到1的double,rangNum*1000是从0到1000的随机数,但是numberToGuess有个最小值的,不能从0开始。

    
    
  • 小鹏
    2019-08-10
    接上条留言,以下是测试类的代码:

    import java.util.InputMismatchException;
    import java.util.Scanner;

    public class TestGuy {
        public static void main(String[] args) {
            createGuy();
        }
        static Scanner sc = new Scanner(System.in);
        private static void createGuy() {
            System.out.print("请输入名字:");
            String name = sc.nextLine();
            Guy guy = new Guy(name);
            System.out.println("创建 " + guy.getName() + " 成功!");

            while (true) {
                System.out.println("是否需要输入年龄数据?回复\"Y\"开始输入,回复\"N\"取消输入。");
                String answer = sc.nextLine();
                if (answer.trim().equalsIgnoreCase("y")) {
                    while (true) {
                        System.out.println("请输入年龄。");
                        try {
                            int age = sc.nextInt();
                            guy.setAge(age);
                            System.out.println("输入成功!" + guy.getName() + " 的年龄是 " + guy.getAge() + "岁");
                            break;
                        } catch (InputMismatchException e) {
                            System.out.println("年龄数据类型为 int,请重新输入。");
                            sc.nextLine();
                        }
                    }
                    break;
                } else if (answer.trim().equalsIgnoreCase("n")) {
                    System.out.println("取消输入。");
                    break;
                }
            }

            System.out.println("请问 " + guy.getName() + "是否有喜欢的动物?");

            while (true) {
                System.out.println("回复\"Y\"开始输入动物名称,回复\"N\"取消。");
                String answer = sc.nextLine();
                if (answer.trim().equalsIgnoreCase("y")) {
                    System.out.println("请输入动物名称:");
                    String animal = sc.nextLine();
                    guy.setFavAnimal(animal);
                    System.out.println("输入成功!" + guy.getName() + " 喜欢的动物是 " + guy.getFavAnimal());
                    break;
                } else if (answer.trim().equalsIgnoreCase("n")) {
                    System.out.println("取消输入。");
                    break;
                }
            }
        }
    }
    展开

    作者回复: scanner相当于是缓存了从命令行输入的字符,然后通过nextXxx去消费这些字符。

    nextLine会读取到换行符。但是nextInt会读取到不是数字为止。所以换行符没有被消费。所以下次调用nextLine的时候就会消费这个换行符。就好像人输入了一个空行一样。

    解决方法就是用nextLine读取一行,然后用Integer.parseInt把字符串解析成数字

    
    
  • 小鹏
    2019-08-10
    老师好,我遇到了一个问题。代码太长了我等一下再新建一条留言重新发,先说一下我遇到的问题。

    在运行那段代码后,按照提示输入,然后在输入完年龄后,会打印出来下面这些内容:

    输入成功!peter 的年龄是 34岁
    请问 peter是否有喜欢的动物?
    回复"Y"开始输入动物名称,回复"N"取消。
    回复"Y"开始输入动物名称,回复"N"取消。

    这里的「回复"Y"开始输入动物名称,回复"N"取消。」被打印了两次,不知道是为什么?(代码会在另外的留言中发出)
    展开
    
    
  • Sam
    2019-07-07

    if (guess > numberToGuess) {
                        System.out.println("输入的数字比目标数字大");
                    } else if (guess < numberToGuess) {
                        System.out.println("输入的数字比目标数字小");
                    } else {
                        correctGuessCount++;
                        correctGuess = true;
                        System.out.println("输入的数字正确!");
                        break;

                    }
                }
    if (!correctGuess) {
                    System.out.println("本次的目标数字是" + numberToGuess);
                }
    为什么if里面是!,if语句后面是true会执行语句体,但是题中Boolean的默认值是false,
    根据题中要求当所有5次输入都错误时,输出目标数字,如果correctGuess是取非,就是true,不就代表其中一次输入是正确的的,为什么if语句会成立呢?
    展开

    作者回复: 如果猜对了, 会给它赋值,不会用缺省值的
                        correctGuess = true;

    
    
  • Slowly
    2019-07-06
    判断小的时候,比较值写错,已找到原因,谢谢

    作者回复: 手动点赞👍

    
    
  • Slowly
    2019-07-06
    为什么照着写,还是返回:
    请输入猜测的数字:在(30,50)之间
    43
    输入的数字比目标数字大
    请输入猜测的数字:在(30,50)之间
    42
    输入的数字比目标数字小
    请输入猜测的数字:在(30,50)之间

    看不出来错在哪里,确实转换成了int类型,老师求救
    展开

    作者回复: 刚刚看到,问题审核会需要些时间。能自己解决很棒棒!

    问代码相关的问题,建议将相关的代码贴出来。这样会对解决问题有很大帮助。

    
    
我们在线,来聊聊吧