мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Следующая версияСледующая версия справа и слева
java:elective [28/02/2013 14:09] nbazhenovjava:elective [20/11/2013 14:32] nbazhenov
Строка 1: Строка 1:
 +====== Семинары (2013-2014) ======
 +
 +  * [[java:elective:lesson_10_02_13|Занятие 1 (введение)]]
 +  * [[java:elective:lesson_10_09_13|Занятие 2 (задача о датах)]]
 +  * [[java:elective:lesson_10_16_13|Занятие 3 (римская система счисления)]]
 +  * [[java:elective:lesson_11_06_13|Занятие 4 (позиционные системы счисления)]]
 +  * [[java:elective:lesson_11_20_13|Занятие 5 (палиндромы)]]
 +
 +====== Семинары (2012-2013) ======
 +
 +  * [[java:elective:lesson1|Семинар 1 (введение)]]
 +  * [[java:elective:lesson2|Семинар 2 (задача о датах)]]
 +  * [[java:elective:lesson3|Семинар 3 (быстрая сортировка)]]
 +  * [[java:elective:lesson4|Семинар 4 (двусвязный список и задача Иосифа Флавия)]]
 +  * [[java:elective:lesson5|Семинар 5 (двоичные деревья поиска)]]
 +  * [[java:elective:lesson6|Семинар 6 (неориентированные графы и поиск в ширину)]]
 +
 ====== Полезные ссылки ====== ====== Полезные ссылки ======
  
