Язык программирования Java

Java

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

С середины 2000-х команды - чемпионы мира из ИТМО пишут решения всех задач на Java. Всё больше команд используют этот язык на Всероссийской олимпиаде школьников.

Установка Java

Java Development Kit (JDK)

Бесплатно распространяемый комплект для Java, включающий в себя:

В состав JDK не входит интегрированная среда разработки на Java (IDE), поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки или стороннюю IDE.

Все современные интегрированные среды разработки на Java, такие, как NetBeans, Sun Java Studio Creator, IntelliJ IDEA, Borland JBuilder, Eclipse, опираются на сервисы, предоставляемые JDK. Большинство из них для компиляции Java-программ используют компилятор из комплекта JDK. Поэтому эти среды разработки либо включают в комплект поставки одну из версий JDK, либо требуют для своей работы предварительной инсталляции JDK на машине разработчика.

Источник для установки: http://www.oracle.com/technetwork/java/javase/downloads/index.html, далее скачать Java Platform (JDK).

Первая программа на Java в IntelliJ Idea

Установка IntelliJ Idea

Источник для установки: http://www.jetbrains.com/idea/ - на странице http://www.jetbrains.com/idea/download/index.html можно бесплатно скачать Community Edition, которая для решения задач не уступает полной версии.

Создание первой программы ("Hello world!")

Жмем Create New Project

Выбираем Create project from scratch

Название проекта - произвольное. При решении задач можно использовать один проект для решения всех задач.

Опционально, но для удобства создаб\ют отдельную папку src

При первом включении IntelliJ IDEA, программа попросит указать путь к JDK (чаще всего C:\Program Files\Java\jdk*.*.*_**)

При создании проекта для решения задач этот шаг опускается.

//file name - HelloWorld.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello world!"); // вывод строки в консоль
  }
}

 

Первая программа на Java в Eclipse

Eclipse - Среда разработки для Java

Для работы необходимо установить JDK.

Источник для установки: http://www.eclipse.org/downloads/, выбрать Eclipse IDE for Java Developers, скачать его, распаковать zip-архив в прозвольную папку, зайти в неё и запустить eclipse.exe.

Eclipse

Название проекта - произвольное. При решении задач можно использовать один проект для решения всех задач.

ddd

Создаём файл проекта:

ss

Введите название вашего класса, например Main, выделите создавать static void main(String[] args)

ss

/*
  * Весь текст, который находится между косой чертой и звездочкой и до
  * звездочки с косой чертой считается коментарием и никак не влияет на работу
  * программы.
  * Коменнтарии нужны, что бы человек мог поставить различные пометки по тексту
  * программы, что бы потом быстрее разобратся.
  * Кроме того коментарием считается строка начинающаяся с двух косых черт // и
  * до конца строки
  */
package example; // Имя пакета. Оно означает что наш файл лежит в папке src/example/

 /**
  * Обычно перед началом класса пишут описательный коментарий о нем
  * и указывают авторство
  * @author fbasin
  */
public class MainClass { // Заголовок класса состоит из трех частей. «Указатель доступа»
  // «ключевое слово class» «Имя класса»

 /**
  * По правилам хорошего тона перед каждым методом надо писать коментарий с
  * описанием метода принимаемыми параметрами и возвращаемым результатом
  * @param args the command line arguments
  */
public static void main(String[] args) { // Структура заголовка метода следующая:
  // «Указатель доступа» «Признак статичного доступа» «Возвращаемый результат»
  // «Имя класса» «Принимаемые параметры»
  // TODO code application logic here
  } // Завершение метода
} // Окончание описания класса.

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

Переменные

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

Каждая переменная имеет два атрибута:

Имя переменной - должно быть уникальным в области видимости и начинатся с буквы.

Тип переменной - указывает на то, какой тип значений может буть сохранен в переменной. Простейшие типы, целое число, дробное число, логическое значение да/нет.

Типы данных языка Java

Для всех простейших встроенных типов Java существуют классы-обертки, в которые включены полезные методы, например подсчет количества бит в числе, конвертация строки в число.

Целочисленные типы

Вещественные типы

