Практики

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 - и измерьте скорость повторно.

ċ
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