Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Java.doc
Скачиваний:
836
Добавлен:
04.06.2015
Размер:
5.55 Mб
Скачать

Массивы

В программировании часто встречаются задачи, связанные с хранением и обработкой большого количества однотипных данных. Например, требуется ввести оценки по информатике для 25 студентов группы ПИ-11и определить средний балл. Для решения этой задачи опишем 25 переменных:

int pi_11_1, pi_11_2, pi_11_3, pi_11_4… pi_11_25;

Каждая из них будет соответствовать оценке одного студента. После этого используем 25 операторов для ввода оценок:

input=JOptionPane.showInputDialog("Введите оценку первого:");

pi_11_1=Integer.parseInt(input);

input=JOptionPane.showInputDialog("Введите оценку второго:");

pi_11_2=Integer.parseInt(input);

. . .

input=JOptionPane.showInputDialog("Введите оценку 25-го:");

pi_11_25=Integer.parseInt(input);

И, наконец, определим средний балл:

double sr_ball;

sr_ball=(is09_1+is09_2+is09_3+ . . . +is09_25)/25.0;

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

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

Массив состоит из конечногочисла элементов (компонент), содержимое которых относится к некоторому общему,базовомутипу. При этом сам базовый тип должен быть таким, что принадлежность к нему гарантирует одинаковые размеры памяти для размещения каждой из компонент. Элементы различаются местом их размещения внутри структуры, иначе говоря, номером илииндексом. Обычным являетсянепрерывноепредставление массива, как логическое, так и физическое, то есть логический (описанный в программе) массив проецируется на непрерывный участок оперативной памяти. Значит, необходимо, чтобы такой участок существовал. Отсюда вытекают ограничения на размер массива, диктуемые организацией оперативной памяти: массив должен поместиться в сегмент данных программы, размеры которого фиксированы. И, конечно, данные в массивах сохраняются только до конца работы программы.

Таким образом, массив представляет собой структуру данных, определяемую на основе следующих своих свойств:

  1. массив состоит из однотипныхэлементов, при этом используемый тип называетсябазовым,

  2. число элементов массива строго фиксировано,

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

  4. количество индексов, которое связано с отдельным элементом массива, определяет его размерность(одномерные, двумерные, трехмерные …),

  5. число элементов массива совпадает с общим количеством возможных значений его индексов,

  6. массив – именованнаясовокупность данных, причем использование его имени совместно с индексами позволяет определять значения его элементов,

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

Массивы можно определить и через понятия математики.

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

МатрицейAnmназывается таблица чисел, состоящая изn строк иm столбцов.

Каждый элементматрицыaijполностью определяется своимииндексами– номерами строки iи столбца j, в которых он расположен.

Количество индексов определяет размерностьматрицы: одномерная (вектор), двумерная, трехмерная и т.д.

Максимальное значение каждого индекса определяет размерматрицы.

В качестве аналога матриц в программировании выступают массивы.

Массив– это упорядоченный набор фиксированного количества однотипных компонентов, имеющих общее имя – имя массива, и различающихся значениями своих индексов. В зависимости от количества индексов компонентов (элементов) массива различают одномерные (вектора), двумерные (матрицы) и т.д. массивы.

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

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

a11 a12 a13

a21 a22 a23

a31 a32 a33

……………………..

Таким образом, двумерный массив полностью соответствует понятию матрицы. В оперативной памяти элементы двумерного массива расположены последовательно, строка за строкой: сначала элементы первой строки, затем второй и так далее: a11, a12, a13,…, a21, a22, a23,…, a31, a32, a33,…Значит, быстрее изменяетсявторойиндекс (номер столбца), чемпервый(номер строки).

Многомерныемассивы располагаются в памяти компьютера так, что сначала изменяется последний индекс элемента, затем – предпоследний и так далее.

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

Тип элементов массива называется его базовымтипом. ВJavaэто может быть любой стандартный (целый, действительный, символьный, строковый) или пользовательский (массив структур) тип данных.

