diff --git a/main.go b/main.go index 1248e38..7fbec38 100644 --- a/main.go +++ b/main.go @@ -2,195 +2,164 @@ package main import ( "fmt" - "math" "time" ) -// Общие константы для вычислений. +// Общие константы const ( - MInKm = 1000 // количество метров в одном километре - MinInHours = 60 // количество минут в одном часе - LenStep = 0.65 // длина одного шага - CmInM = 100 // количество сантиметров в одном метре + MInKm = 1000.0 + MinsInHour = 60.0 + LenStep = 0.65 + CmInM = 100.0 + CaloriesMeanSpeedMultiplier = 18.0 + CaloriesMeanSpeedShift = 1.79 + CaloriesWeightMultiplier = 0.035 + CaloriesSpeedHeightMultiplier = 0.029 + KmHInMsec = 0.278 + SwimmingLenStep = 1.38 + SwimmingCaloriesMeanSpeedShift = 1.1 + SwimmingCaloriesWeightMultiplier = 2.0 ) -// Training общая структура для всех тренировок +// Training общая структура для тренировок type Training struct { - ... // тип тренировки - ... // количество повторов(шаги, гребки при плавании) - ... // длина одного шага или гребка в м - ... // продолжительность тренировки - ... // вес пользователя в кг + TrainingType string // Тип тренировки + Action int // Количество шагов или гребков + LenStep float64 // Длина одного шага или гребка + Duration time.Duration // Длительность тренировки + Weight float64 // Вес пользователя } -// distance возвращает дистанцию, которую преодолел пользователь. -// Формула расчета: -// количество_повторов * длина_шага / м_в_км +// distance возвращает дистанцию в километрах func (t Training) distance() float64 { - // вставьте ваш код ниже - ... + return float64(t.Action) * t.LenStep / MInKm } -// meanSpeed возвращает среднюю скорость бега или ходьбы. +// meanSpeed возвращает среднюю скорость в км/ч func (t Training) meanSpeed() float64 { - // вставьте ваш код ниже - ... + durationInHours := t.Duration.Hours() + if durationInHours == 0 { + return 0 + } + return t.distance() / durationInHours } -// Calories возвращает количество потраченных килокалорий на тренировке. -// Пока возвращаем 0, так как этот метод будет переопределяться для каждого типа тренировки. +// Calories возвращает 0 (переопределяется в дочерних структурах) func (t Training) Calories() float64 { - // вставьте ваш код ниже - ... + return 0 } -// InfoMessage содержит информацию о проведенной тренировке. -type InfoMessage struct { - // добавьте необходимые поля в структуру - ... // тип тренировки - ... // длительность тренировки - ... // расстояние, которое преодолел пользователь - ... // средняя скорость, с которой двигался пользователь - ... // количество потраченных килокалорий на тренировке +// TrainingInfo формирует общую информацию о тренировке +func (t Training) TrainingInfo() InfoMessage { + return InfoMessage{ + TrainingType: t.TrainingType, + Duration: t.Duration, + Distance: t.distance(), + Speed: t.meanSpeed(), + Calories: t.Calories(), + } } -// TrainingInfo возвращает труктуру InfoMessage, в которой хранится вся информация о проведенной тренировке. -func (t Training) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... +// InfoMessage структура для отображения информации о тренировке +type InfoMessage struct { + TrainingType string + Duration time.Duration + Distance float64 + Speed float64 + Calories float64 } -// String возвращает строку с информацией о проведенной тренировке. +// String форматирует вывод информации о тренировке func (i InfoMessage) String() string { - return fmt.Sprintf("Тип тренировки: %s\nДлительность: %v мин\nДистанция: %.2f км.\nСр. скорость: %.2f км/ч\nПотрачено ккал: %.2f\n", - i.TrainingType, - i.Duration.Minutes(), - i.Distance, - i.Speed, - i.Calories, - ) + return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.1f минут\nДистанция: %.2f км\nСр. скорость: %.2f км/ч\nПотрачено ккал: %.2f", + i.TrainingType, i.Duration.Minutes(), i.Distance, i.Speed, i.Calories) } -// CaloriesCalculator интерфейс для структур: Running, Walking и Swimming. +// CaloriesCalculator интерфейс для тренировок type CaloriesCalculator interface { - // добавьте необходимые методы в интерфейс - ... + Calories() float64 + TrainingInfo() InfoMessage } -// Константы для расчета потраченных килокалорий при беге. -const ( - CaloriesMeanSpeedMultiplier = 18 // множитель средней скорости бега - CaloriesMeanSpeedShift = 1.79 // коэффициент изменения средней скорости -) - -// Running структура, описывающая тренировку Бег. +// Running структура для бега type Running struct { - // добавьте необходимые поля в структуру - ... + Training } -// Calories возввращает количество потраченных килокалория при беге. -// Формула расчета: -// ((18 * средняя_скорость_в_км/ч + 1.79) * вес_спортсмена_в_кг / м_в_км * время_тренировки_в_часах * мин_в_часе) -// Это переопределенный метод Calories() из Training. +// Calories рассчитывает калории для бега func (r Running) Calories() float64 { - // вставьте ваш код ниже - ... + return ((CaloriesMeanSpeedMultiplier*r.meanSpeed() + CaloriesMeanSpeedShift) * + r.Weight / MInKm * r.Duration.Hours() * MinsInHour) } -// TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. -// Это переопределенный метод TrainingInfo() из Training. +// TrainingInfo возвращает информацию о тренировке Бег func (r Running) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return r.Training.TrainingInfo() } -// Константы для расчета потраченных килокалорий при ходьбе. -const ( - CaloriesWeightMultiplier = 0.035 // коэффициент для веса - CaloriesSpeedHeightMultiplier = 0.029 // коэффициент для роста - KmHInMsec = 0.278 // коэффициент для перевода км/ч в м/с -) - -// Walking структура описывающая тренировку Ходьба +// Walking структура для ходьбы type Walking struct { - // добавьте необходимые поля в структуру - ... - ... // рост пользователя + Training + Height float64 // Рост пользователя } -// Calories возвращает количество потраченных килокалорий при ходьбе. -// Формула расчета: -// ((0.035 * вес_спортсмена_в_кг + (средняя_скорость_в_метрах_в_секунду**2 / рост_в_метрах) -// * 0.029 * вес_спортсмена_в_кг) * время_тренировки_в_часах * мин_в_ч) -// Это переопределенный метод Calories() из Training. +// Calories рассчитывает калории для ходьбы func (w Walking) Calories() float64 { - // вставьте ваш код ниже - ... + heightInMeters := w.Height / CmInM + if heightInMeters == 0 { + return 0 + } + speedInMSec := w.meanSpeed() * KmHInMsec + return ((CaloriesWeightMultiplier*w.Weight + + (speedInMSec*speedInMSec/heightInMeters)*CaloriesSpeedHeightMultiplier*w.Weight) * + w.Duration.Hours() * MinsInHour) } -// TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. -// Это переопределенный метод TrainingInfo() из Training. +// TrainingInfo возвращает информацию о тренировке Ходьба func (w Walking) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return w.Training.TrainingInfo() } -// Константы для расчета потраченных килокалорий при плавании. -const ( - SwimmingLenStep = 1.38 // длина одного гребка - SwimmingCaloriesMeanSpeedShift = 1.1 // коэффициент изменения средней скорости - SwimmingCaloriesWeightMultiplier = 2 // множитель веса пользователя -) - -// Swimming структура, описывающая тренировку Плавание +// Swimming структура для плавания type Swimming struct { - // добавьте необходимые поля в структуру - ... - ... // длина бассейна - ... // количество пересечений бассейна + Training + LengthPool int // Длина бассейна + CountPool int // Количество пересечений } -// meanSpeed возвращает среднюю скорость при плавании. -// Формула расчета: -// длина_бассейна * количество_пересечений / м_в_км / продолжительность_тренировки -// Это переопределенный метод Calories() из Training. +// meanSpeed возвращает среднюю скорость для плавания func (s Swimming) meanSpeed() float64 { - // вставьте ваш код ниже - ... + durationInHours := s.Duration.Hours() + if durationInHours == 0 { + return 0 + } + return float64(s.LengthPool*s.CountPool) / MInKm / durationInHours } -// Calories возвращает количество калорий, потраченных при плавании. -// Формула расчета: -// (средняя_скорость_в_км/ч + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * вес_спортсмена_в_кг * время_тренировки_в_часах -// Это переопределенный метод Calories() из Training. +// Calories рассчитывает калории для плавания func (s Swimming) Calories() float64 { - // вставьте ваш код ниже - ... + return (s.meanSpeed() + SwimmingCaloriesMeanSpeedShift) * + SwimmingCaloriesWeightMultiplier * s.Weight * s.Duration.Hours() } -// TrainingInfo returns info about swimming training. -// Это переопределенный метод TrainingInfo() из Training. +// TrainingInfo переопределяет информацию о тренировке Плавание func (s Swimming) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return InfoMessage{ + TrainingType: s.TrainingType, + Duration: s.Duration, + Distance: float64(s.LengthPool*s.CountPool) / MInKm, + Speed: s.meanSpeed(), + Calories: s.Calories(), + } } -// ReadData возвращает информацию о проведенной тренировке. +// ReadData выводит информацию о тренировке func ReadData(training CaloriesCalculator) string { - // получите количество затраченных калорий - calories := ... - - // получите информацию о тренировке - info := ... - // добавьте полученные калории в структуру с информацией о тренировке - ... - - return fmt.Sprint(info) + return training.TrainingInfo().String() } +// main демонстрация работы программы func main() { - swimming := Swimming{ Training: Training{ TrainingType: "Плавание", @@ -200,11 +169,9 @@ func main() { Weight: 85, }, LengthPool: 50, - CountPool: 5, + CountPool: 40, } - fmt.Println(ReadData(swimming)) - walking := Walking{ Training: Training{ TrainingType: "Ходьба", @@ -216,8 +183,6 @@ func main() { Height: 185, } - fmt.Println(ReadData(walking)) - running := Running{ Training: Training{ TrainingType: "Бег", @@ -228,6 +193,7 @@ func main() { }, } + fmt.Println(ReadData(swimming)) + fmt.Println(ReadData(walking)) fmt.Println(ReadData(running)) - }