0

我需要一些帮助来为我正在学习的 Java 介绍类编写程序。有一个家庭作业要求我们生成一个不高于 9 的分数,并将它们与另一个得分相加为 10 的“人”与另一个人配对。这场“比赛”共有20名参赛者。到目前为止,我为 2 个分数的配对创建了假设的行和列,并嵌套了 2 个 for 循环,并以 if 结束它,以查看行和列是否会增加到 10。

该程序确实编译了,但是在运行时,它似乎没有给我一个解决方案。

public static void main(String[] args) { 
    int rows = 2; 
    int cols = 10; 
    int[][] scoreTotal = new int[rows][cols]; 

    for (int row = 0; row < rows; row++) { 
        int teamBlue = (int)(Math.random()* 10);

        for (int col = 0; col < cols; col++) { 
            int teamRed = (int)( Math.random()* 10); 

            if (scoreTotal[row][col] == 10) { 
                System.out.println(scoreTotal);
            }
        }
    }
}

抱歉,如果这是一个非常令人困惑或新手的问题,但就像我说的那样,我正在介绍 java 类。

4

3 回答 3

1

通常在获得任务时,我们会尝试一次性完成所有任务,但您可以尝试将问题抽象为更小的“组件”。尝试将其视为烹饪时的食谱,您只需编写需要采取的步骤,然后再写出代码。

首先,从你的主要方法开始,你已经这样做了

public static void main(String[] args) {
}

接下来,您有一个要求说明

生成不高于 9 的分数

所以你可以做的是创建一个“分数”数组,并用每个玩家的分数填充它(我使用玩家而不是人,因为你提到了“分数”和“参赛者”)。

public static void main(String[] args) {
    // generate a score for each of the contestants
}

并将他们与另一个与另一个人的分数相加为 10 的“人”配对。

public static void main(String[] args) {
    // generate a score for each of the contestants
    // if score of player1 and another player is equal to 10, save pair
}

if语句有点繁琐,因此我们可以尝试将其分解。为简化起见,请尝试考虑仅对一名玩家进行测试。

public static void main(String[] args) {
    // generate a score for each of the contestants
    // take score of first player, s
    // compare s + x = 10, where x is score of other player
    // if x = 10 - s, save pair
}

现在我们得到了一些更简单的东西。让我们尝试输入一些代码。

public static void main(String[] args) {
    int[] scores = new int[20];
    // generate a score for each of the contestants
    for (int i = 0; i < scores.length; ++i) {
        scores[i] = getRandomNumber();
    }
    // take score of first player, s
    int s = scores[0]; // the first player is at index 0
    // compare s + x = 10, where x is score of other player
    for (int i = 1; i < 20; ++i) {
        // note: We don't have to test against index 0 (that's the first player)
        //       so we start at index 1
        // if x = 10 - s
        int x = scores[i];
        if (x == 10 - s) {
            // save pair
        }
    }
}

public static int getRandomNumber() {
   // todo: generate a random score between 0 and 9 and return it
   return 4;
}

您似乎知道如何for在原始代码中使用循环。您没有做的是在数组中分配一个值。(scores[i] = x;其中 x 是一个 int) 负责处理这一点,类似于分配一个 int 例如,int a = 0. 我使用了一种方法来生成一个返回的分数int,因为如何获取随机值的实现是“不感兴趣的”(所以我们将它抽象出来)。所以 for 循环为数组的每个索引设置一个分值。

接下来,由于scores数组中有参赛者的所有分数,我们需要将它们配对。使用一些简单的数学,我们构造了一个 if 语句来检查第一个玩家和第二个玩家的得分是否总和为 10。

接下来我们需要保存成对的参赛者。您在创建二维数组的正确道路上,一个用于容纳球员,另一个用于“团队”。填充这个数组时,二维数组看起来像这样

        | players |
        |  0    1 |
 -------+----+----+
 team 0 |  0 |  1 |
 team 1 |  3 |  7 |
 team 2 |  8 |  9 |
 -------+----+----+

即我们将玩家 0 与 1、玩家 3 与玩家 7、玩家 8 与玩家 9 组队。从中我们注意到团队索引 (0-2) 与实际玩家无关,因此我们可以得出结论,我们需要团队的单独索引。

public static void main(String[] args) {
    // generate a score for each of the contestants
    // create the team array, 10 teams each with 2 participants
    // for every player: take score of player, s
    // compare s + x = 10, where x is score of every other contestant
        // if x = 10 - s
            // assign the current team to player s and player x
            // increment team integer (assign next team)
}

