arrow-left

All pages
gitbookPowered by GitBook
1 of 4

Loading...

Loading...

Loading...

Loading...

2. Основы синатксиса Java

При разработке языка Java был взят за основу синтаксис языков С и C++, поэтому, многие аспекты синтаксиса языка покажутся вам знакомыми.

hashtag
Комментарии

В Java, как и в C, существуют однострочные и блоковые комментарии. Однако, кроме этого, согласно конвенции Oracle, существуют другие виды комментариев: copyright-блок вверху, doc-комментарии, TODO-комментарии, комментарии после statement`ов, комментарии для комментирования кода. Ознакомьтесь с принятыми правилами использования комментариев, на защите лабораторных они будут требоваться в обязательном порядке, согласно принятым конвенциям.

hashtag
Переменные

Переменные чувствительны к регистру (variable и Variable – две разные переменные), могут быть бесконечной длины, состоять из букв юникода и цифр юникода, символов _ и $.

Первый символ переменной может быть буквой, символом _ или $ (использовать _ или $ первым символом КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ, они существуют для специальных ситуаций, которые нас сейчас не интересуют, так что считайте, что начинаться переменная может только с буквы юникода). Крайне не рекомендуется использовать буквы национальных алфавитов, кириллицу, транслит. Только латинские буквы, названия на английском. Также, названия переменных не должны совпадать со списком зарезервированных слов, который представлен ниже.

Кроме ключевых слов в Java существуют три литерала: null, true, false, не относящиеся к ключевым и зарезервированным словам, а также зарезервированное слово var, значение которого зависит от его позиции в коде.

Приведенный ниже блок кода даст вам общее представление о том, как надо называть переменные

hashtag
Типы данных

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

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

Всего существуют восемь примитивных типов данных: int, long, short, byte, double, float, char, boolean. Их очень легко запомнить:

  • 4 типа для целых чисел («короткое short», «среднее int», «длинное long» и байт);

  • 2 типа для чисел с плавающей запятой (старая парочка double и float);

  • 2 «специальных» типа – символ и булевый тип.

hashtag
Операторы ветвления

Операторы ветвления в C и Java практически идентичны

hashtag
Циклы

Работа с циклами в Java мало чем отличается от языка C

hashtag
Массивы

Работа с массивами в Java несколько отличается от работы с массивами в C, в основном, из-за механизма выделения памяти под массивы.

hashtag
Методы

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

package ai201.ivanov;

/**
 * Это специальный комментарий для документирования (Doc comment).
 * С помощью специальной утилиты (javadoc), такие комментарии можно превратить в HTML-странички,
 * которые вместе создают документацию к вашей программе.
 * Для удобства, здесь можно использовать специальные ссылки {@link Main} и <i>HTML-тэги</i>
 */
public class Main {

    /**
     * Этот метод является "точкой входа" приложения. В проекте может быть только один метод с такой сигнатурой
     * @param args аргументы при запуске приложения
     */
    public static void main(String[] args) {

        // Это однострочный комментарий (single line comment)

        /*
         * Это комментарий в виде блока (block comment)
         */

        // TODO: это специальный TODO-комментарий. Тут можно описать, что нужно доделать на каком-то участке кода
        // FIXME: это тоже TODO-комментарий, обычно тут мелкие баги и что нужно исправить на данном участке кода

        // TODO:2019-09-03:NickGodov: дописать вывод данных в файл

        int my_variable = 5;            /* Комментарии после statement должны быть выровнены слева */
        int my_other_variable = 999;    /* с помощью табуляции */

        // Если нужно закомментировать код, то каждая строчка комментируется однострочным комментарием
//        int my_old_variable = 100;
//        int my_other_old_variable = 200;

        // Перед комментарием принято оставлять пустую строку
        int number = 924;
    }
}

boolean

do

if

private

this

break

double

implements

protected

throw

byte

else

import

public

throws

case

enum

instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp

volatile

const

float

native

super

while

record

var

yield

16 bit

0

short b = 10000;

int

-2^31

-2^31-1

32 bit

0

int a = 15;

int aHex = 0xaa;

int aBin = 0b0001111;

(это же справедливо и для byte,short,long, если соблюдать диапазоны)

long

-2^63

-2^63-1

64 bit

0L

long number = 10000L;

double

4.9^-324

~1.8^308

64 bit

0.0d

double d = 6.6;

float

~1.4^-45

~3.4^38

32 bit

0.0f

float f = 5.5f;

char

0

65535

16 bit

'\u0000'

char c = ‘f’;

char c = 63;

char c = '\u2422';

boolean

false

true

1 bit

false

boolean b = true;

abstract

continue

for

new

switch

assert

default

goto

package

Type

Min

Max

RAM

Default

Объявления и литералы

byte

-128

127

8 bit

0

byte b = 100;

short

-32,768

synchronized

32,767

int spd         = 25;   // ПЛОХО: Можно, но не рекомендуется, т.к. название не информативно
int carminspd   = 25;   // ПЛОХО: Не экономьте на названиях переменных!
int carMinSpeed = 25;   // ХОРОШО: Название переменной говорит само за себя

int s = 0; // МОЖНО: однобуквенные допускаются, только если это какие-то короткоживущие бросовые переменные

int speed = 150;    // ХОРОШО: Нормально, понятно, что переменная отвечает за скорость
int Speed = 150;    // ПЛОХО: Крайне не рекомендуется, переменные не должны начинаться с капса
int SPEED = 150;    // ПЛОХО: Крайне не рекомендуется, полностью капсом пишутся константы

const int MIN_SPEED = 25; // НЕЛЬЗЯ: в Java const не используется (хотя это зарезервированное слово)
final int MIN_SPEED = 25; // ХОРОШО: в Java для констант используется final

int моя_переменная   = 356;   // ПЛОХО: Только латиница
int DŽDžDzȯȺώϷЂ        = 145;   // ПЛОХО: Только латиница
int moya_peremennaya  = 29;    // ПЛОХО: Транслит - это полный моветон, только английский!

int $myvar = 100;   // ПЛОХО:  Теоретически можно, но НЕ РЕКОМЕНДУЕТСЯ
int _myvar = 100;   // ПЛОХО:  Теоретически можно, но НЕ РЕКОМЕНДУЕТСЯ
int 2pac   = 0;     // НЕЛЬЗЯ: с цифры начинать нельзя
int %d     = 5;     // НЕЛЬЗЯ: с других знаков начинать нельзя
int 'f'    = 5;     // НЕЛЬЗЯ: с кавычек начинать нельзя

// Если название переменной состоит из двух слов
int max_speed       = 150;  // ПЛОХО: Использовать _ для отделения слов не в константах не рекомендуется
int MaxSpeed        = 150;  // ПЛОХО: Крайне не рекомендуется, переменные не должны начинаться с заглавной буквы
int maxSpeed        = 150;  // ХОРОШО: Вот так нормально, используется lowerCamelCase
final int MAX_SPEED = 150;  // ХОРОШО: Константы пишутся капсом, каждое слово отделяется _
int a = 5;
int b = 4;
int min;

// Так нужно оформлять обычный if
if (a >= b) {
    min = b;
}

// Так нужно оформлять if-else
if (a >= b) {
    min = b;
} else {
    min = a;
}

// Так нужно оформлять if-else if-else
if (a > b) {
    min = b;
} else if (a < b) {
    min = a;
} else {
    min = a;
}

// В Java используется тернарный оператор
min = (a >= b) ? b : a;

// Это равнозначно следующему выражению
if (a >=b) {
    min = b;
} else {
    min = a;
}

// Так оформляется switch
switch (a) {
    case 1:
        // что-то делаем
        break;
    case 2:
        // делаем что-то другое
        break;
    default:
        // это выполняется в том случае, если ни одно из кейсов не выполнился
}
int progression = 0;

// Так оформляется for
for (int i=0; i < 5; i++) {
    progression +=i;
}

// ПЛОХО: так оформлять циклы не рекомендуется
for (int i=0; i < 5; i++) progression +=i;

// МОЖНО: если тело цикла состоит из одного statement'а, то можно опустить
// фигурные скобки
for (int i=0; i < 5; i++)
    progression +=i;

// Пустой for
for (int j=0; j < 10; j++);

// Так оформляется while
int iterator = 0;
while (iterator < 10) {
    // делаем что-то в цикле
    iterator++;
}

// Так оформляется do-while
int loops = 10;
do {
    // что-то делаем
    loops--;
} while (loops > 0);

// Также, в Java есть аналог foreach
int[] array = { 1, 2, 3, 4, 5 };
int sum = 0;
for(int i : array) {
    sum += i;
}

// Этот же цикл можно представить обычным for`ом
for(int i = 0; i < 5; i++) {
    sum += array[i];
}
// Объявление массивов