Логические типы

Символьные типы

Строчные типы

Примеры программ

Программа "Hello world!"

public class Test {
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}

Решение задачи "A+B" с консольным вводом/выводом.

Main_stdin.java

Решение задачи "A+B" с вводом из файла sum.in и выводом в файл sum.out.

Main.java

Решение задачи "A+B" с длинными числами и вводом из файла sum.in и выводом в файл sum.out. Используется встроенный класс BigInteger.

Main.java

Организация ввода/вывода при помощи класса BufferedReader

Использование классов BufferedReader и StringTokenizer позволяет существенно ускорить считывание.
Pattern.java

Конструкции языка Java

import java.io.File;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
  static int addOne(int a) {
    return a + 1;
  }

  public static void main(String[] args) throws Exception {
    Scanner in = new Scanner(new File("F1.in")); // Открываем входной файл
    PrintWriter out = new PrintWriter(new File("F1.out")); // Открываем
                                                           // выходной файл

    // Объявление переменных

    // Целые типы
    int c = 2, C = 5; // "C" и "с" - разные переменные
    System.out.println(c + C);
    long L = 21423412412534L;
    System.out.println(long.class.isPrimitive() + " " + L);

    // Нецелые типы
    float ff = 2;
    double dd = 2.123414;
    System.out.println(" " + ff + " " + dd);

    // Булевы переменные
    boolean b1 = true, b2 = false;
    System.out.println("b1 = " + b1 + " b2 = " + b2);

    // Строки и символы
    String s = "Test string"; // Используются двойные кавычки для строк
    char ch = 'c';
    System.out.println("s = " + s + " ch = " + ch);

    // Массив целых чисел
    int A[] = { 2, 3, 4, 36 }; // Инициализация массива "сразу"
    for (int element : A)
      // foreach
      System.out.println(element);
    for (int i = 0; i < A.length; i++)
      System.out.println(i + ". " + A[i]);
    int N = 100;
    long B[] = new long[N]; // Заводим в памяти массив на N значений
    // Индексами массива будут числа 0..N-1
    B[0] = 1;
    B[1] = 1;
    for (int i = 2; i < N; i++)
      // Цикл for
      B[i] = B[i - 1] + B[i - 2];
    System.out.println(B[N - 1]);

    // Вычисляем 100! (факториал)
    BigInteger S = new BigInteger("1");
    for (int i = 1; i <= 100; i++)
      S = S.multiply(new BigInteger("" + i));
    System.out.println(S);

    // Условия (условный оператор)
    if (ch == 's' && b2) { // && - AND, || - OR, ! - NOT
      // Действия по выполнению условия
    } else {
      // Действия в противном случае
    }

    // Неверно, что символ ch равен 'b' и ff больше 2
    if (!(ch == 'b' && ff > 2)) { // "=" - присваивание, "==" - сравнение
    }

    // Переведём число K в двоичный вид
    // Цикл с предусловием
    int K = 20;
    while (K > 0) { // Пока K > 0
      // Печатаем K
      System.out.println(K % 2);
      // И делим нацело на 2
      K /= 2; // K = K / 2
    }

    // Цикл с постусловием
    int x = 1;
    do {
      // Печатаем K
      System.out.println(x);
      x *= 2; // x = x * 2
    } while (x < 100);

    // Преобразования строки в число
    int i = Integer.parseInt("213");
    long l = Long.parseLong("213");
    double d = Double.parseDouble("213.2");
    float f = Float.parseFloat("213");
    boolean b4 = Boolean.parseBoolean("true");
    System.out.println(i + " " + l + " " + d + " " + f + " " + b4);

    // Вызов функции
    System.out.println(addOne(3));

    BigInteger a = in.nextBigInteger(), b = in.nextBigInteger();
    out.println(a.add(b));
    in.close();
    out.close();
  }
}

Реализация динамического стека

// - Символ -
class charValue implements Value {
  char value;

  charValue(char v) {
    value = v;
  };

  @Override
  public void show() {
    System.out.println("Char = " + value);
  }
};

// - Действительное число (double) -
class doubleValue implements Value {
  double value;

