Блок 1. Раздел 5. Тема 2
Печать массива и простой обход массива в цикле.
Главный алгоритм этого подраздела – обход массива. Это алгоритм, в котором мы обращаемся к каждому отдельному элементу массива по его номеру.
Вспомним, что номера элементов массива такие: 0, 1, 2, 3, …, N – 1, где N – количество всех элементов. Это значит, что мы можем завести какую-то целочисленную переменную, в начале равную нулю, и в цикле увеличивать её на 1. Таким образом, мы получим в активе очередной номер элемента на каждом обороте массива. Эту переменную обычно называют счетчиком элементов массива – потому что она их как бы считает по порядка от нуля, до N-1. Имея в наличии такой счетчик, мы можем обратиться к элементу под данным номером и что-либо с ним сделать. Например, его можно просто распечатать, а можем с чем-то сравнить, можно переставить местами с элементом под другим номером и так далее. Давайте для начала просто распечатаем.
//Распечатаем все элементы массива. Для этого сделаем его обход в цикле
/*В начале объявим некоторый массив. В будущем массив может быть загружен из файла, загружен из интернета, скачан из базы данных или рассчитан по формуле. В массивах хранят практически все данные программы, поэтому зачастую массивы могут быть огромными – по 100 тысяч элементов и больше. Сейчас просто для примера, создадим маленький массив на 15 элементов. Но имейте в виду, что поскольку хранить часто приходится много чисел, то скорее всего вся работа с ними будет в циклах – иначе код станет непомерно большим.
*/

int ar [] = {90, -30, 240, 1, 9, 8, 30, 79, 600, 100, 101, 80, 90, 79, 145}; 

for (int i = 0; i < ar.length; i ++)  
	System.out.println (ar [i]);
Разберем подробно этот цикл. Он применяется для работы с массивами чаще всего. В начале мы объявили переменную i, равную нулю. Это и будет наш счетчик. Это счетчик должен пробежать значения: 0, 1, 2, 3, … ar.length-1.
Определение. ar.length – длина массива. ar – имя конкретного массива, всегда разное, и если после имени массива написать .length, то мы обратимся к длине массива.
Вообще в Java через точку можно получить что-то, находящееся внутри переменной слева. Например массив – это набор чисел и ещё у него есть длина. Поэтому через точку можно получить его длину. Также System – это множество системных вещей, как бы коробка содержащая все системные вещи, и через точку можно получить одну из них – например System.out – вывод на экран.

Итак значения переменной i такие 0, 1, 2, …, ar.length-1. Не случайно мы закончили на ar.length-1. Дело в том, что если считать с нуля, и всего в массиве элементов ar.length, то последним будет именно ar.length-1 и ни на один больше. Все элементы с большими номерами на самом деле массиву не принадлежат. Если мы попытаемся к ним обратиться, то будет выход за границу массива. После заказанных значений под массив в памяти идут значения чужих переменных и других массивов – их изменения могут полностью уничтожить работу самых разных программ, поэтому java запрещает обращаться к ним и сразу выведет ошибку времени выполнения – index out of range или index out of bounds – что значит «индекс вне границ» (в данном случае вне границ массива).

Шапка цикла была такая:
for (int i = 0; i < ar.length; i ++)  
Здесь на каждом обороте цикла переменная i увеличивается на один (i++). Стоит строгое условие «меньше»: i < ar.length. Поэтому в начале i будет равно нулю, затем единице, двойке и так далее, и когда дойдет до ar.length-1, то условие всё ещё будет верно. А вот как только i станет в точности равно ar.length, то условие станет уже ложным и цикл закончится – и мы не обратимся к чужой памяти. Наконец в самом цикле мы написали:
System.out.print (ar [i]);
Здесь мы распечатываем i-ый элемент массива. Переменная i уже принимает нужные значения, и мы можем смело её указать внутри квадратных скобок после имени массива ar. Как в начале темы мы писали
System.out.println (ar [0])
System.out.println (ar [1])
System.out.println (ar [2])
Так и теперь мы можем сильно облегчить себе жизнь и не писать подобные строки скажем 10 тысяч раз, если длина массива 10 тысяч, а всего лишь написать несколько строк для цикла и про печать написать всего один раз:
System.out.print (ar [i]);
Так мы можем обратить к элементу под номером i, а уж сам этот номер пробегает все возможные значения от нуля до ar.length-1, и поэтому будет распечатан весь массив. Так циклы приходят на помощь программисту, когда он имеет дело с массивами, особенно большими. Просто сравните два эквивалентных кода:
System.out.println (ar [0])
System.out.println (ar [1])
System.out.println (ar [2])
System.out.println (ar [3])
System.out.println (ar [4])
System.out.println (ar [5])
System.out.println (ar [6])
System.out.println (ar [7])
System.out.println (ar [8])
System.out.println (ar [9])
System.out.println (ar [10])
System.out.println (ar [11])
System.out.println (ar [12])
System.out.println (ar [13])
System.out.println (ar [14])
Это если не использовать цикл. Польза от самого массива небольшая – мы могли бы и объявить все эти данные в виде отдельных переменных. но если мы применим цикл, посмотрите как сокращается код:
for (int i = 0; i < ar.length; i ++) 
	System.out.println (ar [i]);
Всего две строчки! Вместо пятнадцати для нашего массива на 15 элементов и вместо 10 тысяч, если бы в массиве было 10 тысяч элементов – а это отнюдь не редкость. Вот почему без массивов не обходится почти ни одна программа – если вы пишите игру, то координаты всех персонажей будут храниться в массиве координат, если вы пишите текстовый редактор, то вы храните весь текст как массив символов char, если пишите магазин, то храните цены каждого товара в массива как double. Вот почему массивы так нужны и полезны. Кстати сравните две реализации – на 15 строк и на 2 строчки. Так вы окончательно поймете, что именно делает цикл для обхода массива. В дальнейшем мы будем многократно писать такие, и им подобные циклы – это основной инструмент для работы с массивом.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 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