Блок 1. Раздел 5. Тема 3
Обход массива задом наперед, обход половины массива. Передача массива
параметром функции.
Массивы других типов –
int, double, char, String.
Что если нам нужно распечатать элементы массива в обратном порядке? Не беда, просто теперь индекс элементов должен идти задом наперед, то есть от значений length-1, length-2, length -3 и так далее до 3, 2, 1, 0. Ноль следует включить, так как нулевой элемент в массиве есть. Поэтому естественно нам нужно сделать такой цикл для заранее объявленного массива ar:
Ноль следует включить, так как нулевой элемент в массиве есть. Поэтому естественно нам нужно сделать такой цикл для заранее объявленного массива ar:
for (int i = ar.length – 1; i >= 0; i ++)
		System.out.println (ar [i]);
На этот раз мы дали счетчику i начальное значение – размер массива минус один. Действительно – нам ведь нужно распечатать в первую очередь самый последний элемент массива. Затем нужен предпоследний и это значит, что мы уменьшаем значение текущего индекса на 1. Затем предпредпоследний, и мы его опять уменьшаем. И так продолжаем до самого нуля, поэтому условие окончания цикл i >= 0. Если бы мы уменьшили ещё хоть на 1, то было бы значение «минус один», но такого элемента в массиве нет и Java сразу бы все остановила со словами "index out of range".

У этой задачи есть и другие решения. Например, мы могли бы обратиться к тем же элементам, подставляя в квадратные скобки после имени массива не просто переменную i, а какое-то выражение. Помните, что подставить можно просто любое число, а было ли оно задано переменной или каким-то выражением – не важно. Смотрим код:
for (int i = 0; i < ar.length; i ++)
		System.out.println (ar [ ar.length – 1 - i] );
В этот раз в квадратных скобках идет выражение ar.length – 1 – i. При i = 0 это выражение будет равно ar.length-1 – самый последний элемент массива. Затем мы увеличили i на 1 и поскольку в выражении мы i вычитаем, то оно уменьшится на один. Мы получим предпоследний элемент. Затем опять предпредпоследний и так далее. обратите внимание – если бы мы написали просто ar.length – i, то сразу бы вышли за границу массива. Подумайте – почему?

Теперь посмотрим, как распечатать только первую половину массива.
for (int i =0; i < ar.length/2; i ++)
	System.out.println (ar [i]);
Действительно, ведь для того чтобы распечатать первую половину массива, нам нужно получить значения индекса 0, 1, 2, … ar.length/2.

А вот так мы могли бы получить вторую половину массива:
for (int i = ar.length/2; i < ar.length; i ++)
	System.out.println (ar [i]);
Передача массива параметром функции.
В одной из предыдущих тем мы проходили функции. Функция – это блок кода, который можно вызывать по имени, указывая параметры. В том числе очень удобно передавать массивы в качестве параметров. Например функция распечатки нам нужна бывает очень и очень часто – ведь так или иначе мы всегда должны узнать, как именно отработала наша программа. Делается это так:
static void printArray (int[] ar) {
	for (int i = 0; i < ar.length; i ++)
		System.out.println (ar [i]);
}
/*Теперь где-то в main мы можем использовать эту функцию сколько угодно раз для разных массивов в любом удобном месте кода:*/
public static void main () {
	int [] ar1 = {10, 20, -70};
	int [] ar2 = {60, 89, -1, -2};
	int [] ar3 = {90, 90, 80};

 	printArray (ar1);
	printArray (ar2);
	printArray (ar3);
}
Массивы других типов – int, double, char, String.
Массив – это набор переменных одинакового типа. Этот тип может быть любым. Поэтому есть массивы целых чисел, а есть дробных, есть массивы символов и есть массивы логического типа boolean. Приведем несколько примеров:
//массив целых чисел
int [] ar1 = {10, 20, 30}; 
	//массив дробных чисел double
double [] ar2 = {2.5, 6.7, 9};
	//массив символов char
char [] ar3 = {‘a’, ‘b’, ‘c’};
	/*класс String создан, чтобы хранить в себе массивы символов char []. Мы пока что будем оперировать по большей части массивами char [], чтобы освоить сам навык написания алгоритмов на относительно простых примерах, но в будущем перейдем к использованию методов String в большей мере, и будем на их основе создавать более серьезные алгоритмы. */
	/*массив логических переменных типа boolean. Напомню, они могут принимать только значения true и false*/
boolean [] ar4 = {true, false, false, true};

/* Можно создать массив любого типа и любого класса. В том числе можно создать массив строк String*/
String [] ar5 = {“apple”, “orange”, “tomato”};
/*Когда мы обратимся к i-ому элементу массива строк, то получим целую строчку. Например, её можно распечатать:*/
// выведет на экран “tomato”, так как это строчка под номером 2 :
System.out.println (ar [2]); 
System.out.println умеет печатать int, double, float, boolean, String, char и char[]. То есть целый массив она может напичатать только типа char[], а для печати массивов типа int [], double [] и так далее нужно писать свою функцию printArray как мы рассмотрели выше.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 1. Что значит объявить переменную? (ответы по кнопке "плюс")
Это значит назвать число заданного типа (целые, дробные или коды букв) каким-то своим именем. Под это число будет выделено место в оперативной памяти. Это число в дальнейшем можно менять и использовать в любых расчетах.
Вопрос 2. Что будет, если объявить две переменных с одним и тем же именем внутри одного блока фигурных скобок { } ?
Компилятор выдаст ошибку, потому что с его точки зрения, вы говорите, что одно и то же имя теперь может отвечать двум разным переменным. Он не может разобраться, какой же из двух переменных это имя отвечает, и сообщит, что это имя двусмысленное и его нужно изменить.

То есть в таком коде есть ошибка:
int x = 100;
int x = 200; // ошибка, x уже был объявлен
А в таком коде все нормально:
int x = 100;
x = 200; //поменять значение x на 200
//именно отсутствие int в начале строчки говорит о том, что x просто меняет свое значение, и мы не пытаемся завести новую переменную.
Задача 1. Ниже дан код с двумя переменными. Что будет распечатано на экране?
package javaapplication1;
public class JavaApplication1 {
public static void main(String[] args) {
  int x = 100;
  x = x*10/2 + x;
  System.out.println (x);

  double y = x - 5.5;

  System.out.println (y);
 }   
}
Ответ
600
594.5
Решение
Посчитаем выражения для введенных в коде переменных x и y.
Сначала x = 100;
Затем в строчке
x = x*10/2 + x;
компилятор сначала рассчитывает числовое выражение справа от равно
на основе старого значения x
100*10/2 + 100, то есть 600.
Поэтому строчка читается как "икс присвоить 600". Это значение и будет распечатано на экране.

На его основе будет вычислено значение y = x - 5.5, то есть 594.5.
Переменная y обладает типом double, то есть дробное, поэтому в ней можно сохранить дробную часть 0.5 . Если бы y было целым, то в такой переменной невозможно было бы сохранить дробную часть, и компилятор подчеркнул бы эту строчку красным и выдал ошибку. В ошибке было бы сказано, что идет отбрасывание дробной части, и это может привести к потере точности.
Решайте больше задач по этому разделу здесь.
В следующей теме расскажем подробнее
о типах данных в Java