  doubleValue(double v) {
    value = v;
  };

  @Override
  public void show() {
    System.out.println("Double = " + value);
  }
}

// - Целый тип -
class intValue implements Value {
  int value;

  intValue(int v) {
    value = v;
  };

  @Override
  public void show() {
    System.out.println("Integer = " + value);
  }
}

// - Управление стеком -
class Stack {
  stackElement head;

  boolean is_empty() {
    return head == null;
  };

  stackElement pop() {
    stackElement current = head;
    if (head != null)
      head = head.next;
    return current;
  };

  void push(Value v) {
    stackElement se = new stackElement(v);
    se.next = head;
    head = se;
  };

  void show() {
    System.out.println("Stack elements:");
    stackElement current = head;
    if (current != null)
      while (current != null) {
        current.value.show();
        current = current.next;
      }
    else
      System.out.println("Stack in empty!");
  };
}

public class StackDemo {
  public static void main(String arg[]) {
    System.out.println("- Stack demo -");
    Stack s = new Stack();
    // Добавляем элементы
    s.push(new intValue(1));
    s.push(new stringValue("Test 2"));
    s.push(new charValue('@'));
    s.push(new doubleValue(3.14159265386));
    // Выводим содержимое стека на экран
    s.show();
    // Удаляем из стека все элементы
    while (!s.is_empty())
      s.pop();
    // Еще раз выводим содержимое стека на экран
    s.show();
  };
}

// - Элемент стека -
class stackElement {
  Value value;
  stackElement next; // Следующий элемент стека;

  stackElement(Value v) {
    value = v;
  }
}

// - Обработчик исключений стека -
class StackException extends Exception {
  StackException(String errorMessage) {
    super(errorMessage);
  };
};

// - Строка -
class stringValue implements Value {
  String value;

  stringValue(String v) {
    value = v;
  };

  @Override
  public void show() {
    System.out.println("String = " + value);
  }
};

// - Значение в стеке -
interface Value {
  void show(); // Можно выводить на экран
}

Преимущества языка Java

Garbage Collector - система которая автоматически удаляет неиспользуемые объекты из динамической памяти. Поэтому на Java не нужно думать о ручном освобождении памяти.

Пример на Java "Скотный двор"

Дано прямоугольное поле NxN клеток, надо расставить на нём M животных, так чтобы они не пересекались. Животные могут ходить на одну клетку влево, вправо, вперёд, назад.

// Файл Animals.java
public class Animals {

  public static void main(String[] args) {
    // Наш скотный двор
    int Size = 10;
    char[][] Map = new char[Size][Size];
    // Сначала всё поле пустое
    for (int i = 0; i < Size; i++)
      for (int j = 0; j < Size; j++)
        Map[i][j] = ' ';
    int M = 7; // Количество животных
    for (int animal = 1; animal <= M; animal++) {
      nextAnimal: // Метка для перехода
      // Ищем свободную клетку
      for (int i = 0; i < Size; i++) {
        for (int j = 0; j < Size; j++) {
          if (Map[i][j] == ' ') { // Если клетка свободна, становимся в неё
            Map[i][j] = (char) ('0' + animal);
            // Занимаем клетки вокруг
            if (i > 0)
              Map[i - 1][j] = '#';
            if (i < Size - 1)
              Map[i + 1][j] = '#';
            if (j > 0)
              Map[i][j - 1] = '#';
            if (j < Size - 1)
              Map[i][j + 1] = '#';
            // Переходим к расстановке следующего животного
            break nextAnimal;
          }
        }
      }
    }
    // Показываем поле
    for (int i = 0; i < Size; i++) {
      for (int j = 0; j < Size; j++)
        System.out.print(Map[i][j]);
      System.out.println();
    }
  }
}  

 

class HelloWorld {
  public static void main(String[] arg) {
    System.out.println("Таблица умножения:");
    for(int i=1;i<=29;i++){
      for(int j=1;j<=29;j++){
        String s = " "+(i*j);
        while(s.length() < 4) s = " " + s;
        System.out.print(s);
      }
      System.out.println();
    }      
  }  
}