Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
230102 5к / СПО / УПП.doc
Скачиваний:
58
Добавлен:
20.04.2015
Размер:
465.41 Кб
Скачать

4. Одномерные массивы.

В общем смысле одномерный массив в языке Java– это класс, хранящий область памяти и количество элементов заданного типа. Элементами массива могут иметь как базовые типы, то есть типы, зарезервированные в языке Java, так и типы (объекты) созданные пользователем.

Объявление переменной представляющей сбой массив имеет следующую форму записи:

тип имя переменной[];

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

Например, для определения переменной “a” которая будет использоваться как массив целых чисел необходимо ввести следующую инструкцию:

int a[];

Инициализация переменной типа массив нулем обязательна:

тип имя переменной[]=null;

Например, для определения переменной “a” которая будет использоваться как массив целых чисел необходимо ввести следующую инструкцию и инициализации ее нулем:

int a[]=null;

Для использования объекта типа массив необходимо сначала необходимо выделить память:

имя переменной = new тип переменной [количество элементов];

Например, для выделения памяти под массив целых чисел, состоящий из 10 элементов, который ассоциирован с переменной “a” необходимо ввести следующую инструкцию:

a=new int[10];

Выделение памяти под массив возможна непосредственно при объявлении переменной, тогда естественно инициализация нулем не нужна:

тип имя переменной = new тип переменной [количество элементов];

Например, для определения переменной “a” которая будет использоваться как массив целых чисел, состоящий из 10 элементов и выделения памяти под него, необходимо ввести следующую инструкцию:

int a[]=new int[10];

Индексация элементов массива аналогична языку С, то есть от 0 до n-1, гдеn– количество выделенных элементов. Номер элемента массива указывается в квадратных скобках после имени переменной:

имя переменной[номер элемента]=значение

Например для присвоения 5 элементу массива целых чисел “a”, значения 25 необходимо ввести следующую инструкцию:

a[4]=25;

Переменную для хранения количества элементов массива определять отдельно не нужно, для этого у объекта aесть внутренняя переменнаяlength, которая хранит количество элементов для которых выделена память.

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

import java.io.IOException;

import java.io.InputStreamReader;

import java.lang.NumbericFormatReader;

import java.lang.Double;

import java.lang.Integer

// объявляем класс

Class m_double_array_io {

// определяем конструктор класса по умолчанию

public m_double_array_io(){

}

// создаем функцию чтения строки

private String read_str(String prompt) {

// Выводим на экран приглашение

System.out.printt(prompt);

// Объявляем переменную в которой будет помещен

// результат ввода информации

String a;

// Определяем блок обработки исключительных ситуаций

try {

// Объявляем и создаем объект преобразования данных потока

// В текстовой вид

InputStreamReader is=new InputStreamReader(System.in);

// Объявляем текстовой буфер, длина которого соответствует

// максимальной длине строки.

char buf[] = new char[128];

// После этого в этот буфер производим чтение

is.read(buf);

// Этот буфер мы преобразовываем к строке

a=String.valueOf(buf);

// После этого закрываем блок обработки исключительных ситуаций.

}

// И описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (IO Exception e) {

System.out.println(e.getMessage());

a = null;

}

if (a = = null) return “”;

return a.trim();

}

// Создаем функцию чтения количества элементов массива

private int read_n() {

// Объявляем переменную в которой будет помещен

// результат ввода информации

int a = 0;

// Определяем блок обработки исключительных ситуаций

try {

a=Integer.valueOf(read_str(“Input n”)).intValue();

}

// И описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (NumbericFormatException e){

System.out.println(e.getMessage());

a=0;

}

return a;

}

// Создаем функцию создания массива

public double [] make_array(int n)

{

// В качестве параметра функции передается

// количество элементов массива, если оно рано 0

// то количество элементов вводится с клавиатуры

if(n==0)

{

// Повторяем функцию чтения до тех пор пока не будут

// введены корректные данных, т.е. в данном случае

// количество элементов массива должно быть положительным числом

while((n=read_n())<=0)

{

// Если в качестве количества элементов массива введена -1

// То будем считать, что это признак отмены ввода информации

if(n==-1)return null;

}

}

// Определяем переменную в которую поддет помещен объект

// типа массив вещественных числе и выделяем память

double m[]=new double[n];

// Возвращаем объект вызывающей функции

return m; }

// Создаем функцию чтения вещественного числа