Строка 4: Строка 21:
   * [[http://www.mindviewinc.com/downloads/TIJ-3rd-edition4.0.zip|Bruce Eckel, Thinking in Java, 3rd edition (zip archive)]]   * [[http://www.mindviewinc.com/downloads/TIJ-3rd-edition4.0.zip|Bruce Eckel, Thinking in Java, 3rd edition (zip archive)]]
   * [[http://parallels.nsu.ru/~kuznecov/JavaDoc/index.html|Зеркало JavaDoc]]   * [[http://parallels.nsu.ru/~kuznecov/JavaDoc/index.html|Зеркало JavaDoc]]
- 
-====== Семинар 1 ====== 
- 
-Перед началом работы рекомендуется прочитать уроки 1 и 2 из [[java:basics|Справочника по Яве]]. 
- 
-===== Пример 1.1 ===== 
- 
-Программа "Hello world" 
- 
-<code java> 
-package com.nsunc.wiki.nbazhenov; 
- 
-public class HelloWorld { 
- public static void main (String[] args){ 
- System.out.println("Hello, World!"); 
- } 
-} 
-</code> 
- 
-===== Пример 1.2 ===== 
- 
-В лекции 1 был показан пример класса, являющегося представлением электрической лампочки. Приведем здесь упрощенный вариант этого примера: 
-<code java> 
-package com.nsunc.wiki.nbazhenov; 
- 
-public class SimpleLight { 
- boolean state; 
- 
- boolean getState(){ 
- return state; 
- } 
-  
- void on(){ 
- state = true; 
- } 
-  
- void off(){ 
- state = false; 
- } 
-} 
-</code> 
- 
-===== Задание 1.1.A ===== 
- 
-Создайте пакет ''com.nsunc.wiki.вашЛогин''. В этом пакете создайте класс ''SimpleLight'', приведенный выше, и новый класс ''TestClass''. С помощью ''TestClass'' протестируйте работу методов класса ''SimpleLight''. Убедитесь в том, что Java присваивает значение полю ''state'' по умолчанию. 
- 
-===== Задание 1.1.B ===== 
- 
-Модифицируйте реализацию ''SimpleLight'' следующим образом: 
- 
-  - Добавьте в класс ''SimpleLight'' новые целочисленные поля ''brightness'' (яркость) и ''step'' (шаг). Сделайте так, чтобы значение поля ''step'' было по умолчанию равным 100. 
-  - Измените код существующих методов так, чтобы при включении лампочки ее яркость принимала значение 1000, а при выключении - 0. 
-  - Напишите метод ''dim()'' (терять яркость), производящий следующие действия: если яркость лампочки больше значения ''step'', то яркость уменьшается на ''step''; в противном случае лампочка выключается и в консоли печатается соответствующее сообщение. 
-  - Напишите метод ''brighten()'' (делать ярче), производящий следующие действия: если яркость лампочки не превосходит значения ''(1000-step)'', то яркость увеличивается на ''step''; в противном случае в консоли печатается сообщение об ошибке. 
- 
-Протестируйте работу методов класса ''SimpleLight''. 
- 
-//Замечание:// Лампочка считается включенной если и только если ее яркость больше нуля. 
- 
-===== Задание 1.1.С ===== 
- 
-Модифицируйте реализацию ''SimpleLight'' следующим образом: 
-  - Добавьте новое статическое целочисленное поле ''maxBrightness'' (максимальная яркость). Сделайте так, чтобы по умолчанию ''maxBrightness'' принимало значение 1000. 
-  - Измените код метода ''brighten()'', заменив 1000 на ''maxBrightness''. 
-  - Напишите 2 статических метода: ''getMaxBrightness()'' - возвращает значение ''maxBrightness''; и ''setMaxBrighness(int a)'' - устанавливает значение ''maxBrightness''. 
- 
-Продемонстрируйте работу статических методов. 
- 
-====== Семинар 2 ====== 
- 
-===== Арифметические операторы ===== 
-Основные арифметические операторы: сложение (''+''), вычитание (''-''), умножение (''*''), деление (''/''), остаток от деления нацело (''%''). 
- 
-Можно использовать сокращенную форму записи операторов: 
-<code java> 
-a += b; // a = a + b 
-a -= b; // a = a - b 
-a *= b; // a = a * b 
-a /= b; // a = a / b 
-a %= b; // a = a % b 
-</code> 
- 
-===== Операторы инкремента и декремента ===== 
- 
-Оператор инкремента записывается в виде ''++'' и означает "увеличить на единицу". Оператор декремента записывается в виде ''%%--%%'' и означает "уменьшить на единицу". Для каждого из операторов есть две версии: префиксная и постфиксная. 
- 
-<code java> 
-++a; // префиксная версия оператора инкремента 
-a++; // постфиксная версия оператора инкремента 
-</code> 
- 
-В префиксном варианте сначала выполняется операция, а затем выдается значение. В постфиксном варианте сначала выдается значение, и лишь затем выполняется операция. 
- 
-<code java> 
-int a = 0; 
-System.out.println("1. a = " + ++a); // напечатается: 1. a = 1 
-System.out.println("2. a = " + a++); // напечатается: 2. a = 1 
-</code> 
- 
-===== Операторы сравнения ===== 
- 
-Операторы сравнения: меньше (''<''), больше (''>''), меньше или равно (''%%<=%%''), больше или равно (''>=''), равно (''==''), не равно (''!=''). ''=='' и ''!='' применимы для всех примитивных типов данных, остальные не применимы к типу ''boolean''. 
- 
-===== Логические операторы ===== 
- 
-Основные логические операторы: ''&&'' (конъюнкция, AND), ''||'' (дизъюнкция, OR), ''!'' (отрицание, NOT). Логические операторы применимы только к значениям типа ''boolean''. 
- 
-===== Задание 2.1 ===== 
- 
-С клавиатуры вводится четыре натуральных числа: ''d'' (номер дня), ''m'' (номер месяца), ''y'' (номер года) и ''n''. Напечатайте в консоли дату, которая наступит через ''n'' дней после даты ''d.m.y''. 
- 
-//Пример:// Ввели следующие 4 числа: 2, 1, 2012, 58. Через 58 дней после 2 января 2012 года наступает 29 февраля 2012 года, поэтому в консоли должна быть напечатана следующая дата: ''29.02.2012''. 
- 
-//Замечание:// Год с номером ''y'' является високосным, если либо ''y'' кратно 4, но не кратно 100; либо ''y'' кратно 400. Например, 2000 -- високосный год, а 2100, 2200 и 2300 -- не високосные годы. 
- 
-====== Семинар 3 ====== 
- 
-===== Задание 3.1 ===== 
- 
-Реализовать алгоритм быстрой сортировки массива. 
- 
-Описание алгоритма можно найти [[http://algolist.manual.ru/sort/quick_sort.php|здесь]]. 
- 
-===== Указания к оформлению решения ===== 
- 
-  * Метод, реализующий быструю сортировку, должен быть записан в отдельном классе. Например, так: 
-<code java> 
-class MySort { 
- static void quickSort (/* Ваш список параметров */){ 
- // Ваш код  
- } 
-} 
-</code> 
-  * В методе ''public static void main(String[] args)'' //другого// класса в том же пакете создайте массив, заполните его случайными числами, напечатайте его, проведите сортировку и затем снова напечатайте массив. Например, так: 
-<code java> 
-import java.util.*; 
- 
-public class TestClass { 
- public static void main(String[] args){ 
- int size = 20; 
- int m[] = new int[size]; 
- 
- Random rand = new Random(); 
- for(int i = 0; i < size; i++) 
- m[i] = rand.nextInt(100); 
- 
- System.out.println(Arrays.toString(m)); 
-  
- MySort.quickSort(/* нужные параметры */); 
- System.out.println(Arrays.toString(m)); 
- } 
-} 
-</code> 
- 
-====== Семинар 4 ====== 
- 
-Классы и интерфейсы в языке Java могут быть шаблонными (generic), т.е. иметь типовые параметры. При создании объекта такого класса нужно указывать конкретные значения его типовых параметров. 
- 
-Пример использования generic-ов: классы, предназначенные для хранения упорядоченной пары и упорядоченной тройки объектов 
- 
-<code java> 
-public class TwoTuple<A,B> { 
- public final A first; 
- public final B second; 
- public TwoTuple(A a, B b) { first = a; second = b; } 
- public String toString() { 
- return "(" + first + ", " + second + ")"; 
- } 
-} 
- 
-public class ThreeTuple<A,B,C> extends TwoTuple<A,B> { 
- public final C third; 
- public ThreeTuple(A a, B b, C c) { 
- super(a, b); 
- third = c; 
- } 
- public String toString() { 
- return "(" + first + ", " + second + ", " + third +")"; 
- } 
-} 
-</code> 
- 
-Пример работы с этими классами: 
- 
-<code java> 
-TwoTuple<Integer, String> tuple0 = new TwoTuple<Integer, String>(new Integer(10), "text"); 
-System.out.println(tuple0.toString()); // напечатается (10, text) 
-ThreeTuple<Integer, String, Double> tuple1 = new ThreeTuple<Integer, String, Double>(new Integer(10), "text", new Double(0.1)); 
-System.out.println(tuple1.toString()); // напечатается (10, text, 0.1) 
-</code> 
- 
-===== Задание 4.1 ===== 
- 
-Приведем одну из возможных реализаций двусвязного списка: 
- 
-<code java> 
-public class MyLinkedList<E> { 
- private static class Node<E>{ 
- E element = null; 
- Node<E> next = null; 
- Node<E> previous = null; 
-  
- Node (E element){ 
- this.element = element; 
- } 
- } 
-  
- private Node<E> head = null; 
- private Node<E> tail = null; 
-  
- private int size = 0; 
-  
- public void addLast(E element){// добавляет новый элемент в конец списка 
- Node<E> tmpNode = new Node<E>(element); 
- if(tail == null){ 
- head = tmpNode; 
- tail = head; 
- } else{ 
- tail.next = tmpNode; 
- tmpNode.previous = tail; 
- tail = tmpNode; 
- } 
- } 
- 
- public String toString(){// "преобразует" список в строку 
- if(head == null) 
- return null; 
-  
- Node<E> tmpNode = head; 
- String tmpString = "[" + tmpNode.element.toString(); 
-  
- while (tmpNode != tail){ 
- tmpNode = tmpNode.next; 
- tmpString = tmpString.concat(", " + tmpNode.element.toString()); 
- }; 
- tmpString = tmpString.concat("]"); 
-  
- return tmpString; 
- } 
-} 
-</code> 
- 
-Пример использования: 
- 
-<code java> 
-MyLinkedList<Integer> list = new MyLinkedList<Integer>(); 
-for (int i = 0; i < 10; i++) 
- list.addLast(new Integer(i)); 
-System.out.println(list.toString());// напечатается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
-</code> 
- 
-Допишите следующие методы: 
-  - Добавление нового элемента в начало списка. 
-  - Удаление первого/последнего элемента. 
-  - Получение значения первого/последнего элемента. 
-  - Получение размера списка. 
-  - Получение значения ''i''-го элемента списка. 
-  - Удаление ''i''-го элемента списка. 
- 
-===== Указание к оформлению решения ===== 
- 
-Новые методы должны называться в соответствии с методами класса [[http://parallels.nsu.ru/~kuznecov/JavaDoc/api/java/util/LinkedList.html|java.util.LinkedList<E>]]. 
- 
-===== Задание 4.2 ===== 
- 
-С помощью получившегося двусвязного списка напишите решение [[http://www.cse.sc.edu/~maxal/josephus.pdf|задачи Иосифа Флавия]]. 
- 
-====== Семинар 5 ====== 
- 
-Информацию о двоичных деревьях поиска можно прочитать {{:java:kormen_p.236-245.pdf|здесь}}. 
- 
-===== Задание 5.1 ===== 
- 
-Приведем одну из возможных реализаций двоичного дерева поиска: 
- 
-<code java> 
-public class MyBinarySearchTree{ 
- private static class Node{ 
- Integer data = null; 
- Node parent = null; 
- Node left = null; 
- Node right = null; 
-  
- Node (int data){ 
- this.data = new Integer(data); 
- } 
- } 
-  
- private Node root; 
-  
- public MyBinarySearchTree(int data){ 
- root = new Node(data); 
- } 
-  
- public void treeInsert(int data){ 
- Node y = null; 
- Node x = root; 
-  
- while(x != null){ 
- y = x; 
- if(data < x.data.intValue()) 
- x = x.left; 
- else 
- x = x.right; 
- } 
-  
- Node z = new Node(data); 
- z.parent = y; 
-  
- if(y == null) 
- root = z; 
- else{ 
- if(data < y.data.intValue()) 
- y.left = z; 
- else 
- y.right = z; 
- } 
- } 
-  
- private Node treeSearch(Node x, int data){ 
- if(x == null || data == x.data.intValue()) 
- return x; 
- else if (data < x.data.intValue()) 
- return treeSearch(x.left, data); 
- else 
- return treeSearch(x.right, data); 
- } 
-  
- private Node treeSearch(int data){ 
- return treeSearch(root, data); 
- } 
-} 
-</code> 
- 
-Допишите методы ''inOrderTreeWalk'', ''treeMinimum'', ''treeMaximum'', ''treeSuccessor'', ''treePredecessor'', ''treeDelete'', описанные в {{:java:kormen_p.236-245.pdf|тексте}}.