/*
 * ХОРОШО: согласно всем соглашениям по коду и различным рекомендациям, квадратные скобки
 * ставят ПОСЛЕ ТИПА ДАННЫХ
 */
int[] goodArray;

/*
 * ПЛОХО: компилятор не выдаст ошибку, но такой синтаксис делает код менее читабельным
 */
int badArray[];

/*
 * НЕЛЬЗЯ: при объявлении массива нельзя указать его размерность.
 * Java не выделит память, пока массив не будет инициализирован
 */
int[5] anotherBadArray;

// Объявления многомерных массивов

int [][] twoDimensionalArray;
int [][][] threeDimensionalArray;

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

goodArray = new int[10];    // Инициализируем массив с 10 элементами
goodArray[0] = 15;          // Присваиваем значение первому элементу массива
goodArray[1] = 25;          // Присваиваем значение второму элементу массива

twoDimensionalArray = new int [5][4];   // Двумерный массив 5х
twoDimensionalArray[0] = new int[4];
twoDimensionalArray[1] = new int[8];    // ПЛОХО: Компилятор проглотит, но по факту выделится место всего под 4 инта
twoDimensionalArray[0][0] = 1; // Присваиваем значение
twoDimensionalArray[1][5] = 5; // НЕЛЬЗЯ: Компилятор выдаст ошибку

