Содержание

Первый семестр

Урок 1

Начало работы

  1. Запустите Eclipse
  2. Создайте новый проект (Правой кнопкой по левой вкладке Package Explorer, New, Project)
  3. Создайте новый пакет (Правой кнопкой по имени проекта New, Package)
  4. Создайте новый класс (Правой кнопкой по имени пакета, New, Class)

В результате в редакторе должнен быть результат, похожий на:

package ru.nsunc.lskywalker;
 
class Privet {
 
}

Вывод на экран

Чтобы напечатать строчку на экране, можно воспользоваться функциями System.out.print (напечатает строку) или System.out.println (напечатает строку и перейдет на начало следующей строки). Например:

package ru.nsunc.lskywalker;
 
class Privet {
   public static void main (String[] args){
     System.out.println("Привет");
   }
}

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

Чтобы объявить переменную в Яве, нужно сначало указать ее тип (множество значений, которые может принимать переменная) и ее имя.

Например:

int userID;

Описывает переменную целого типа (int) имеющую имя userID.

double multiplicationResult;

Описывает вещественную переменную (double) имеющую имя multiplicationResult.

package ru.nsunc.lskywalker;
 
class Privet {
   public static void main (String[] args){
     int a;
     a = 5;
     int b = 10;
     double c, d;
     c = 10.2;
     d = a * b * c;
     System.out.println("d = " + d);
   }
}

Ветвления

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

if (условие) {
   выражения, которые выполняются если условие истинно
} else {
   выражения, которые выполняются если условие ложно
}   

Ветвь else в операторе ветвления необязательна и может быть пропущена.

class Privet {
   public static main (String[] args){
     int a;
     a = 5;
     int b = 10;
     double c, d;
     c = 10.2;
     d = a * b * c;
     System.out.println("d = " + d);
     if (d > 100) {
        System.out.println("d > 100");
     } else {
        System.out.println("d <= 100");
     }
   }
}

Циклы

Если какой-то участок кода надо выполнить несколько раз, можно воспользоваться следующим оператором:

for (начальное условие; ограничение; способ изменения){
 
}

Например:

class Privet {
   public static main (String[] args){
     int a;
     a = 5;
     for (int i = 0; i < a; i++) {
        System.out.println(a);
     }
   }
}

Напечатает переменную a a раз.

Урок 2

Оператор выбора

Когда в программе требуется проверить много однотипных вариантов, пользоваться цепочками операторов if..else нерационально. Упростить задачу помогает вот такая конструкция:

switch (переменная){
   case значение1: выражения; break;
   case значение2: выражения; break;
   case значение3: выражения; break;
   case значение4: выражения; break;
   case значение5: выражения; break;
   case значение6: выражения; break;
   case значение7: выражения; break;
   default: выражения; break;
}

Чтение данных с клавиатуры

package ru.nsesc.lskywalker;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Privet {
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 
        System.out.println("Введите первое число: ");
        int input = Integer.parseInt(reader.readLine());
        System.out.println("Введите второе число: ");
        int input2 = Integer.parseInt(reader.readLine());
        System.out.println("Введите третье число: ");
        double input3 = Double.parseDouble(reader.readLine());
        System.out.println(input + input2 + input3);
 
    }
}

Заполнение массива случайными числами

int size = 10;
int[] arr = new int[size];
 
for(int i = 0; i < size; i++)
{
   arr[i] = (int)Math.round(Math.random() * 10);
}

Урок 3

Работа с графикой

package ru.nsunc.lskywalker;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.*;
import javax.swing.*;
 
public class Graph extends JPanel {
    private static final long serialVersionUID = 1L;
 
    public int getWindowWidth() {
        return windowWidth;
    }
 
    public void setWindowWidth(int windowWidth) {
        this.windowWidth = windowWidth;
    }
 
    public int getWindowHeight() {
        return windowHeight;
    }
 
    public void setWindowHeight(int windowHeight) {
        this.windowHeight = windowHeight;
    }
 
