Создание собственных классов
Пример кода по созданию классов, решающий задачи из лекции про разработку классов можно скачать по ссылке.
Целью данной практики является закрепление знаний об описании классов и их атрибутов.
Задача №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
. - Удостоверьтесь, что все реализованные методы работают корректно. Вызовите данный метод, результат вызова выводите с комментариями на стандартный поток вывода.
- Создайте объект класса