Skip to content

Latest commit

 

History

History
395 lines (315 loc) · 15.1 KB

File metadata and controls

395 lines (315 loc) · 15.1 KB

Занятие 3. Синтаксис Java (II)

Побитовые операции

Побитовые операции работают непосредственно на уровне отдельных битов.

Побитовое И — &

int a = 12;  // 1100 в двоичной
int b = 10;  // 1010 в двоичной
int result = a & b; // 1000 → 8

// 1100 (12)
// 1010 (10)
// ----
// 1000 (8)

Побитовое ИЛИ — |

int a = 12;  // 1100
int b = 10;  // 1010
int result = a | b; // 1110 → 14

// 1100 (12)
// 1010 (10)
// ----
// 1110 (14)

Побитовое исключающее ИЛИ — ^

int a = 12;  // 1100
int b = 10;  // 1010
int result = a ^ b; // 0110 → 6

// 1100 (12)
// 1010 (10)
// ----
// 0110 (6)

Побитовое НЕ — ~

int a = 12;  // 0000 0000 0000 0000 0000 0000 0000 1100
int result = ~a; // 1111 1111 1111 1111 1111 1111 1111 0011 → -13

Битовый сдвиг влево — <<

int a = 5;   // 0101
int result = a << 2; // 010100 → 20

// Эквивалентно умножению на 2^n
// 5 * 2^2 = 20

Битовый сдвиг вправо — >>

int a = 20;  // 010100
int result = a >> 2; // 0101 → 5

// Эквивалентно делению на 2^n (с сохранением знака)
// 20 / 2^2 = 5

int negative = -8; // 1111 1000
int result2 = negative >> 2; // 1111 1110 → -2

Беззнаковый сдвиг вправо — >>>

int a = -1;  // 1111 1111 1111 1111 1111 1111 1111 1111
int result = a >>> 1; // 0111 1111 1111 1111 1111 1111 1111 1111 → 2147483647

Массивы

Массив — это упорядоченный набор элементов, хранящийся в непрерывной области памяти. Каждый элемент имеет целочисленный индекс.

Особенности массивов в Java:

  1. Фиксированный размер, т. е. длина массива задается при его создании и не меняется.
  2. Однотипность, т. е. все элементы одного типа
  3. Индексация начинается с 0.
  4. При выходе за границы массива выбрасывается исключение ArrayIndexOutOfBoundsException.
  5. Массивы являются объектами.

Объявление массивов

int myArray[] = new int[5]; // Объявить и создать массив типа int длинны 5
double[] numbers = new double[10]; // Объявить и создать массив типа double длинны 10

int n = 100; // Создать переменную типа int со значением 100 
String items[]; // Объявить массив строк
strings = new String[n]; // Создать массив строк длинны n = 100

Инициализация массивов

myArray[0] = 10;
myArray[1] = 20;
myArray[2] = 30;

numbers[0] = 1.0;
numbers[1] = 2.0;
numbers[2] = 3.0;

items[0] = "text 1";
items[1] = "text 2";
items[2] = "text 3";

Статическая инициализация массивов

// Объявить, создать и инициализировать массив типа char
char symbols[] = {'+', '-', '/', '%'};

// Объявить массив типа byte
byte[] bytes;

// Создать и инициализировать массив типа byte
bytes = new byte[]{-128, -127, -126, -125};

### Доступ к элементам массива