    private int windowWidth = 400;
    private int windowHeight = 400;
 
 
      @Override
    public void paintComponent(Graphics gr) {
        Graphics2D g = (Graphics2D) gr;
 
        Color oldColor = g.getColor();
        Paint paint = g.getPaint();
        Stroke oldStroke = g.getStroke();
 
        float[] shtrich = {14, 5};
        BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3, shtrich, 0);
        g.setStroke(bs);
        g.draw(new Line2D.Float(20, 20, 360, 20));
        g.setStroke(oldStroke);
 
        g.draw(new Rectangle2D.Float(20, 40, 340, 20));
 
        g.draw(new RoundRectangle2D.Float(20, 70, 340, 30, 20, 15));
 
        g.draw(new Ellipse2D.Float(20, 110, 150, 60));
 
        g.draw(new Ellipse2D.Float(200, 110, 60, 60));
 
        g.draw(new Arc2D.Float(280, 110, 80, 60, 0, 180, Arc2D.OPEN));
        g.draw(new Arc2D.Float(280, 150, 80, 50, 0, 80, Arc2D.CHORD));
        g.draw(new Arc2D.Float(240, 150, 80, 60, 0, 90, Arc2D.PIE));
 
        int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50};
        int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190};
 
        GeneralPath genPath = new GeneralPath();
        genPath.moveTo(arrayX[0], arrayY[0]);
        for (int inn = 1; inn < 8; inn++) {
            genPath.lineTo(arrayX[inn], arrayY[inn]);
        }
        genPath.closePath();
        g.draw(genPath);
 
        Color newColor = new Color(0, 0, 255);
        g.setColor(newColor);
        Font font = new Font("Tahoma", Font.BOLD | Font.ITALIC, 50);
        Font oldFont = g.getFont();
        g.setFont(font);
        bs = new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3);
        g.setStroke(bs);
        FontRenderContext fontCont = g.getFontRenderContext();
        TextLayout tLayout = new TextLayout("SBP", font, fontCont);
        AffineTransform affTrans = new AffineTransform();
        affTrans.setToTranslation(270, 220);
        g.draw(tLayout.getOutline(affTrans));
        g.setFont(oldFont);
        g.setColor(oldColor);
        g.setStroke(oldStroke);
 
        // Draw axes;
        g.drawLine(20, 220, 20, 350);
        g.drawLine(20, 350, 360, 350);
        g.drawString("Y", 25, 230);
        g.drawString("X", 350, 346);
        // Draw a curve;
        int[] xArray = {20, 40, 60, 80, 100, 120, 130, 140, 280, 332};
        int[] yArray = {350, 345, 340, 310, 290, 280, 275, 273, 271, 269};
        g.setColor(newColor);
        genPath = new GeneralPath();
        genPath.moveTo(xArray[0], yArray[0]);
        for (int inn = 1; inn < 10; inn++) {
            genPath.lineTo(xArray[inn], yArray[inn]);
        }
        //genPath.closePath();
        g.draw(genPath);
        g.setColor(oldColor);
        g.drawString("y = f(x)", 180, 267);
 
        GradientPaint gradPaint =
                new GradientPaint(20, 50, Color.green, 200, 50, Color.yellow);
        g.setPaint(gradPaint);
        g.fillRect(21, 41, 339, 19);
        g.setPaint(paint);
 
        gradPaint =
                new GradientPaint(20, 110, Color.blue, 96, 110, Color.white, true);
        g.setPaint(gradPaint);
        g.fill(new Ellipse2D.Float(21, 111, 149, 59));
        g.setPaint(paint);
 
        gradPaint =
                new GradientPaint(230, 100, Color.black, 230, 113, Color.white, true);
        g.setPaint(gradPaint);
        g.fill(new Ellipse2D.Float(200, 110, 60, 60));
        g.setPaint(paint);
 
        g.fill(new RoundRectangle2D.Float(20, 70, 340, 30, 20, 15));
        g.setPaint(paint);
    }
 
    public static void main(String[] args) {
 
        JFrame f = new JFrame();
        Graph window = new Graph();
        window.setWindowHeight(1000);
        window.setWindowWidth(1000);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(window);
        f.setSize(window.getWindowWidth(), window.getWindowHeight());
        f.setLocation(200,200);
        f.setVisible(true);
    }
 
 
}

