Главная » Java » Массивы Java и пример программы, моделирующей игру в карты

0

 

Простые переменные, позволяющие хранить единственное значение, безусловно, Полезны, но их возможностей для решения большинства практических задач явно не :остаточно. Например, программируя карточную игру, вы наверняка захотите одновременно хранить несколько объектов типа card (карта) и оперировать ими как единым целым. Вот здесь вам на выручку поспешат массивы (aгrays).

Массив – это набор переменных одного типа. Доступ к элементам массива возможен с помощью простых целочисленных индексов. Если продолжить пример программы, моделирующей игру в карты, объявление класса Deck (колода) могло бы выглядеть так:

public class Deck {

            public static final DECK_SIZE = 52;

            private card[] cards = new card[DECK_SIZE];

            public void print() {

            for (int i = 0; i < cards.length; i++)

                       system.out.println(cards[i]);

            }

            // …

}

Первым делом мы объявляем константу DECK_SIZE, задающую количество карт в колоде. Константа снабжена модификатором public – теперь осведомиться об объеме колоды сможет каждый заинтересованный субъект. Далее следует определение поля cards, предназначенного для хранения ссылок на каждую из карт колоды. Поле объявлено как private – это означает, что доступ к нему получают только методы текущего класса и никому извне не дано право манипулировать данными напрямую. Признаки public и private называют модификаторами доступа (access modifiers) – они регламентируют, какие части программы и каким образом могут обращаться к классу, интерфейсу, полю или методу.

Поле cards объявлено в виде массива объектов типа Card посредством указания имени типа и следующей за ним пары квадратных скобок, [ и ]. С помощью операторов присваивания и new переменная cards инициализируется массивом ссылок на объекты типа card, число которых равно значению DECK_SIZE. Каждой ссылке на объект card массива неявно присваивается значение null. Длина массива задается при его создании и далее никогда не изменяется.

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

Изучая код класса Deck, вы могли обратить внимание, что объект массива как такового обладает полем length, которое содержит данные о длине массива. Интервал изменения индекса, обозначающий границы массива, – это диапазон целых чисел от 0 до length-l включительно. Одна из частых ошибок программирования связана с попытками доступа к элементам массива за пределами его границ. Для предотвращения ошибок такого рода компилятор Java снабжает каждое обращение к элементу массива инструкциями по проверке границ - если индекс элемента выходит за пределы допустимого диапазона, исполняющая система регистрирует этот факт и генерирует исключение типа IndexOutOfBoundsException. Более подробную информацию по вопросам обработки исключительных ситуаций вы найдете в этой главе чуть ниже.

Массив нулевой длины называют пустым (empty). В теле метода, которому массив передается в качестве аргумента, обычно полезно предусмотреть проверку длины массива, чтобы убедиться, что тот действительно не пуст. Однако, прежде чем анализировать длину массива, следует удостовериться, что ссылка на массИВ реальна, Т.е. отлична от значения null. Если результат проверки любого из эти:){ условий ложен, метод может зафиксировать наличие проблемы, генерируя исключение типа  IllegalArgumentException. Ниже рассмотрен пример метода, который вычисляет среднее значение элементов целочисленного массива.

 

static double average(int[] values) {

            if (values == null)

                       throw new IllegalArgumentException();

            else

                       if (values.length == 0)

                                   throw new IllegalArgumentException();

                       else {

                                   double sum = 0.0;

                                   for (int i =0; i < values.length; i++)

                                               sum += values[i];

                                   return sum / values.length;

            }

}

 

 

Код вполне работоспособен, но внутренняя логика метода с трудом поддается осмыслению из-за нагромождения вложенных одна в другую конструкций if … else. Чтобы избежать необходимости применения двух выражений if, мы попытаемся, использовав булев оператор включающего ИЛИ ( | ) свести конструкцию к единому выражению, проверяющему, равен ли аргумент значению null либо равна ли нулю его длина:

if (values = = null I values.length = = 0)

throw new IllegalArgumentException();

Увы, этот код неверен. Даже в том случае, когда значение values действительно равно null, программа все еще будет пытаться получить доступ к полю length, поскольку обычные булевы операторы всегда проверяют оба операнда. Подобная ситуация, возникающая при выполнении логических операций, настолько распространена, что для ее преодоления разработаны специальные операторы языка. Условные булевы операторы обращаются к правому операнду только в тех случаях, когда не могут вычислить результат всего выражения на основе значения левостороннего операнда. Код примера легко исправить, если прибегнуть к оператору условного ИЛИ С 11):

if (values = = null ||  values.length = = 0)

throw new IllegalArgumentException();

Теперь в случае, когда values равно null, значение всего логического выражения становится равным true и программа более не предпринимает попыток обращения к полю length.

Бинарные булевы операторы – И ( & ), включающее ИЛИ ( 1) и исключающее ИЛИ  ( || ) – существуют в двух ипостасях: они выполняют функцию логических операторов, когда их операнды представляют собой булевы значения.

            Упражнение 1.9. Исправьте текст приложения Fibonacci, предусмотрев возможности предварительного сохранения вычисленных значений в массиве и их последующего вывода на экран.

            Упражнение 1.10. Измените код программы ImprovedFibonacci таким образом, чтобы последовательность чисел заносилась в массив. Решите задачу, создав новый класс, позволяющий сохранять не только числа Фибоначчи, но и признак типа bооlеаn для каждого из них, который фиксирует факт четности числа, а затем создайте массив объектов этого класса

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии