====== Первый семестр ====== ===== Урок 1 ===== ==== Начало работы ==== - Запустите Eclipse - Создайте новый проект (Правой кнопкой по левой вкладке Package Explorer, New, Project) - Создайте новый пакет (Правой кнопкой по имени проекта New, Package) - Создайте новый класс (Правой кнопкой по имени пакета, 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(); } } } ====== Литература ====== |[[http://www.nsunc.com/docs/Java/Heads_first_Java.djvu|Изучаем Java]]| Учебник для курса | |[[http://sourceforge.net/projects/djvu/files/DjVuLibre_Windows/3.5.25%2B4.9/|DjView]] | Программа для чтения DjVu| ====== Задачи ====== ===== Задача 6 ===== Файл представляет собой набор произвольного количества строк разнообразной длины. Строки разбиты на слова пробелами. Требуется обработать содержимое файла таким образом, чтобы ширина строк в символах была не больше наперед заданного числа. Пример: Дан файл aaa bb ccccc dd e f gg hhh Заданная длина строки: 4 aaa bb ccccc dd e f gg hhh ===== Задача 7 ===== Удалить из файла все лишние пробелы. Пробелы считаются лишними если: * Повторяются более чем 1 раз подряд * Стоят перед знаком препинания * Стоят после открывающей или перед закрывающей кавычками * Стоят после открывающей или перед закрывающей скобками ===== Списки ===== По приведенному наброску написать все упомянутые функции для реализации списков на языке 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 - Вывести список предметов предмет имя преподавателя - Вывести преподавателя с наибольшим количеством предметов HashMap teachers = new HashMap(); // где-то тут заполняется карта 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(); } ===== Итоговая контрольная работа ===== [[https://drive.google.com/file/d/0B88BcoMr40VINTJIX1VuSlAxSTA/view?usp=sharing|Задание]]