То же, только без шахмат и первокурсниц:

import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.*;
import javax.swing.*;
 
public class Graph extends JPanel {
    private static final long serialVersionUID = 1L;
 
    public int getWindowWidth() {
        return windowWidth;
    }
 
    public void setWindowWidth(int windowWidth) {
        this.windowWidth = windowWidth;
    }
 
    public int getWindowHeight() {
        return windowHeight;
    }
 
    public void setWindowHeight(int windowHeight) {
        this.windowHeight = windowHeight;
    }
 
    private int windowWidth = 640;
    private int windowHeight = 640;
 
 
      @Override
    public void paintComponent(Graphics gr) {
        Graphics2D g = (Graphics2D) gr;
 
        Color oldColor = g.getColor();
        Paint paint = g.getPaint();
        Stroke oldStroke = g.getStroke();
 
        float[] shtrich = {14, 5};
	BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3, shtrich, 0);
        g.setStroke(bs);
        GeneralPath genPath = new GeneralPath();
        g.draw(genPath);
 
        Color newColor = new Color(0, 0, 255);
        g.setColor(newColor);
        Font font = new Font("Tahoma", Font.BOLD | Font.ITALIC, 50);
        Font oldFont = g.getFont();
        g.setFont(font);
        bs = new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3);
        g.setStroke(bs);
        FontRenderContext fontCont = g.getFontRenderContext();
	//        TextLayout tLayout = new TextLayout("SBP", font, fontCont);
	//   AffineTransform affTrans = new AffineTransform();
        //affTrans.setToTranslation(270, 220);
	//        g.draw(tLayout.getOutline(affTrans));
        g.setFont(oldFont);
        g.setColor(oldColor);
        g.setStroke(oldStroke);
 
        // Draw axes;
        g.drawLine(20, 220, 20, 350);
        g.drawLine(20, 350, 360, 350);
        g.drawString("Y", 25, 230);
        g.drawString("X", 350, 346);
        // Draw a curve;
        double[] xArray;
        double[] yArray;
        double left = -4;
        double right = 4;
        double step = 0.1;
        int size = (int)((right-left)/step);
        xArray = new double[size];
        yArray = new double[size];        
 
        xArray[0] = left;
        yArray[0] = Math.sin(xArray[0]);
 
        for(int i = 1; i < size; i++)
        {
            xArray[i] = xArray[i - 1] + step;
            yArray[i] = Math.sin(xArray[i]);
        }
 
        long xArrayLong[] = new long[size];
        long yArrayLong[] = new long[size];
 
        for(int i = 0; i < size; i++)
        {
            xArrayLong[i] = Math.round(xArray[i]);
            yArrayLong[i] = Math.round(yArray[i]);
        }
 
        g.setColor(newColor);
        genPath = new GeneralPath();
        genPath.moveTo(xArrayLong[0], yArrayLong[0]);
        for (int inn = 1; inn < size; inn++) {
            genPath.lineTo(xArrayLong[inn], yArrayLong[inn]);
        }
        //genPath.closePath();
 
        g.draw(genPath);
        g.setColor(oldColor);
        g.drawString("y = f(x)", 180, 267);
    }
 
    public static void main(String[] args) {
 
        JFrame f = new JFrame();
        Graph window = new Graph();
        window.setWindowHeight(640);
        window.setWindowWidth(640);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(window);
        f.setSize(window.getWindowWidth(), window.getWindowHeight());
        f.setLocation(200,200);
        f.setVisible(true);
    }
 
 
}

Урок 4

Работа с файлами, чтение строками

package ru.nsesc.lskywalker;
import java.io.*;
 
public class Reader {
 
