Практики

09/04-9/10


1. 7 обязательных знаний и умений, которые должны быть у всех по результатам прошедшего семестра:
  1. .java-файл должен называться так же, как public-класс в нем. Поэтому рекомендация: файлов в проекте должно быть столько же, сколько классов (кроме редких случаев осознанного использования не-public классов).
  2. Функция main должна находиться в одном из public-классов. Создание вложенных классов (класс в классе), внутри которых main скорее всего, вообще не будет работать.
  3. Ни в какой момент времени у вас в программе не должно быть более одной ошибки компиляции. Прежде, чем продолжать писать код - исправьте все имеющиеся на данный момент ошибки. Если этого не делать - исправить потом все ошибки сразу не получится.
  4. При исправлении ошибок компиляции начинать нужно всегда с самой верхней (после ее исправления другие ошибки могут исчезнуть сами собой).
  5. Если текст сообщения об ошибке Вам не понятен, или ни о чем не говорит - попробуйте ввести его в поисковую строку Googl'а.
  6. Всегда форматируйте код с использованием отступов вложенных блоков. Как здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
  7. Справка по всем классам стандартной библиотеки java доступна на сайте java.sun.com по ссылке Java APIs. Это основной источник справочной информации по встроенным классам.

2. Среда Eclipse и отладчик

Примечание: в процессе выполнения перечисленных ниже шагов желательно подглядывать в более "полновесные" описания работы с Eclipse в интернете. Например: раз и два.

2.1 Как создать и запустить "проект"

1 Создайте себе папку на диске D.

2 Запустите Eclipse с рабочего стола (если нету - поищите eclipse.exe в c:\Program Files\Eclipse).

3 При запуске выберите в качестве "воркспейса" свою папку на диске D.

4 Создайте проект: File->New->Java Project.

5 Убедитесь, что в поле "Location" указан путь к папке, указанной в п.3.

6 Укажите имя проекта. Так как сегодня мы будем разбираться с отладчиком, логично это как-то отразить в названии ("debugger"). Finish.

7 Убедитесь, что проект с таким именем появился в project explorer'е в левой части экрана. Если на экране нет никакого project exolorer'а - см. window->show view->project explorer

8 Для создания класса нажмите правой кнопкой на папке src в проекте -> New -> Class. Eclipse попытается поместить класс в пакет с именем, как у проекта. Если это нежелательно - сотрите имя пакета.
9 Поставьте галочку "public static void main(String[] args)" - чтобы машинка сама сгенерировала функцию main. Finish.
10 В процессе программирования не забываем периодически сохряняться: Ctrl+s. При этом также происходит проверка синтаксиса, и ошибки подсвечиваются на полях.
11 Для запуска программы нажмите на "главном" классе правой кнопкой (в панельке Project Explorer'а) и выберите Run As->Java Application. В дальнейшем можно просто нажимать Ctrl+F11. Также см. меню Run.

2.2 Пошаговый отладчик
1 Скачайте пример плохо работающего класса вектор (промежуточный вариант д.з.№5 одного из ваших коллег): Vector.java.
2 С помощью проводника Windows скопируйте его в папку "src" вашего проекта (на диске D).
3 В Eclipse'е нажмите правой кнопкой на проект - выберите "Refresh". В проекте должен появиться Vector.java.
4 Попробуйте протестировать его на следующем коде:
Vector v = new Vector(3);
v.insert(10, 0);
v.insert(11, 1);
v.insert(12, 2);
v.print();
v.insert(13, 3);
v.print();
5 Чтобы понять, что происходит, запустите проект в отладчике: меню Run->Debug As->Java Application.
6 Спросите у соседа или преподавателя:
    а) Как смотреть текущие значения переменных.
    б) Как переходить к следующей строке. Как "заходить внутрь" вызова функции.
    в) Как просматривать стек вызовов.
    в) Как ставить breakpoint'ы и запускать программу в "самостоятельное выполнение" (пока не дойдет до breakpoint'а).

3. Задание на повторение