System.out.print(twoDimensionalArray[1][6]); // НЕЛЬЗЯ: Компилятор выдаст ошибку

// Объявление с инициализацией

int[] quickArray = {1, 2, 3 ,4};    // Объявляем и сразу заполняем данные. Компилятор выделит место под 4 инта
quickArray[5] = 6;                  // НЕЛЬЗЯ: Компилятор выдаст ошибку, т.к. индекс выходит за пределы массива

int[][] quick2DArray = {
        {1 ,2 ,3},
        {1, 3, 4}
};
/*
 * Синтаксис функции:
 * [1-модификаторы доступа] [2-тип возвращаемого значения] [3-имя]([4-аргументы]) [5-список исключений] {
 *      6- тело функции
 * }
 *
 * 1 - модификаторы доступа: на данный момент они нас не интересует, можно ничего не писать или писать private
 * 2 - тип возвращаемого значения - тип данных либо void, если функция ничего не возвращает
 * 3 - ограничения как и на имена переменных, но есть дополнительные правила наименования, о них ниже
 * 4 - список аргументов через запятую. Например (int a, double b). Если нет аргументов - пустые скобки
 * 5 - исключение пока не рассматриваем, если их нет, то просто ничего не пишут
 * 6 - тело функции, в нем происходит выполнение функции. Если есть возвращаемый тип данных - должен быть return
 */
private int findMinimum(int a, int b) {
        int min;

        min = (a < b) ? a : b;
        return min;
        }

/*
 * Название метода начинается с маленькой буквы, если несколько слов - используется lowerCamelCase.
 * Первое слово должно быть глаголом (т.к. метод, как правило, "что-то делает"), остальные слова могут быть
 * прилагательными, существительными и тд. Символ _ крайне желательно не использовать (кроме юнит-тестов)
 */

// ХОРОШО: с маленькой буквы, первое слово - глагол
private void drawCircle() {}

// ПЛОХО: Символы $ и _ не используем
private void $er () {}

// ПЛОХО: используйте camelCase для названия методов
private void draw_circle () {}

// ПЛОХО: название метода должно начинаться с маленькой буквы
private void Draw() {}

// ПЛОХО: первое слово должно быть глаголом
private void circle() {}

