Skip to main content

18. Проверки

Теория

Массив – это структура, содержащая в себе несколько переменных. Например, на рисунке 1 представлен массив, длинной 10. Обратите внимание, что нумерация ячеек выполняется от 0 до 9.

Массив

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

Массив объявляется также, как и обычные переменные, но необходимо добавить квадратные скобки. Тип данных в начале объявления переменной массива определяет тип данных всех элементов массива.

int [] arr;
int arr2[];

А какое чему в таком случае будет равна переменная arr или arr2?

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

Инициализировать массив можно явным перечислением значений:

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

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

Второй способ инициализации массива более сложный для восприятия, но он приближает нас к миру ООП.

Так как любой массив является объектом класса, то для явного создания нам понадобится ключевое слово new.

int arr[] = new int[8];

Эта команда создаст массив arr, состоящий из восьми целочисленных элементов.

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

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

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

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int [] arr = {6,7,8,9,10};
System.out.println(arr[0]+" "+arr[3]);
arr[3]=0;
System.out.println(arr[0]+" "+arr[3]);

}
}

Обратите внимание, что нумерация элементов массива начинается с нуля!

В этом случае программа выведет в консоль следующее:

6 9
6 0

Т.к. массив – объект, то у него есть поля (переменные). Одно из них – это length. Бывают ситуации, что нам заранее неизвестна длина массива, тогда это поле нам очень пригодится.

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int [] arr = {6, 7, 8, 9, 10};
// кол-во элементов в массиве
int ln = arr.length;
System.out.println(ln);

}
}

На консоль будет выведено:

5

Чтобы заполнить массив значениями, введёнными с клавиатуры, нужно написать следующий код:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// количество элементов массива
int n = sc.nextInt();
// создаём массив
int[] arr = new int[n];
// в цикле n раз считываем соответствующие элементы
for (int i = 0; i < n; i++) {
// читаем i-ый элемент
arr[i] = sc.nextInt();
}

// выводим элементы массива
for (int a : arr) {
System.out.print(a + " ");
}
}
}

Попробуем решить следующую задачу

задача

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

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[] = new int[n];
for(int i=0; i<n; i++){
arr[i] = n-i+1;
}
}
}

Для чтения всех элементов массива создана специальная конструкция for-each. Дословно можно перемести как «для каждого».

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

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

for (int a : arr) {
sum += a;
}
System.out.println(sum);

Чтобы использовать for-each конструкцию, надо в скобках указать тип массива, потом имя временной переменной, потом «:», потом имя массива. Каждое выполнение тела цикла производится с новым значением переменной а, равным соответствующему элементу массива.

Теперь возникает вопрос: а что если уже после инициализации массиву присвоить значение второго массива?

int [] arr = {1,2,3,4,5};
int [] arr2 = {6,7,8,9,10};
arr = arr2;

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

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
int [] arr2 = {6,7,8,9,10};
arr = arr2;
for(int a: arr){
System.out.print(a+" ");
}
arr2[0] = 0;
System.out.println();
for(int a: arr){
System.out.print(a+" ");
}
}
}

Вывод в консоль будет следующий:

6 7 8 9 10
0 7 8 9 10

Рассмотрим задачу

info

Дан массив целых чисел, нужно проверить, все ли его числа положительны.

public class Main {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 2, 1};

// логическая переменная, которая отвечает на вопрос,
// все ли числа в массиве положительные
boolean f = true;

// в цикле n раз считываем соответствующие элементы
for (int i = 0; i < arr.length; i++) {
// если i-ый элемент отрицательный
if (arr[i] <= 0)
// меняем ответ на "нет"
f = false;
}

System.out.println(f ? "Да" : "Нет");

}
}

Задание

Во всех задачах нужно выполнить ту или иную проверку.

Требуется вывести только ДА или НЕТ.

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

Например, если вся программа имеет такой код:

public class Main {

public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 2, 1};

// логическая переменная, которая отвечает на вопрос,
// все ли числа в массиве положительные
boolean f = true;

// в цикле n раз считываем соответствующие элементы
for (int i = 0; i < arr.length; i++) {
// если i-ый элемент отрицательный
if (arr[i] <= 0){
// меняем ответ на "нет"
f = false;
// прерываем обработку (цикл)
break;
}
}

System.out.println(f ? "Да" : "Нет");

}
}

то в систему тестирования необходимо отправить только

        // логическая переменная, которая отвечает на вопрос,
// все ли числа в массиве положительные
boolean f = true;

// в цикле n раз считываем соответствующие элементы
for (int i = 0; i < arr.length; i++) {
// если i-ый элемент отрицательный
if (arr[i] <= 0){
// меняем ответ на "нет"
f = false;
// прерываем обработку (цикл)
break;
}
}

System.out.println(f ? "Да" : "Нет");
  1. Чередуются ли в нем положительные и отрицательные числа. Гарантируется, что нулей среди них нет.
  2. Проверить, что в массиве все элементы кратны пяти или больше 10310^3 по модулю.
  3. Есть ли в массиве хотя бы один отрицательный элемент
  4. Проверить, что массив упорядочен строго по возрастанию (каждый элемент массива больше своего левого соседа)
  5. Вывести на экран, все ли элементы массива не равны своим соседям.
  6. Напишите программу, которая проверяет, верно ли, что в массиве есть хотя бы одна строго возрастающая последовательность подряд идущих элементов, состоящая по крайней мере из четырех элементов.
  7. Проверить, можно ли изменить значение одного из элементов массива так, чтобы он стал упорядоченным по возрастанию

Ссылка на контест