因此,使用与您的代码类似的代码,我们构建了 teams 数组并将第一支球队分配给我们的球员,然后再继续其他球队。

// create the team array, 10 teams, each with 2 participants
int[][] teams = new int[10][2];
// assign the first team to player 3 and player 7
teams[0][0] = 3;
teams[0][1] = 7;

这只是一个示例,其中Team 0被分配了两名队员,一名在索引 0,一名在索引 1,分别分配给玩家3和玩家7

这很棒。我们现在可以将一名玩家与其他任何玩家配对。由此,我们知道我们需要一个“当前队伍”的计数器,因为每个参赛者在这一轮中不必有一个队友,当一个队伍被分配时,我们应该分配下一个。

public static void main(String[] args) {
    int[] scores = new int[20];
    // generate a score for each of the contestants
    // ... same as before
    // create the team array, 10 teams each with 2 participants
    int[][] pairs = new int[10][2];
    // create a team integer
    int currentTeam = 0;
    // for every player: take score of player, s
    for (int i = 0; i < 20; ++i) {
        // todo: test if player i is already in teams array and continue; if it is
        int s = scores[i];
        for (int j = i + 1; j < 20; ++j) {
            // compare s + x = 10, where x is score of every other contestant
            int x = scores[j];
            // if x = 10 - s
            if (x == 10 - s) {
                // assign the current team to player i and player j
                pair[currentTeam][0] = i;
                pair[currentTeam][1] = j;
                // increment team integer (assign next team)
                ++currentTeam;
            }
        }
    }
}

请注意,第二个 for 循环从 开始i + 1,因为我们已经测试了具有较低索引的播放器。

还; 你没有提到,但是这个问题有一个“隐藏”的约束,每一对都是排他的,所以一个参赛者只能参加一次。您应该添加第三个 for 循环来检查 teams 数组是否已经包含玩家。

因此,通过分解问题,我们设法获得了一些可能有效或无效的代码,但无论如何,逻辑都是通过推理创建的,这在解决问题时总是很重要!

于 2013-04-07T23:52:54.917 回答
0

所以你在循环中:

for (int row = 0; row < rows; row++) { 
    int teamBlue = (int)(Math.random()* 10);// teamBlue never used

    for (int col = 0; col < cols; col++) { 
        int teamRed = (int)( Math.random()* 10);// teamBlue never used 

        if (scoreTotal[row][col] == 10) {
            // scoreTotal[row][col] never modified
            // never reached because scoreTotal[row][col] == 0 by default
            System.out.println(scoreTotal);
        }
    }
}

换句话说,您的二维数组充满了 0:

{ {0 0 0 0 0 0 0 0 0 0}
  {0 0 0 0 0 0 0 0 0 0} }

因为你没有对分数做任何事情。你可以:

public static void main(String[] args) { 
    int rows = 2; 
    int cols = 10; 
    int[][] scoreTotal = new int[rows][cols]; 

    for (int row = 0; row < rows; row++) { 
        for (int col = 0; col < cols; col++) { 
            int randScore = (int)(Math.random()* 9) + 1;// in case you want a 1-9
            scoreTotal[row][col] = randScore
        }
    }
}

这样你就有了一个二维的分数数组:

           { {1 2 3 4 5 6 7 8 9 2}    // row == 0, 1st player random scores
             {1 2 3 4 3 5 6 7 8 9} }  // row == 1, 2nd player random scores
//col index:  0 1 2 3 4 5 6 7 8 9
//eg. scoreTotal[2][4] would be 3

现在你可以对分数做任何你想做的事情。配对将取决于您是否想要仅加起来 10 的配对或其他一些规则。

于 2013-04-07T23:39:43.873 回答
0

就目前而言,除了为您编写程序之外,您无法轻松帮助您,因为您没有提交任何代码,所以与其简单地为您做作业,这里有一些提示:首先,分解问题。仔细阅读问题,然后确定你必须做什么。在这样做时,您应该完成几个可以转换为代码的步骤。

  1. 创建 20 个包含 0-9 (或 1 到 9,问题并没有具体说明)随机数的整数,并将它们放入一个数组中。
  2. 对于每个分数,找到另一个分数,使它们的总和为 10,并将它们存储为一对。同样,并没有真正指定应该如何存储这些对。
  3. 找到所有对后,输出它们以及没有得到任何匹配的任何剩余分数。
于 2013-04-07T21:32:14.577 回答