```java
// Считать значение элемента массива по индексу 0
String item = items[0];

// Присвоить значение элементу массива по индексу 0
items[0] = "new text";

// Перебрать массив
for (int i = 0; i < numbers.length; i++) {
    double number = numbers[i];
    System.out.println(number);
}

Многомерные массивы

Двумерные массивы:

int n = 2; int m = 3;

// Объявить и создать двумерный массив (n x m)-элементов типа double
double[][] matrix = new double[n][m];

// Заполнить массив случайными числами
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[0].length; j++) {
        matrix[i][j] = Math.random();
    }
}

Массивы размерности n, n > 2

// Объявить и создать трехмерный массив (3 x 3 x 2)-элементов типа int
int cube[][][] = new int[3][3][2];

// Заполнить трехмерный массив нулями
for (int i = 0; i < cube.length; i++) {
    for (int j = 0; j < cube[i].length; j++) {
        Arrays.fill(cube[i][j], 0);
    }
}

Статическая инициализация:

// Статическая инициализация двумерного массива (2 x 3)-элементов типа int 
int table[][] = {{1,-1,-1},{-1,0,0}};

Нерегулярные массивы

Нерегулярные массивы — это многомерные массивы, в которых внутренние массивы могут иметь разную длину.

Объявление и инициализация:

int[][] jaggedArray; // Объявление нерегулярного массива

// Создание внешнего массива
jaggedArray = new int[3][]; // размеры трех внутренних массивов пока еще не определены

// Создание внутренних массивов разной длины
jaggedArray[0] = new int[2]; // Первая строка - 2 элемента
jaggedArray[1] = new int[3]; // Вторая строка - 3 элемента  
jaggedArray[2] = new int[1]; // Третья строка - 1 элемент

Инициализация с заполнением поэлементно:

int[][] matrix = new int[3][];
matrix[0] = new int[]{1, 2};
matrix[1] = new int[]{3, 4, 5};
matrix[2] = new int[]{6};

Статическая инициализация:

int[][] jagged = {
    {1, 2},          // 2 элемента
    {3, 4, 5, 6},    // 4 элемента
    {7},             // 1 элемент
    {8, 9, 10}       // 3 элемента
};

Класс Arrays

Класс Arrays предоставляет полезные методы для работы с массивами.

import java.util.Arrays;

int[] numbers = {5, 2, 8, 1, 9};

// Сортировка
Arrays.sort(numbers); // [1, 2, 5, 8, 9]

// Бинарный поиск (только в отсортированном массиве)
int index = Arrays.binarySearch(numbers, 5); // 2

// Заполнение массива
Arrays.fill(numbers, 0); // [0, 0, 0, 0, 0]

// Копирование массива
int[] copy = Arrays.copyOf(numbers, numbers.length);

// Сравнение массивов
boolean equal = Arrays.equals(numbers, copy);

Вывод массивов в командную строку:

// Напечатать одномерный массив в командной строке
System.out.println(Arrays.toString(items));

// Напечатать двумерный массив в командной строке
for (int i = 0; i < matrix.length; i++) {
    System.out.println(Arrays.toString(matrix[i]));
}

// Напечатать трехмерный массив в командной строке
for (int i = 0; i < cube.length; i++) {
    for (int j = 0; j < cube[i].length; j++) {
        System.out.println(Arrays.toString(cube[i][j]));
    }
}

Управляющие инструкции

Инструкция switch

Аргумент инструкции switch — число, строка или перечисление.

Scanner scanner = new Scanner(System.in);
String status = scanner.nextLine();

switch (status) {
    case "accepted" :
        System.out.println("Принять");
        break;
    case "revision" :
        System.out.println("Доработать");
        break;
    case "declined" :
        System.out.println("Отклонить");
        break;
    default :
        System.out.println("Статус не определен");
}

Циклы

Цикл while (условие проверяется до итерации):

int count = 0;
while (count < 5) {
    System.out.println(count);
    count++;
}

Цикл do-while (условие проверяется после итерации):

do {
    System.out.println(count);
    count--;
} while (count >= 0);

Цикл for-each:

int[] array = {10, 20, 30, 40, 50};

for (int i: array) {
    System.out.println(i);
}

Инструкции перехода

Инструкция перехода break завершает цикл:

// Бесконечный цикл
for (;;) {
    double d = Math.random();
    System.out.println(d);
    if (d > 0.75)
        break; // Выход из цикла
}

Инструкция перехода continue завершает итерацию:

for (int i = 100; i > 0; i--) {
    if (i % 10 == 0)
        continue; // Выход из итерации
    System.out.println(i);
}

Задания

Задание 3-1 — 1 балл

  • Упорядочить элементы двумерного нерегулярного массива целых чисел по возрастанию сумм их элементов.
  • Использовать статистическую инициализацию нерегулярного массива. Внешний массив должен иметь размер не менее 5, внутренние массивы должны иметь разные размеры не менее 3.
  • Реализовать вывод исходного и упорядоченного массивов в командную строку.

Задание 3-2 — 1 балл

  • Найти сумму попарных расстояний Хэмминга между всеми элементами массива целых чисел. (Расстояние Хэмминга между двумя числами — это количество позиций, в которых биты различаются. Например, число 4 в побитовой записи "0100", а число 9 — "1001", сравниваем биты по позициям: 0≠1, 1≠0, 0=0, 0≠1, различаются 3 позиции, следовательно расстояние Хэмминга равно 3.)
  • Реализовать ввод элементов массива из командной строки в виде перечисления через запятую, например: "4, 9, 14, 2".
  • Реализовать вывод вычислений попарных расстояний Хэмминга в командную строку, например, в следующем виде:
DH(4, 9) = 3
DH(4, 14) = 3
DH(4, 2) = 1
...
DH(14, 2) = 2
  • Реализовать вывод общей суммы расстояний Хэмминга в командную строку.

Задание 3-3 — 2 балла

  • Реализуйте игру "Сапер" с использованием двумерных массивов. Игровое поле представляет собой матрицу, где каждая ячейка может быть либо пустой, либо содержать мину. Цель игры — открыть все пустые ячейки, не наступив на мину.
  • Реализовать ввод хода игрока и вывод результатов хода через командную строку.
  • Сопроводить программу Javadoc-коментариями
  • Сгенерировать документацию в формате HTML (с помощью команды javadoc).
  • Собрать проект в виде запускаемого JAR-файла.
  • Запустить полученный JAR-файл из командной строки.

Вопросы

  1. Как вы объявили массив?
  2. Как вы инициализировали массив?
  3. Как вы заполнили элементы массивы значениями?
  4. Как изменить размер вашего массива?
  5. Используете ли вы статическую инициализацию массивов в вашем коде?
  6. Является ли ваш массив нерегулярным?
  7. Как вы используете доступ к элементам массива?
  8. Какую размерность имеет ваш массив?
  9. Какой размер (длину) имеет ваш массив?
  10. Строки или столбцы матрицы представляют элементы вашего двумерного массива?
  11. Как вы сортируете элементы массива?
  12. Как вы выводите элементы массива в командную строку?
  13. Какие побитовые операции вы использовали?
  14. Какие циклы есть в вашем коде?
  15. Есть ли инструкции перехода в вашем коде?
  16. На какой цикл другого вида можно заменить цикл, который вы написали?
  17. Как работает инструкция break?
  18. Как работает инструкция continue?
  19. Как работает инструкция switch?
  20. В каком пакете находится ваш файл с исходным кодом?
  21. Какие классы были импортированы вами?
  22. В каком пакете находится ваш Main-класс?
  23. Какие классы вы импортировали в вашем коде?
  24. Как принято именовать классы?
  25. Какие локальные переменные вы объявили?
  26. Как вы инициализировали ваши локальные переменные?
  27. Какие блоки кода есть в вашем исходном коде?
  28. Какие простые типы данных используются в вашем коде?
  29. Какой тип данных имеет какая-либо переменная в вашем коде?
  30. Какой возвращаемый тип данных имеет какое-либо выражение (вычисляемая операция) в вашем коде?

Дополнительные ресурсы

  1. Расстояние Хэмминга
  2. Сапер (игра)