当前位置: 首页 > 知识库问答 >
问题:

有没有一种方法可以确保while循环在请求输入之前不运行一次?

慕铭
2023-03-14

我正在写一个抛硬币程序。基本上,用户被问到他们想玩多少游戏。然后,while循环运行这个游戏,它要求用户输入几个由空格(头部或尾部ex.H.H.H.T.H)分隔的硬币掷出。然后,程序将用户输入字符串转换为数组,for循环遍历数组并检查heads(大写H),并将其存储在heads变量中。分数的计算方法是将数组中的个数乘以数组的长度,再乘以100得到一个百分比。如果得分为50%或以上,则该玩家获胜。如果低于50%,则玩家输掉。我发现的两个错误是while循环在输入任何输入之前已经运行了一次。此外,分数似乎计算错误,它要么总是返回0.0%或100.0%。我想这和输入长度有关,但我不知道。谢谢你。

import java.util.Scanner;
public class HeadTailGenerator {

public static void main (String []args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("How many games?");
    int games = scanner.nextInt();
    int count = 0;
    int heads =0;

    while (count<games){
        System.out.print("Enter your flips for game "+ count+": ");
        String input = scanner.nextLine();
        String [] inputArray = input.split("\\s+");
        for (int i = 0; i <inputArray.length-1; i++){

            if (inputArray[i].equals("H")){
                heads++;
            }

        }//exit for loop

        double score = (heads/(inputArray.length)*100);

        if (score >= 50.0){
            System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You win!");
        }
        else {
            System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You lose!");
        }

        count++;
    }
}
}

共有1个答案

澹台昆
2023-03-14

添加一些打印可以帮助您调试所有问题。

第一个问题是NextInt()没有捕获用于输入游戏数量的换行符,因此您可以在此之后添加Scanner.NextLine();以防止游戏立即结束。

第二个问题是for循环中的条件。删除-1以循环数组中的所有元素。

第三个问题是,在计算分数时,你要用一个整数除以一个总是大于或等于该整数的数字,所以小数被截断,或者结果是1。您可以在操作中将整数强制转换为double,也可以将heads声明为double,或者,如果不关心百分比结果的小数,也可以先乘以100,然后再除。

import java.util.Scanner;
public class Main {
    public static void main (String []args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("How many games? ");
        int games = scanner.nextInt();
        System.out.println("Games: "+ games);
        scanner.nextLine();
        int count = 0;
        int heads = 0;

        while (count<games){
            System.out.print("Enter your flips for game "+ count+": ");
            String input = scanner.nextLine();
            String [] inputArray = input.split("\\s+");
            for (int i = 0; i <inputArray.length; i++){
                System.out.println("Input["+ i +"]: "+ inputArray[i]);
                if (inputArray[i].equals("H")){
                    heads++;
                    System.out.println("Heads count: "+ heads);
                }

            }//exit for loop

            double score = ((double)heads/(inputArray.length)*100);

            if (score >= 50.0)
                System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You win!");
            else 
                System.out.println("Game "+ count + ": "+ heads + " heads ("+ score+ "%); You lose!");

            count++;
        }
    }
}
 类似资料:
  • 问题内容: 我刚刚开始使用nodejs。我想知道是否有一种方法只能在应用程序中“一次”请求文件。我正在使用一个类框架来在我的JS项目中获取经典的OOPS。每个“类”都包含在其自己的JS文件中。我想“要求”每个文件中的类框架,以便它们可以独立运行,但希望框架的初始化代码仅执行一次。 我可以使用一个标志来自己实现,但是内置的方法会很好。搜索“ require一次”使我想到所有与PHP有关的问题。 问题

  • 问题内容: 每次我必须遍历一个集合时,我都会在for-each循环的迭代开始之前检查是否为null。像这样: 有没有更短的方法,这样我们就可以避免编写“ if”块?注意:我正在使用Java 5,并且将在一段时间内使用它。 问题答案: 我猜正确的答案是:没有办法使它更短。有一些技巧,例如评论中的技巧,但我看不到自己在使用它们。我认为编写“ if”块比使用这些技术要好。是的..在任何人再次提到它之前:

  • 问题内容: 我在做游戏,遇到一个问题…当我尝试保存时,JSON失败,并报告正在某处进行循环引用。我认为它实际上不是,我看不到它,因此是否有一种算法或其他任何方法可以告诉我确切的位置(在哪些对象和事物之间)?另外,是否有可以保存循环引用的JSON替代方案?我正在运行一个node.js服务器,我看到了,但是我无法使其正常工作(它不是作为模块组成的,我可以在我的代码中使用require())。 问题答案

  • 你有没有办法把它自动化?还有更多的方法是这样构造的。我在这里什么也不会有。这样做有意义吗,就像我想象的那样?

  • 我有一个带有RESTAPI的Java服务。从客户端一次可以发送多个请求,我希望通过API在服务器端一次实现一个请求。问题是我需要在服务器端对请求进行优先级排序。换句话说,如果一次发送10个请求,我需要使用优先级队列一次对所有10个请求设置优先级,并根据优先级选择一个请求。可以从同一个客户端或多个客户端发送请求。 现在,在上面的代码中,一次可以为一个请求执行这个。 有什么解决办法吗?我见过一些多线程

  • 我需要在while循环之前输入一个用户,这样它就会知道程序是否想继续。问题是while条件的更内部看不到扫描仪之前输入的一行。有什么建议吗?