Вас взяли на работу в Samsung и поручили разработать программный модуль, отвечающий за ввод текста с помощью цифровой клавиатуры (например, на пульте телевизора - когда "2" соответствует букве a, "2" - букве b, "222" - букве "c", 3 - букве d и т.д.). Ваш модуль должен работать следующим образом:

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


Например, это может выглядеть так (назовем ваш класс TyperModule):

TyperModule tm = new TyperModule();
char[] digits = "44335557".toCharArray();
for(char d: digits){
    tm.press(d);
    if(tm.hasOutput())
        System.out.print(tm.getOutput());
}
tm.finish();            // indicate last keypress
if(tm.hasOutput())
    System.out.print(t.getOutput());
System.out.println();

1 Разработайте свой класс, который умеет так делать. Подумайте о возможности ввода пробела и повторения двух одинаковых букв подряд (совет: не надо в вашем классе следить за тайм-аутами; пусть лучше о тайм-аутах ему сообщают "снаружи").
2 Предусмотрите возможность "смены раскладки". Т.е. сделайте так, чтобы класс из п.1 ничего не знал о том, какие именно буквы на каких кнопках написаны. Пусть ему эту информацию поставляет какой-то другой класс.
3 Индикацию на экране промежуточных символов (т.е. a,b - пока юзер нажимает кнопку "2") пока что можно не делать. Хотя интересно было бы подумать, как это удобно реализовать.

Д.з.
  1. Поставить Eclipse и научиться им пользоваться.
  2. Программа для моделирования набора текста на цифровой клавиатуре (хочется ввести "hello world").

09/11-09/19

Внимание! Найдите в интернете или учебнике, как создавать потоки в Java (2 способа)! Почитайте официальную справку на класс Thread на сайте http://java.sun.com (и то, и другое, сильно пригодится)
  1. Создать два потока, выводящие на экран 10 чисел: от 0 до 9. Запустить их одновременно и посмотреть, в каком порядке будут выводиться числа.
  2. Запустить эту же программу повторно несколько раз - посмотреть отличия. При необходимости считать не до 10, а больше.
  3. Переделать программу так, чтобы один поток считал (можно не выводить на экран), а другой обрабатывал команды пользователя: 1) пуск счета; 2) выход.
  4. Добавить к предыдущему пункту "паузу" и "продолжить".
  5. С помощью wait и notify сделать модифицированную версию программы из п.1, в которой потоки выводят числа строго по очереди: 0,0,1,1,2,2...

Синхронизация

  1. С помощью synchronized-блока исключить одновременную работу потоков в программе из п.1 (выше) (т.е. сначала должен полностью отработать один поток, потом другой).
  2. Попробуйте реализовать паузу в программе из п.4 (см. выше) с помощью спин-блокировки ("активное ожидание"/spin-waiting/busy-waiting). Посмотрите, как как это повлияло на загрузку ЦПУ.
  3. Вычислить число Пи с помощью ряда Лейбница (как пример очень неэффективного способа вычисления Пи).

09/28-10/02

Строка (String) это массив символов (char). Каждый char - это двухбайтное число, задающее символ в кодировке UTF-16.
У строки есть методы codePointAt(int i) и toCharArray() - позволяющие получить эти числа.

1 Определите экспериментально (т.е. путем программирования), из каких кодов символов состоит строка "abc абв". Проанализируйте отличия кодов латиницы и кириллицы.

Чтобы записать строку в файл, надо преобразовать ее в массив байтов. Для этого существует метод getBytes(String encoding) - генерирующий байты в заданной кодировке. Список кодировок.

2 Сохраните строку "abc абв" в три разных ФАЙЛА в трех разных кодировках - UTF-8, WINDOWS-1251 и UTF-16. Откройте эти файлы в браузере (или "умном" текстовом редакторе) и проверьте корректность кодирования.

Для записи в файл используйте FileOutputStream и его метод write(byte[]).

3 При помощи DataOutputStream  запишите в файл строку "как есть" (без преобразования кодировки). Получится ли открыть результирующий файл как UTF-16? Что пишет об этом официальная документация?

4 Выполните задание из п.2 с помощью класса OutputStreamWriter.

