====== Первый семестр ======
===== Урок 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|Задание]]