Целью данной практики является закрепление знаний об описании классов и их атрибутов.

Задача №1

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

  • описывать точку двумя вещественными числами;
  • позволять получать значения реальной и мнимой частей;
  • позволять складывать два объекта комплексных числа, в результате чего появляется третий объект, содержащий в себе сумму двух предыдущих;
  • дополнительно позволять выполнять другие математические операции: умножение, вычитание, деление.

Предлагаемый способ решения:

  • Создайте каталог practice-one и перейдите в него.
  • Создайте пустой файл my_complex.rb.
  • В файле my_compex.rb опишите пустой класс MyComplex.
  • Создайте пустой файл main.rb и подключите в нём файл my_complex.rb с помощью метода require_relative.
  • Создайте два объекта класса MyComplex и убедитесь, что ваш код работает.
  • Создайте метод initialize в классе MyComplex, который принимает 2 аргумента: коэффициенты комплексного числа (real, imaginary). Данный метод должен записывать их в переменные экземпляра.
  • Измените код по созданию объектов в файле main.rb, чтобы объектам передавались необходимые данные. Проверьте состояние созданных объектов с помощью методов p и pp.
  • Создайте метод to_s в классе MyComplex, который будет преобразовывать число в строку в формате real + i * imaginary.
  • Проверьте, что при выводе информации об объектах класса MyComplex с помощью метода puts, используется корректное преобразование.
  • Добавьте описание атрибутов на чтение real и imaginary в классе MyComplex. Проверьте, что данные атрибуты доступны на объектах, создаваемых в файле main.
  • Создайте метод add, который принимает ссылку на другой объект класса MyComplex. Аргумент следует назвать other. Данный метод должен производить сложение двух комплексных чисел, в качестве результата должен создавать новый объект класса MyComplex, содержащий сумму двух чисел.
  • Проверьте в файле main.rb, что данный метод функционирует корректно. Для этих целей выполните сложение двух созданных ранее объектов, результат сложения выведите на стандартную консоль.
  • Если у вас есть время, то решите задачу целиком: добавьте методы multiply, sub, divide.

Задача №2

Постановка задачи: создайте классы для описания автомобильного парка прокатной компании. Необходимо создать класс, который описывает один автомобиль:

  • Марка автомобиля. Строка, например Honda.
  • Модель автомобиля. Строка, например Civic.
  • Год выпуска. Целое число, например 1998
  • Средний расход бензина на 100 километров. Вещественное число, например 12,5.

Также необходимо создать класс парк, который позволяет описывать группу автомобилей. Данный класс должен иметь следующие методы:

  • Добавить автомобиль в список автомобилей.
  • Считать список автомобилей из JSON-документа.
  • Подсчитать средний расход бензина для всего автомобильного парка.
  • Найти количество автомобилей определённой марки.
  • Найти количество автомобилей определённой модели.
  • Найти средний расход бензина для каждой марки автомобильного парка.

Для наполнения данными рекомендуется использовать JSON-документ cars-list.json.

Предлагаемый способ решения:

  • Создайте каталог practice-two и перейдите в него.
  • Создайте пустые файлы main.rb, auto.rb, fleet.rb.
  • В файле auto.rb создайте класс Auto, у которого:
    • Опишите метод-инициализации, который принимает марку, модель, год выпуска и средний расход автомобиля и сохраняет их в переменных экземпляра.
    • Опишите атрибуты для получения значений переменных экземпляра. Например brand, model, manifacture_year и gasoline_consumption.
    • Реализуйте метод to_s, который будет преобразовывать данные в формат, понятный для человека.
  • Подключите файл auto к файлу main с помощью метода require_relative. Создайте несколько объектов класса Auto, которые описывают различные автомобили. Проверьте, что инициализатор и метод to_s работают корректно.
  • В файле fleet.rb создайте класс Fleet, у которого:
    • Инициализатор не принимает никаких аргументов, но инициализирует переменную экземпляра @cars с пустым массивом.
    • Метод add принимает объекты типа Car, которые добавляются в конец массива.
    • Метод load_from_file принимает в качестве аргумента путь к JSON-документу. Данный метод должен добавлять в массив автомобилей все автомобили, описанные в JSON-документе.

      Для считывания JSON-документа вам потребуется сначала считать содержимое файла с помощью метода File::read, а затем преобразовать считанную строку в объекты на языке Ruby с помощью библиотеки json и метода JSON::parse в частности.

      Простейший пример преобразования:

      require 'json'
      json_data = File.read(file_name)
      ruby_objects = JSON.parse(json_data)
      
    • Метод average_consumption подсчитывает средний расход бензина у всех известных автомобилей и возвращает полученное число. Нельзя печатать данные на стандартный поток вывода!
    • Метод number_by_brand принимает в качестве аргумента бренд автомобиля по которому происходит поиск подходящих объектов. Метод возвращает количество найденных автомобилей. Нельзя печатать данные на стандартный поток вывода!
    • Метод number_by_model принимает в качестве аргумента модель автомобиля по которому происходит поиск подходящих объектов. Метод возвращает количество найденных автомобилей. Нельзя печатать данные на стандартный поток вывода!
    • Метод consumption_by_brand принимает в качестве аргумента бренд автомобиля по которому происходит поиск подходящих объектов. Метод возвращает среднее потребление бензина для найденных объектов. Нельзя печатать данные на стандартный поток вывода!
  • Подключите файл fleet к файлу main с помощью метода require_relative.
    • Создайте объект класса Fleet и добавьте к нему ссылки на ранее созданные объекты-автомобили с помощью метода add.
    • Также добавьте все автомобили, описанные в файле с данными cars-list.json.
    • Удостоверьтесь, что все реализованные методы работают корректно. Вызовите данный метод, результат вызова выводите с комментариями на стандартный поток вывода.