1. Установка программного обеспечения, создание и запуск проекта

Для работы с Java, вам нужно установить JDK и среду разработки.

hashtag
Установка JDK

Java Development Kit (сокращенно JDK) — бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).

Для установки JDK необходимо скачать установщик по следующей (также вы можете загуглить "download jdk" и перейти по первой ссылке).

Установка JDK, как правило, проходит без проблем, настраивать параметры установки не требуется.

hashtag
Установка среды разработки

Интегрированная среда разработки (Integrated development environment — IDE) — комплекс программных средств, используемый программистами для разработки программного обеспечения.

Для Java существует "большая тройка" сред разработки:

  • ​​

  • ​​

  • ​​

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

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

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

В процессе установки желательно выбрать следующие параметры установки

hashtag
Добавление плагинов для выполнения лабораторной работы

Кроме установки среды разработки, нам необходимо добавить дополнительные плагины - EduTools и CheckStyle.

Запустим IntelliJ IDEA, после чего выберем пункт Configure -> Plugins.

Найдите в поисковой строке EduTools и установим его.

После этого введем в поисковой строке CheckStyle и также установим его. После этого необходимо перезапустить среду разработки.

hashtag
Создание проекта и запуск приложения

При первом запуске вас попросят выбрать цветовую схему среды разработки. Остальные параметры можете опустить. В стартовом окне выбираем пункт "Create New Project".

В следующем окне обратите внимание, что вас просят выбрать JDK, который будет использован в вашем проекте.

Нажмите кнопку "New..." и укажите путь к установленному ранее JDK (как правило, это C:\Program Files\Java\xxxx)

В следующем окне выбираем пункт "Create project from template" и выбираем "Command Line App"

Далее нам необходимо указать название проекта, а также Base Package проекта. Далее мы разберемся, что означает термин package, а пока можете указать его в формате [группа].[фамилия]

После завершения мастера нового проекта, IDEA сгенерирует новый пустой проект. Сразу запустим проект. Для этого можно выбрать пункт Run -> Run "Main", нажать комбинацию клавиш Shift+F10 либо нажать на зеленый треугольник справа в верхней части редактора.

ссылкеarrow-up-right
IntelliJ IDEAarrow-up-right
NetBeansarrow-up-right
Eclipsearrow-up-right

Задание на лабораторную работу

file-archive
4KB
javalab1.zip
archive
arrow-up-right-from-squareOpen

hashtag
Как выполнять лабораторную работу

Скачайте архив с заданием на первую лабораторную работу.

Откройте IntelliJ IDEA (предварительно установите плагин EduTools), выберите пункт Learn and Teach -> Import Local Course

Выберите архив с заданием

Откройте задание с помощью кнопки Open

Задание на лабораторную работу состоит из 7 задач, которые необходимо решить

Для решения каждой задачи требуется написать код для метода и вернуть правильное значение. Условие работы метода описано в правой части окна. После написания кода, нажмите кнопку Check, чтобы проверить, правильно ли вы реализовали метод.

hashtag
Пример выполнения лабораторной работы

Давайте рассмотрим выполнение лабораторной работы на примере первой задачи.

Нам необходимо реализовать метод sleepIn(). Согласно условию задачи, метод принимает на вход булеву переменную weekday (будний ли день) и переменную vacation (отпуск или нет).

Давайте нажмем кнопку Check и посмотрим, что произойдет.

Как мы видим, изначально задача не решена, нам необходимо корректно реализовать метод.

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

Проверим правильность написания кода.

Ура, задача решена. Для успешной сдачи лабораторной работы необходимо выполнить все 7 задач.

hashtag
Условия задач

На всякий случай, продублируем условия задач на первую лабораторную работу

hashtag
1. Метод sleepIn()

Метод sleepIn() принимает решение о том, необходимо ли нам проснуться или можно еще поспать. Нужно проснуться, если будний день и нет отпуска

  • Параметр weekday определяет, будний ли день

  • Параметр vacation определяет, отпуск или нет

Метод возвращает true, если можно еще поспать и false в обратном случае

hashtag
2. Метод closeToTen()