private double read_double(String prompt) {

// Объявляем переменную в которой будет помещен

// результат ввода информации

double a = 0;

// Определяем блок обработки исключительных ситуаций

try {

a=Double.valueOf(read_str(prompt)).doubleValue();

}

// И описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (NumbericFormatException e){

System.out.println(e.getMessage());

a=0;

}

return a;

}

// и наконец пишем функцию создания и чтения массива

private double[] get_array_priv(int n)

{

// Определяем переменную хранящую массив

double m[]=null;

// Создаем объект

m=make_array(n);

// Если в результате получаем null, то выходим из

// функции создания массива возвращая null

if(m==null)return null;

// Читаем массив с клавиатуры

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

{

m[i]=read_double(“Input Element “+

String.valueOf(i)+”:”);

}

return m;

}

// теперь описываем функцию ввода массива с клавиатуры

// количество элементов которого за ранее известно

public double[] get_array (int n)

{

return get_array_priv(n);

}

// и функцию, в которой количество элементов массива

// должно вводиться с клавиатуры

public double[] get_array ()

{

return get_array_priv(0);

}

// теперь для полноты картины напишем функцию вывода массива

public void put_array(double m[],String name)

{

//Выводим название массива

System.out.print(name+”{“);

// Если объект существует,ыводим элементы массива

if(m!=null)

{

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

{

System.out.print(m[i]);

// Если это не последний элемент, то ставим запятую

if(i!=m.length-1)System.out.print(“,”);

}

}

// В противном случае выводим слово «null»

else

{

System.out.print(“null”);

}

// Закрываем скобочку и переводим курсор на другую строчку

System.out.println(“}”);

}

}

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

// объявляем класс производный от класса ввода-вывода

// массива

class m_double_array extends m_double_array_io {

// Объявляем переменную типа массив вещественных

// чисел

double m_array[]=null;

// определяем конструктор класса по умолчанию

public m_double_array(){

}

// определяем конструктор класса создающий массив

public m_double_array(int n){

m_array=make_array(n);

}

// Переопределяем функции чтения и записи

// для присвоения значений переменной определенной

// внутри класса

public double[] make_array(int n)

{

// Обращаемся к базовому классу для создания

// массива

m_array=super.make_array(n);

return m_array;

}

public double[] get_array (int n)

{

// Обращаемся к базовому классу для чтения

// массива

m_array=super.get_array(n);

return m_array;

}

public double[] get_array ()

{

// Обращаемся к базовому классу для чтения

// массива

m_array=super.get_array();

return m_array;

}

public void put_array(String name)

{

// Обращаемся к базовому классу для вывода

// массива

super.put_array(m_array,name);

}

// Создаем функцию получения непосредственно

// самого массива

public double[] get_m_array()

{

return m_array;

}

// Создаем функцию определения длинны массива

public int get_array_length()

{

if(m_array==null)return 0;

return m_array.length;

}

// Добавит Функцию поиска максимального элемента

public double find_max()

{

// Проверяем массив на существование

// Если он отцутствует возвращаем “0”

if(m_array==null)return 0;

// Присваиваем значение первого элемента массива

// значению максимального, для затравки

double max= m_array [0];

// Используем для определения размера массива

// свою функцию, для исключения проверки на существование

// объекта

for(int i=1;i<get_array_length();i++)

{

if(array[i]>max)max=array[i];

}

return max;

}

// Функцию поиска минимального элемента

public double find_min()

{

// Проверяем массив на существование

// Если он отцутствует возвращаем “0”

if(m_array==null)return 0;

//присваиваем значение первого элемента массива

//значению минимального, для затравки

double min=m_array[0];

for (int i=1;i<get_array_length();i++)

{

if(array[i]<min)min=array[i];

}

return min;

}

// Функцию вычисления суммы элементов массива

public double calc_sum()

{

//присваиваем значение первого элемента массива

//значению минимального, для затравки

double sum=0;

for (int i=0;i<get_array_length();i++)

{

sum+=array[i];

}

return sum;

}

// Функцию вычисления суммы четных элементов массива

public double calc_sum_2()

{

//присваиваем значение первого элемента массива

//значению минимального, для затравки

double sum=0;

for (int i=0;i<get_array_length();i+=2)

{

sum+=array[i];

}

return sum;

}

// и так далее в данный класс можно поместить все функции

// обработки одномерного массива

}

Соседние файлы в папке СПО