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

Это старая версия документа!


Полезные ссылки

Семинар 1

Перед началом работы рекомендуется прочитать уроки 1 и 2 из Справочника по Яве.

Пример 1.1

Программа «Hello world»

package com.nsunc.wiki.nbazhenov;
 
public class HelloWorld {
	public static void main (String[] args){
		System.out.println("Hello, World!");
	}
}

Пример 1.2

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

package com.nsunc.wiki.nbazhenov;
 
public class SimpleLight {
	boolean state;
 
	boolean getState(){
		return state;
	}
 
	void on(){
		state = true;
	}
 
	void off(){
		state = false;
	}
}

Задание 1.1.A

Создайте пакет com.nsunc.wiki.вашЛогин. В этом пакете создайте класс SimpleLight, приведенный выше, и новый класс TestClass. С помощью TestClass протестируйте работу методов класса SimpleLight. Убедитесь в том, что Java присваивает значение полю state по умолчанию.

Задание 1.1.B

Модифицируйте реализацию SimpleLight следующим образом:

  1. Добавьте в класс SimpleLight новые целочисленные поля brightness (яркость) и step (шаг). Сделайте так, чтобы значение поля step было по умолчанию равным 100.
  2. Измените код существующих методов так, чтобы при включении лампочки ее яркость принимала значение 1000, а при выключении - 0.
  3. Напишите метод dim() (терять яркость), производящий следующие действия: если яркость лампочки больше значения step, то яркость уменьшается на step; в противном случае лампочка выключается и в консоли печатается соответствующее сообщение.
  4. Напишите метод brighten() (делать ярче), производящий следующие действия: если яркость лампочки не превосходит значения (1000-step), то яркость увеличивается на step; в противном случае в консоли печатается сообщение об ошибке.

Протестируйте работу методов класса SimpleLight.

Замечание: Лампочка считается включенной если и только если ее яркость больше нуля.

Задание 1.1.С

Модифицируйте реализацию SimpleLight следующим образом:

  1. Добавьте новое статическое целочисленное поле maxBrightness (максимальная яркость). Сделайте так, чтобы по умолчанию maxBrightness принимало значение 1000.
  2. Измените код метода brighten(), заменив 1000 на maxBrightness.
  3. Напишите 2 статических метода: getMaxBrightness() - возвращает значение maxBrightness; и setMaxBrighness(int a) - устанавливает значение maxBrightness.

Продемонстрируйте работу статических методов.

Семинар 2

Арифметические операторы

Основные арифметические операторы: сложение (+), вычитание (-), умножение (*), деление (/), остаток от деления нацело (%).

Можно использовать сокращенную форму записи операторов:

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

Операторы инкремента и декремента

Оператор инкремента записывается в виде ++ и означает «увеличить на единицу». Оператор декремента записывается в виде -- и означает «уменьшить на единицу». Для каждого из операторов есть две версии: префиксная и постфиксная.

++a; // префиксная версия оператора инкремента
a++; // постфиксная версия оператора инкремента

В префиксном варианте сначала выполняется операция, а затем выдается значение. В постфиксном варианте сначала выдается значение, и лишь затем выполняется операция.

int a = 0;
System.out.println("1. a = " + ++a); // напечатается: 1. a = 1
System.out.println("2. a = " + a++); // напечатается: 2. a = 1

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

Операторы сравнения: меньше (<), больше (>), меньше или равно (<=), больше или равно (>=), равно (==), не равно (!=). == и != применимы для всех примитивных типов данных, остальные не применимы к типу 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

Реализовать алгоритм быстрой сортировки массива.

Описание алгоритма можно найти здесь.

Указания к оформлению решения

  • Метод, реализующий быструю сортировку, должен быть записан в отдельном классе. Например, так:
class MySort {
	static void quickSort (/* Ваш список параметров */){
		// Ваш код 
	}
}
  • В методе public static void main(String[] args) другого класса в том же пакете создайте массив, заполните его случайными числами, напечатайте его, проведите сортировку и затем снова напечатайте массив. Например, так:
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));
	}
}

Семинар 4

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

Пример использования generic-ов: классы, предназначенные для хранения упорядоченной пары и упорядоченной тройки объектов

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 +")";
	}
}

Пример работы с этими классами:

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)

Задание 4.1

Приведем одну из возможных реализаций двусвязного списка:

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;
	}
}

Пример использования:

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]

Допишите следующие методы:

  1. Добавление нового элемента в начало списка.
  2. Удаление первого/последнего элемента.
  3. Получение значения первого/последнего элемента.
  4. Получение размера списка.
  5. Получение значения i-го элемента списка.
  6. Удаление i-го элемента списка.

Указание к оформлению решения

Новые методы должны называться в соответствии с методами класса java.util.LinkedList<E>.

Задание 4.2

С помощью получившегося двусвязного списка напишите решение задачи Иосифа Флавия.

Семинар 5

Информацию о двоичных деревьях поиска можно прочитать здесь.

Задание 5.1

Приведем одну из возможных реализаций двоичного дерева поиска:

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);
	}
}

Допишите методы inOrderTreeWalk, treeMinimum, treeMaximum, treeSuccessor, treePredecessor, treeDelete, описанные в тексте.