CTimet 2021-11-28 14:03 采纳率: 84%
浏览 9
已结题

Help!这应该是一种不可能出现的情况,可是它还是出现了!

这是一个离奇的BUG

img


看,这个getRandomNum方法的峰值我设置了3,按道理来说,这个方法应该只会返回0,1,2。同理,这个getRandomOperator应该只返回+-x这三种情况才对。
可事实并不是这样

while (true)
        {
            ci++;
            System.out.println("第" + ci + "道题:");
            while (true)
            {
                int i = u.getRandomNum(100);
                int o = u.getRandomNum(100);
                if (u.getRandomOperator().equals("+")){
                    if (u.getTrueOrFalseForAdd(i,o)){
                        int te = i + o;
                        System.out.println(u.getRandomTopic("+",i,o));
                        int io = in.nextInt();
                        if (io == te){
                            System.out.println("正确!");
                            tr++;
                            break;
                        }else {
                            System.out.println("错误!正确答案是" + te + "你的答案是" + io);
                            fa++;
                            break;
                        }
                    }else {
                        continue;
                    }
                }else if (u.getRandomOperator().equals("-")){
                    if (u.getTrueOrFalseForSub(i,o)){
                        int te = i - o;
                        System.out.println(u.getRandomTopic("-",i,o));
                        int io = in.nextInt();
                        if (io == te){
                            System.out.println("正确!");
                            tr++;
                            break;
                        }else {
                            System.out.println("错误!正确答案是" + te + "你的答案是" + io);
                            fa++;
                            break;
                        }
                    }else {
                        continue;
                    }
                }else if (u.getRandomOperator().equals("x")){
                    if (u.getTrueOrFalseForMul(i,o)){
                        int te = i * o;
                        System.out.println(u.getRandomTopic("x",i,o));
                        int io = in.nextInt();
                        if (io == te){
                            System.out.println("正确!");
                            tr++;
                            break;
                        }else {
                            System.out.println("错误!正确答案是" + te + "你的答案是" + io);
                            fa++;
                            break;
                        }
                    }else {
                        continue;
                    }
                }else {
                    if (u.getTrueOrFalseForDiv(i,o)){
                        int te = i / o;
                        System.out.println(u.getRandomTopic("÷",i,o));
                        int io = in.nextInt();
                        if (io == te){
                            System.out.println("正确!");
                            tr++;
                            break;
                        }else {
                            System.out.println("错误!正确答案是" + te + "你的答案是" + io);
                            fa++;
                            break;
                        }
                    }else {
                        continue;
                    }
                }
            }
            if (ci == n) break;
        }
        System.out.println("你做对了" + tr + "道题,做错了" + fa + "道题");

如你所见,在上述代码中,判断执行的if语句判断条件是getRandomOperator方法返回的字符。因为只产生0,1,2三个数字,所以应该只返回+-x三种符号,而在实际代码运行过程中

img

他居然返回了一个除号,这意味着else语句执行了!可是,else语句不是应该永远不执行才对吗?getRandomNum只返回0,1,2。这意味着getRandomOperator只返回+-x三种符号。那么,这三种符号都在前面的if语句中有啊。怎么算也执行不到else上。如果要执行那getRandomOperator一定返回了除号。可是getRandomOperator不可能返回除号啊。这不科学!
所以,我想问。逻辑上到达哪里出了问题?为什么最后getRandomOperator还是返回了一个除号?

  • 写回答

1条回答 默认 最新

  • 未聞花名丶 2021-11-28 17:34
    关注

    因为你在执行判断的时候 每次都去调用了getRandomOperator,每次都生成了新的随机数,
    现在是判断随机数是否是 0, 1, 2
    返回除号的情况比如:第一次if随机是 1,第二次if随机 2 ,第三次if 随机 0 ,那么就都没满足,就走到else了,
    可以保存个局部变量再判断

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月28日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教