    public void readData()
    {
        // описываем входной файловый поток
        FileInputStream inputFileStream;
        // описываем входной читатель из потока
        InputStreamReader inputFileReader = null;
        try {
            // сопоставляем входной поток файлу
            inputFileStream = new FileInputStream("superfile.txt");
            // и открываем его на чтение 
            inputFileReader = new InputStreamReader(inputFileStream, "UTF-8");
        }
        catch (FileNotFoundException ex)
        {
            System.out.println(ex);
 
        }
        catch (UnsupportedEncodingException ex)
        {
            System.out.println(ex);
 
        }
        // создаем читатель из файла
        BufferedReader inputFile = new BufferedReader(inputFileReader);
        // переменная, в которой будет храниться прочитанная из файла строка
        String str;
        // массив строк, в котором будет храниться результат деления нашей свежепрочитанной строки на куски
        String[] splitted = null;
        try {
            // пока можем читать из файда
            while ((str = inputFile.readLine()) != null) {
                // делим прочитанную строку на массив строк, по разделителю ";"
                splitted = str.split(";");
            }
        } catch (IOException ex) {
            System.out.println(ex);
        } 
    }
}

Работа с файлами, чтение посимвольно

package ru.nsesc.lskywalker;
import java.io.*;
 
public class Reader {
 
