На моем уроке информатики мой учитель просит нас сделать следующее:

Описание программы: Вы учитесь играть в новую игру, в которой участвуют 3 шестигранных кубика. Вы знаете, что, если бы вы знали вероятность каждого из возможных бросков кубика, вы были бы гораздо лучшим конкурентом.

Поскольку вы только что изучали массивы и использовали их для подсчета нескольких элементов, написать эту программу будет несложно. Это будет круто, так как в последний раз, когда мы это делали, мы просто пытаемся выяснить, сколько раз можно было выбросить 9 или 10, и эта программа не потребует никаких операторов if.

Обязательные операторы: вывод, управление циклом, массив

Пример вывода:

Количество возможных комбинаций

1 0

2 0

3 1

4 3

5 6

6 10

7 15

8 21

9 25

10 27

11 27

12 25

13 21

14 15

15 10

16 6

17 3

18 1

Я легко могу сделать это с помощью оператора if, но не понимаю, как это сделать без него. Это особенно сложно, потому что под подсказками она написала: «Эти программы используют счетный массив. Каждый раз, когда генерируется значение, позиция в этом индексе увеличивается. Это похоже на обратную сторону таблицы поиска». Я без понятия что это значит.

Вот мой код с оператором if:

public class prog410a
{
    public static void main(String args[])
    {
        System.out.println("Number\tPossible Combinations");

        for (int x = 1; x <= 18; x++)
        {
            int count = 0;
            for (int k = 1; k <= 6; k++)
            {
                for (int i = 1; i <= 6; i ++)
                {
                    for (int j = 1; j <= 6; j++)
                    {
                        if (k + i + j == x)
                            count++;
                    }
                }
            }
            System.out.println(x + "\t\t\t" + count);
        }

    }
}

Итак, я предполагаю, что мой общий вопрос таков: как я могу подражать этому, но используя какой-то массив вместо оператора if?

-1
nccows 3 Мар 2015 в 19:41

4 ответа

Лучший ответ

Вам не нужен внешний цикл x. Все, что вам нужно, это три вложенных цикла, по одной на каждый кубик. Вам также понадобится массив целых чисел, все инициализированные нулем. Внутри самого внутреннего цикла игральных костей вы просто используете сумму трех игральных костей в качестве индекса целочисленного массива и увеличиваете значение этого индекса.

После того, как вы завершите циклы игры в кости, вы можете перебрать свой целочисленный массив и вывести частоту ваших результатов.

1
GeoGriffin 3 Мар 2015 в 16:50

Из Википедии: В информатике таблица поиска - это массив, который заменяет вычисления во время выполнения более простой операцией индексации массива. Экономия времени обработки может быть значительной, поскольку получение значения из памяти часто происходит быстрее, чем выполнение «дорогостоящих» вычислений или операций ввода / вывода. это означает, что обычно мы используем таблицы поиска для экономии времени вычислений. путем предварительного вычисления некоторого процесса в таблице, в которой мы уже сохранили результат. В этом случае вы используете процесс для хранения количества возможных результатов в массиве. По сути, вы создаете справочную таблицу для результатов игры в кости. Нужны только три внутренних петли.

        for (int k = 1; k <= 6; k++)
        {
            for (int i = 1; i <= 6; i ++)
            {
                for (int j = 1; j <= 6; j++)
                {
                    arr[k + i + j-1] = arr[k + i + j-1] +1;
                }
            }
        }

И вот что происходит:

dices   index
i j k  (i+j+k)
1 1 1     3
1 1 2     4
1 1 3     5
1 1 4     6
1 1 5     7
1 1 6     8
1 2 1     4
1 2 2     5
1 2 3     6
1 2 4     7
1 2 5     8
1 2 6     9
1 3 1     5
1 3 2     6
.
.
.

Вы перечисляете каждый возможный результат, а затем добавляете точку в массиве с сгенерированным индексом. Когда вложенные циклы будут выполнены, у вас будет массив, содержащий желаемую информацию.

0
amaurs 3 Мар 2015 в 17:07

Кажется, это работает - и без if:

public void test() {
    // Remember to -1 because arrays are accessed from 0 to length-1
    int[] counts = new int[18];
    // Dice 1.
    for (int k = 1; k <= 6; k++) {
        // Dice 2.
        for (int i = 1; i <= 6; i++) {
            // Dice 3.
            for (int j = 1; j <= 6; j++) {
                // Count their sum (-1 as noted above).
                counts[i + j + k - 1] += 1;
            }
        }
    }
    // Print out the array.
    System.out.println("Number\tPossible Combinations");
    for (int i = 0; i < counts.length; i++) {
        System.out.println("" + (i + 1) + "\t" + counts[i]);
    }
}

По сути, вы собираете результаты в массив, а затем выводите их.

0
OldCurmudgeon 3 Мар 2015 в 17:04

Поскольку это домашнее задание, я не буду писать за вас код, просто дам вам общий план.

Создайте массив счетчика размером 18. Установите все значения в 0.

Сделайте три вложенных цикла, считая от 1 до 6, точно так же, как ваши три внутренних цикла. Они представляют собой значения на ваших кубиках.

Внутри самого внутреннего цикла сложите вместе три счетчика цикла. Это ваша сумма костей, и вы используете ее как индекс в массиве count для увеличения значения этого индекса.

После выхода из трех вложенных циклов используйте другой цикл для итерации по массиву счетчиков, чтобы распечатать значения.

0
JeremyP 3 Мар 2015 в 17:02