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

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


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

Второй семестр

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

Урок 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

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

  • Повторяются более чем 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. Список соответствия преподавателя предмету (один преподаватель может вести несколько предметов)
  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();
    }

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

Второй семестр

Задание 1. Тур де Франс

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

Файл 1. tdf14_teams.txt

В нем перечислены участники и команды. В каждой строке файла хранится запись вида:

национальность фамилия имя год_рождения номер команда

Например

SUI ALBASINI Michael 1980 182 ORICA GREENEDGE

Каждый участник однозначно идентифицируется по своему имени, а команда по названию (т.е. дубликатов нет)

Файл 2. tdf14_stage.txt

В нем перечислены этапы гонки в виде:

номер_этапа дата место_отправления место_прибытия дистанция

Например

1 05/07/14 Leeds Harrogate 190

Файл 3. tdf14_ranks.txt

В этом файле содержатся рейтинги участников на разных этапах. Каждая строка содержит следующее:

Номер_этапа место_участника номер_участника время_участника

Участники, сошедшие с дистанции во время этапа с номером i, где (1 ≤ i ≤ 21) исключены из рейтингов для всех последующих этапов.

Класс-обертка для чтения из файла прилагается.

import java.io.*;
 
public class ReadData {
	private BufferedReader reader;	// читатель из файла
 
	/**
	 * Конструктор.
	 */
	public ReadData() {
		reader = null;
	}
 
	/**
	 * открывает текстовый файл
	 * @param fileName имя файла
	 * @return true если открыли успешно, false иначе.
	 */
	public boolean open(String fileName) {
		try {
			FileReader fr = new FileReader(fileName);
			reader = new BufferedReader(fr);
			return true;
		}
		catch(IOException ex) {
			return false;
		}
	}
 
	/**
	 * Читает строку из файла, открытого методом open()
	 * @return прочитанная строка или null, если прочитать не удалось
	 */
	public String readLine() {
		try {
			return reader.readLine();
		}
		catch(IOException ex) {
			return null;
		}
	}
 
	/**
	 * Закрывает файл
	 */
	public void close() {
		if (reader != null) {
			try {
				reader.close();
			}
			catch(IOException ex) {
			}
		}
	}
}

Работа делится на две части. Первая заключается в создании системы классов и объектов для представления данных и начальном заполнении их информацией из файла. Вторая в статистической обработке данных.

Часть 1.

Наша задача состоит в обработке файла tdf14_teams.txt. Для этого требуется создать следующие 4 класса.

1. Racer. У нашего участника есть имя, фамилия, национальность, год рождения и номер участия. В классе должны быть необходимые геттеры и сеттеры, а так же метод int age(int year), который позволяет вычислить возраст участника, год передается в качестве параметра (например 2014) 2. Team. Команда имеет название и список участников. Должны быть реализованы следующие методы: - Team(String name) конструктор, который принимает в качестве аргумента название команды. Список гонщиков инициализируется пустным списком - void insert(Racer racer) добавляет гонщика в команду - String getName() геттер для названия команды - int numberOfRacers() возвращает количество гонщиков в команде - Racer getRacers(int i) возвращает гонщика по номеру. Нумерация идет с нуля. - int totalAge(int year) возвращает суммарный возраст участников. Год передается в качестве параметра. 3. TeamsList. Класс для списка команд. Должны быть реализованы следующие методы: - TeamsList() конструктор, инициализирующий список команд пустым списком. - void insert(Team team) добавляет команду в общий список. - Team getTeam(String teamName) возвращает команду по ее названию. Если такой команды не найдено, должен возвращаться null. - int numberOfTeams() возвращает количество команд - Team getTeam(int i) возвращает i-ю команду. Нумерация с нуля. 4. TourDeFrance главный класс программы, содержащий метод main. В этом классе должны выполнятся вызовы методов для чтения данных о велосипедистах, создаваться необходимые объекты (участники, команды, список команд), показываться информация о командах и их участниках. После чтения данных и заполнения объектов нужно ответить на вопрос: каков средний возраст участников Тур де Франс 2014. Ответ округлить до двух знаков после запятой. Набросок для этого класса приведен далее.

public class TourDeFrance {
	/**
	 * Метод для создания гонщика, на основани файла с списком гонщиков/команд
	 * @param line одна строка из файла
	 * @param teamsList список команд, который заполняется на основании строки из файла
	 */
	public static void parceTeamLine(String line, ListeEquipe teamsList) {
		// Элементы в строках нашего файла разделени знаками табуляции, их мы
		// и будем использовать чтобы отличить один элемет от другого. 
		String[] elem = line.split("\t");
 
		// Информация о гонщике
		String nat = elem[0];
		String racerFamilyName = elem[1];
		String racerName = elem[2];
		int year = Integer.parseInt(elem[3]);
		int number = Integer.parseInt(elem[4]);
		String teamName = elem[5];
 
		// TODO Найти команду по имени в списке
		// TODO Если не найдено, то создать команду и добавить в список
		// TODO Создать гонщика и добавить в команду
	}
 
	/**
	 * Метод для создания команд
	 * @param  fileName Имя файла для команд
	 * @param  teamsList список команд
	 * @return если чтение данных прошло успешно, то возвращается true (это значит,
	 * 		   что все команды/участники прочитаны и занесены в список)
	 *		   В противном случае возвращается false
	 */
	public static boolean createTeams(String fileName, ListeEquipe teamsList) {
		// Объект, связанный с файлом, откуда мы будем построчно читать данные
		ReadData reader = new ReadData();
 
		if (reader.open(fileName)) {
			// Пропустим заголовок
			String line = reader.readLine();
 
			// Обработаем строку для добавления в список
			while ((line = reader.readLine()) != null) {
				parceTeamLine(line, teamsList);
			}
			reader.close();
			return true;	// все прошло хорошо
		}
		else {
			return false;	// или плохо
		}
	}
 
	/**
	 * Главный метод 
	 * @param args аргументы командной строки
	 */
	public static void main(String[] args) {
		final int currentYear = 2014;
		final String teamsFileName = "tdf14_teams.txt";
 
		// TODO Создать список команд (и инициализировать!)
 
		// Обработка файла с командами
		boolean res = createTeams(teamsFileName, temsList);
		if (!res) {
			System.out.println("Произошла ошибка с чтением списка команд");
		}
		else {
			// TODO Оставшаяся часть программы (вывести данные, чтобы удостовериться в корректном чтении файла,
			// вычислить средний возраст участников и т.д.
		}
	}
}