    public void readData()
    {
        // описываем входной файловый поток
        FileInputStream inputFileStream;
        // описываем входной читатель из потока
        InputStreamReader inputFileReader = null;
        try {
            // сопоставляем входной поток файлу
            inputFileStream = new FileInputStream("superfile.txt");
            // и открываем его на чтение
            inputFileReader = new InputStreamReader(inputFileStream, "UTF-8");
        }
        catch (FileNotFoundException ex)
        {
            System.out.println(ex);
 
        }
        catch (UnsupportedEncodingException ex)
        {
            System.out.println(ex);
 
        }
        // создаем читатель из файла
        BufferedReader inputFile = new BufferedReader(inputFileReader);
        // переменная, в которой будет храниться прочитанная из файла строка
        String str;
        //переменная, в которую сохраним номер прочитанного символа
        int c = 0;
        // массив строк, в котором будет храниться результат деления нашей свежепрочитанной строки на куски
        String[] splitted = null;
        try {
            // пока можем читать из файда
            while ((c = inputFile.read()) != -1) {
                if((char)c != '.')
                {
                    System.out.println((char) c);
                }
                else
                {
                    break;
                }
            }
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
}

Как выбрать только четные числа из строки?

package ru.nsesc.lskywalker;
import java.io.*;
 
public class Reader {
 
    public void readData()
    {
        // описываем входной файловый поток
        FileInputStream inputFileStream;
        // описываем входной читатель из потока
        InputStreamReader inputFileReader = null;
        try {
            // сопоставляем входной поток файлу
            inputFileStream = new FileInputStream("superfile.txt");
            // и открываем его на чтение
            inputFileReader = new InputStreamReader(inputFileStream, "UTF-8");
        }
        catch (FileNotFoundException ex)
        {
            System.out.println(ex);
 
        }
        catch (UnsupportedEncodingException ex)
        {
            System.out.println(ex);
 
        }
        // создаем читатель из файла
        BufferedReader inputFile = new BufferedReader(inputFileReader);
        // переменная, в которой будет храниться прочитанная из файла строка
        String str;
        //переменная, в которую сохраним номер прочитанного символа
        int c = 0;
        // массив строк, в котором будет храниться результат деления нашей свежепрочитанной строки на куски
        String[] splitted = null;
        try {
            // пока можем читать из файла
            while ((c = inputFile.read()) != -1) {
                if((char)c != '.')
                {
                    if(c % 2 != 0)
                    {
                        System.out.println(c);
                    }
                }
                else
                {
                    break;
                }
            }
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
}

Запись текстовых данных в файл

package ru.nsesc.lskywalker;
import java.io.*;
 
public class Writer {
public static void writeData(String text)
    {
        BufferedWriter writer = null;
        try
        {
            FileOutputStream outputFileStream = new FileOutputStream("filename.txt");
            OutputStreamWriter outputFileWriter = new OutputStreamWriter(outputFileStream);
            writer = new BufferedWriter(outputFileWriter);
            writer.write(text);
 
            // ВАЖНО. Так как мы используем буферзованный вывод, то выходной поток необходимо закрывать, чтобы 
            // сохраненные там данные были записаны на диск
            writer.close();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Литература

Изучаем Java Учебник для курса
DjView Программа для чтения DjVu

Задачи

Задача 6

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

Пример:

Дан файл

aaa bb ccccc dd e f
gg hhh

Заданная длина строки: 4

aaa
bb
ccccc
dd e
f gg
hhh

Задача 7

Удалить из файла все лишние пробелы. Пробелы считаются лишними если:

Списки

По приведенному наброску написать все упомянутые функции для реализации списков на языке Java. В результате программа должна как минимум уметь (на тройку):

class List
{
private:
  int data;
  List next;
public:  
  // возвращает значение, которое хранится в элементе списка
  int getData();
  // устанавливает значение, которое хранится в элементе списка
  void setData(int data)
  {
    this.data = data;
  }
  // возвращает ссылку на следующий элемент списка
  List getNext()
  {};
  // устанавливает ссылку на следующий элемент
  void setNext(List next)
  {};
  // добавляет элемент списка с данными data после элемента с номером index
  void addElement(int data, int index)
  {};
  // добавляет элемент списка с данными data в конец списка
  void addElement(int data)
  {
     List tmp = new List();
     tmp.setData(data);
     tmp.setNext(NULL);
     List current = this.next;
     while(current != NULL)
     {
       next = next.getNext();
     }
     next.setNext(tmp);
  };
  // удаляет элемент с номером index
  void removeElement(int index)
  {};
  // возвращает голову списка (первый элемент)
  List head()
  {};
  // возвращает хвост списка (последний элемент)
  List tail()
  {};
  // возвращает истину, если список пуст
  boolean isEmpty()
  {};
  // очищает список
  void emptyList()
  {};
  // считает количество элементов в списке
  int size()
  {};
  // выводит список на экран
  void print()
  {};
  public static void main()
  {
    List list;
    // заполним список элементами
    for(int i = 0; i < 10; i++)
    {
      list.addElement(i);
    }
    // выведем его на экран
    list.print();
 
    return 0;
  }
}

Первое задание на оценку

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

В программе должна присутствовать следующая функциональность:

Пример главного класса программы:

public class Ex {
    public static void main(String[] argc) {
 
        // Количество книжек около 10 штук, в качестве примера напишу лишь две
        Book book1 = new Book();
        // задание знаений с помощью сеттеров
        book1.setAuthor("Пушкин");
        book1.setTitle("Руслан и Людмила");
        book1.setYear(2011);
        book1.setPrice(500);
        // задание значений полей с помощью конструктора (не обязательно)
        Book book2 = new Book("Лермонтов", "Мцыри", 2010, 398);
 
        Library lib = new Library();
 
        lib.addBook(book1);
        lib.addBook(book2);
 
        lib.giveToReader("Сергей", "Руслан и Людмила", 25, 10, 2014); // Выдать книжку читателю Сергей 25 октября 2014 года
        lib.giveToReader("Николай", "Руслан и Людмила", 24, 10, 2014); // Вывести сообщение об ошибке, так как эта книжка уже выдана
        lib.giveToReader("Марина", "Мцыри", 30, 12, 2014);
 
        lib.getBack("Сергей", "Руслан и Людмила", 14, 12, 2014); // Сдал в срок, просто получить книжку
 
        lib.getBack("Марина", "Мцыри", 10, 9, 2015); // Просрочила, выписать штраф
    }
}

Второе задание на оценку

Написать программу, реализующую следующие структуры данных:

  1. Список преподавателей
  2. Список предметов
  3. Список соответствия преподавателя предмету (один преподаватель может вести несколько предметов)
  4. Написать методы:
    1. Вывести список преподавателей с теми предметами, которые они ведут в формате
      имя преподавателя	предмет1, предмет2, предмет3
    2. Вывести список предметов
      предмет 	имя преподавателя
    3. Вывести преподавателя с наибольшим количеством предметов
    HashMap<String, String> teachers = new HashMap<String, String>();
    // где-то тут заполняется карта teachers
    Iterator it = teachers.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
        it.remove();
    }

Итоговая контрольная работа

Задание