Дано два числа, метод closeToTen() возвращает число, которое наиболее близко к 10. Если оба числа равноблизки к 10, то метод возвращает 0.

Подсказка: используйте метод Math.abs() для получения абсолютного значения числа. Пример:

  • closeToTen(8, 13) -> 8 (число 8 ближе к 10)

  • closeToTen(8, 11) -> 11 (число 11 ближе к 10)

  • closeToTen(13, 7) -> 0 (оба числа равноблизки к 10)

hashtag
3. Метод reverseArray()

Метод принимает на вход массив и возвращает массив в обратном порядке

Пример:

  • reverseArray([1,2,3]) -> [3,2,1]

  • reverseArray([7,0,0]) -> [0,0,7]

hashtag
4. Метод biggestArray()

Метод принимает на вход два массива и возвращает массив, сумма элементов которого больше. Если суммы элементов массивов равны, метод возвращает первый массив.

Пример:

  • biggestArray([1,2,3], [1,2,4]) -> [1,2,4]

  • biggestArray([1,5,10], [15]) -> [1,5,10]

  • biggestArray([2,4,6], [10,2]) -> [2,4,6]

hashtag
5. Метод seriesUp()

Метод принимает на вход число n >=0. Метод возвращает массив по шаблону {1, 1,2, 1,2,3, ...1,2,3..n}. Длина итогового массива = n*(n+1)/2

Пример:

  • seriesUp(3) -> [1, 1, 2, 1, 2, 3]

  • seriesUp(4) -> [1, 1, 2, 1, 2, 3, 1, 2, 3, 4]

  • seriesUp(2) -> [1, 1, 2]

hashtag
6. Метод canSplit()

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

Пример:

  • canSplit([1, 1, 1, 2, 1]) -> true ([1,1,1] [2,1])

  • canSplit([2, 1, 1, 2, 1]) -> false

  • canSplit([10, 1, 2, 3, 4]) -> true ([10] [1,2,3,4])

hashtag
7. Метод scoresIncreasing()

Дан массив, метод возвращает true если каждый элемент массива равен или больше предыдущему

Пример:

  • scoresIncreasing([1, 3, 4]) -> true

  • scoresIncreasing([1, 3, 2]) -> false

  • scoresIncreasing([1, 1, 4]) -> true

hashtag
Проект - игра "Крестики-нолики"

Реализуйте игру "Крестики-нолики". В игру играют два человека, поочередно вводя координаты поля, куда необходимо поставить крестик или нолик. Ввод происходит в формате [строка] [столбец]. Например: 0 0 или 1 2.

Сценарий игры будет примерно следующим

Ниже представлен возможный вариант метода для отрисовки поля. В данном случае подразумевается, что в двумерном массиве число 0 соответствует пустому полю, число 1 соответствует X, а число - 1 соответствует 0.

Блок-схема алгоритма программы может быть примерно следующей.

circle-exclamation

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

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

public boolean sleepIn(boolean weekday, boolean vacation) {
    return !weekday || vacation;
}
---------
|       |
|       |
|       |
---------
First player: 0 0
---------
| X     |
|       |
|       |
---------
Second player: 1 1
---------
| X     |
|   0   |
|       |
---------
First player: 0 1
---------
| X X   |
|   0   |
|       |
---------
Second player: 2 2
---------
| X X   |
|   0   |
|     0 |
---------
First player: 0 2
First player won!

Process finished with exit code 0
Main.java
    public static void drawField(int[][] array) {
        System.out.println("---------");
        for (int i = 0; i < 3; i++) {
            System.out.print("| ");
            for (int j = 0; j < 3; j++) {
                String symbol = " ";
                if (array[i][j] != 0)
                    symbol = array[i][j] == 1 ? "X" : "0";
                System.out.print(symbol + " ");
            }
            System.out.println("|");
        }
        System.out.println("---------");
    }

Лабораторная работа 1

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

hashtag
Тема: Установка программного обеспечения. Базовый синтаксис Java.

hashtag
Цели лабораторной работы:

  • установить программное обеспечение для программирования на языке Java;

  • изучить базовый синтаксис языка Java и сравнить его с языком C;

  • реализовать несколько тестовых задач на языке Java.