Индексы элементов массива могут быть только целыми положительными числамии начинаются снуля.

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

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

  • непосредственно при выполнениипрограммы.

В первом случае говорят о статическомраспределении памяти. Если память выделяется в процессе выполнения программы, говорят одинамическомраспределении памяти.

В Javaпамять для массивов, строк и объектов выделяется непосредственно в процессе выполнения программы, то естьдинамически.

Создание массива в Javaподразумевает реализацию двух этапов:

  1. объявление (declaration)переменой массива (ссылки), указывающей, где в памяти компьютера он расположен:

int myArray[]; // квадратные скобки после имени!

объявлена переменная массива myArray -ссылкана массив целого типа,

  1. создание непосредственно массива – выделение в памяти места для хранения его элементов оператором newи связывание его соссылкойна массив:

myArray=new int[10];

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

Как правило, эти две операции объединяются в одну:

int myArray[]=new int[10];

Размер массива можно задавать целым числом при его описании, а также переменной или константой целого типа. Значение этой переменной можно задать оператором присваивания или ввести с клавиатуры:

int n=10;

int myArray[]=new int[n];

или

public final int RAZMER=10;

int myArray[]=new int[RAZMER];

или

int n;

String input;

input=JOptionPane.showInputDialog("Задайте размер массива:");

n=Integer.parseInt(input);

int myArray[]=new int[n];

Индексация элементов массивов в Java, как и вСи, начинается снуля. Поэтому последний элемент массива будет иметь индекс на единицу меньше его размера. Размер массива можно определить через свойствоlength:

n=myArray.length; // n – количество элементов в массиве

В отличие от Си, вJavaвыполняется автоматическая проверка выхода за пределы массива – это повышает надежность программы.

В Javaможно создавать не только одномерные массивы (векторы), но и двухмерные (матрицы), трехмерные (кубы) и так далее. В этом случае количество индексов элементов определяетразмерностьмассива: одномерные, двумерные, трехмерные…

При описании двумерного массива используются двойные квадратные скобки:

double matrica[][]=new double [3][5];

Описан двумерный массив matrica, состоящий из трех строк и пяти столбцов. Нумерация строк от0до2, столбцов – от0до4.

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

Элементы массива можно использовать во всех выражениях, операторах и функциях, определенных для их типа.

Начальные значения элементам массива в Javaможно задавать при их описании (инициализироватьмассив), при этом размеры массивов в квадратных скобках можно не указывать – для их хранения будет отведено столько ячеек оперативной памяти, сколько значений указано в фигурных скобках:

int vect[] = new int[]{-5, 3, -2, 8, 1}; //5 элементов

double matr[][] = new double[][]{{0.2, -1.5, 3.14},

{-2.73, 25.54, 0.89}}; //2 строки и 3 столбца

Еще раз необходимо обратить внимание на то, что, в отличие от Паскаля, при описании и при работе с многомерными массивами вJavaкаждый индекс элемента массива заключается вотдельныеквадратные скобки:

matr[1][2]=0.89;

Для вывода элементов одномерного массива (вектора) на экран используется специальная форма цикла for:

for (тип_массива переменная: имя_массива)

{

операторы вывода

}

Например, необходимо вывести на экран элементы следующего массива:

int myVector[]=new int[10]{9,8,7,6,5,4,3,2,1,0};

Используем специальную форму цикла for:

for (int value: myVector)

System.out.printf(“%5d”, value);

В этом случае не нужно указывать ни параметр цикла, ни длину вектора. Переменная value(имя может быть любым) по очереди перебирает элементы массива, принимая значения этих элементов.

В окне вывода появится:

9 8 7 6 5 4 3 2 1 0

Примеры:

  1. задать с помощью генератора случайных чисел элементы целочисленного массива matr34, вывести его на экран и в диалоговое окно вывода построчно. Размеры массива ввести с помощью диалогового окна ввода:

package javaapplication1;

// импорт библиотеки графических компонентов Swing