10/12-10/16

  1. Воспользуйтесь классом Scanner для считывания информации из файла со списком желающих посещать курсы трактористов в селе Ивановка. Для хранения данных в программе используйте массив объектов класса Traktorist с тремя полями - фамилией, средним баллом аттестата и номером года обучения, на который он поступает (1 или 2). Первую строку файла при чтении необходимо пропустить - это заголовок таблицы. (скачать для Linux, скачать для Windows)
  2. Полученный массив объектов запишите в другой - бинарный - файл с помощью класса RandomAccessFile. Для записи объекта в файл удобнее всего сделать в классе специальный метод, который в качестве параметра принимает объект RandomAccessFile (или - лучше - интерфейсную ссылку DataOutput) и одно за одним записывает туда поля с помощью методов witeXXX().
  3. Попробуйте прочитать обратно получившийся бинарный файл (лучше - сразу n-ую запись, минуя предыдущие).
Советы:
Класс Scanner очень просто заставить читать из файла. Надо только воспользоваться нужным конструктором. См. справку на Java API.

10/19-10/23

Задание на сейчас:
Напишите программу для копирования файлов: из FileInputStream'а в цикле читается по 1 байту, которые тут же записываются в FileOutputStream. Измерьте (любмы способом - хоть ручным секундомером) скорость копирования. Затем "оберните" файловые потоки в BufferedInputStream/BufferedOutputStream - и измерьте скорость повторно.

10/26-10/30

AWT
Откройте главу 24 книги ШИЛДТА, пункт "Создание оконной программы" (стр. 757). Воспользуйтесь примером из книги, чтобы создать (в порядке наращивания возможностей):
  1. Пустое окно без реакций на какие-либо события.
  2. Окно, на котором рисуется строка "Hello, world" (все еще без реакции на события).
  3. Окно, которое реагирует на клики мышью ИЛИ нажатия клавиш на клавиатуре ИЛИ движение мыши (на ваш выбор). В качестве "реакции" - отображайте в окне нажатую букву (в случае с клавиатурой) или координаты мыши (в случае с мышью).
  4. То же, но чтобы при нажатии на "крестик" окно закрывалось, а программа завершалась.
Подсказка 1. Не нужно переписывать из учебника всю программу! Для реализации пункта 1 нужен только конструктор и main
Подсказка 2. Все, что необходимо знать про возможности AWT-компонентов, перечислено с справке на класс java.awt.Component:  https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html
Подсказка 3. В обработчике события (мыши или клавиатуры) рисовать ничего на окне не получится. Поэтому обработчик должен что-то поменять в классе и вызвать repaint() - после чего paint() "подхватит" изменения. Это общепринятый подход.
Подсказка 4. Правильно завершать программу вас научит следующая страница: https://docs.oracle.com/javase/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html

11/09-11/13

  1. Книга Шилдта, глава 13, простой апплет.
  2. Запустить апплет в браузере.
  3. Добавить анимацию - чтобы строка с текстом убегала в сторону (в отдельном потоке менять координаты и вызывать repaint()).

11/23-11/27

Задание:
  1. Создайте аккаунт для себя и репозиторий для своей курсовой на github.
  2. Установите на ПК git клиент (рекомендуется - консольный, с официального сайта git-scm.com)
  3. Клонируйте репозиторий с github'а локально.
  4. Сделайте один commit и push (см. доки).
Доки
  1. Основы git: https://git-scm.com/book/ru/v1/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git
  2. Туториал: https://try.github.io/levels/1/challenges/1
  3. Как настроить у себя на ПК: http://rogerdudler.github.io/git-guide/
  4. Неинтерактивный туториал чуть подлиннее: http://githowto.com/ru
  5. Длинный интерактивный туториал: http://pcottle.github.io/learnGitBranching/
ċ
Vector.java
(2k)
Dima Litvinov,
3 сент. 2017 г., 11:16
ċ
traktorists.txt
(0k)
Dima Litvinov,
12 окт. 2017 г., 23:31
ċ
traktorists_linux.txt
(0k)
Dima Litvinov,
13 окт. 2017 г., 4:13
Comments