diff --git a/main.go b/main.go index 1248e38..a738951 100644 --- a/main.go +++ b/main.go @@ -16,11 +16,11 @@ const ( // Training общая структура для всех тренировок type Training struct { - ... // тип тренировки - ... // количество повторов(шаги, гребки при плавании) - ... // длина одного шага или гребка в м - ... // продолжительность тренировки - ... // вес пользователя в кг + TrainingType string // тип тренировки + Action int // количество повторов(шаги, гребки при плавании) + LenStep float64 // длина одного шага или гребка в м + Duration time.Duration // продолжительность тренировки + Weight float64 // вес пользователя в кг } // distance возвращает дистанцию, которую преодолел пользователь. @@ -28,42 +28,46 @@ type Training struct { // количество_повторов * длина_шага / м_в_км func (t Training) distance() float64 { // вставьте ваш код ниже - ... + return float64(t.Action) * t.LenStep / MInKm } // meanSpeed возвращает среднюю скорость бега или ходьбы. func (t Training) meanSpeed() float64 { // вставьте ваш код ниже - ... + if t.Duration != 0 { + return t.distance() / t.Duration.Hours() + } + return 0 } // Calories возвращает количество потраченных килокалорий на тренировке. // Пока возвращаем 0, так как этот метод будет переопределяться для каждого типа тренировки. func (t Training) Calories() float64 { // вставьте ваш код ниже - ... + return 0 } // InfoMessage содержит информацию о проведенной тренировке. type InfoMessage struct { // добавьте необходимые поля в структуру - ... // тип тренировки - ... // длительность тренировки - ... // расстояние, которое преодолел пользователь - ... // средняя скорость, с которой двигался пользователь - ... // количество потраченных килокалорий на тренировке + TraingType string // тип тренировки + Duration time.Duration // длительность тренировки + Distance float64 // расстояние, которое преодолел пользователь + Speed float64 // средняя скорость, с которой двигался пользователь + Calories float64 // количество потраченных килокалорий на тренировке } -// TrainingInfo возвращает труктуру InfoMessage, в которой хранится вся информация о проведенной тренировке. +// TrainingInfo возвращает cтруктуру InfoMessage, в которой хранится вся информация о проведенной тренировке. func (t Training) TrainingInfo() InfoMessage { // вставьте ваш код ниже - ... + var out InfoMessage + return out } // String возвращает строку с информацией о проведенной тренировке. func (i InfoMessage) String() string { return fmt.Sprintf("Тип тренировки: %s\nДлительность: %v мин\nДистанция: %.2f км.\nСр. скорость: %.2f км/ч\nПотрачено ккал: %.2f\n", - i.TrainingType, + i.TraingType, i.Duration.Minutes(), i.Distance, i.Speed, @@ -74,7 +78,8 @@ func (i InfoMessage) String() string { // CaloriesCalculator интерфейс для структур: Running, Walking и Swimming. type CaloriesCalculator interface { // добавьте необходимые методы в интерфейс - ... + Calories() float64 + TrainingInfo() InfoMessage } // Константы для расчета потраченных килокалорий при беге. @@ -86,7 +91,7 @@ const ( // Running структура, описывающая тренировку Бег. type Running struct { // добавьте необходимые поля в структуру - ... + Training } // Calories возввращает количество потраченных килокалория при беге. @@ -95,14 +100,19 @@ type Running struct { // Это переопределенный метод Calories() из Training. func (r Running) Calories() float64 { // вставьте ваш код ниже - ... + return ((CaloriesMeanSpeedMultiplier*r.meanSpeed() + CaloriesMeanSpeedShift) * r.Weight / MInKm * r.Duration.Hours() * MinInHours) } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. // Это переопределенный метод TrainingInfo() из Training. func (r Running) TrainingInfo() InfoMessage { // вставьте ваш код ниже - ... + var run InfoMessage + run.TraingType = r.TrainingType + run.Duration = r.Duration + run.Distance = r.distance() + run.Speed = r.meanSpeed() + return run } // Константы для расчета потраченных килокалорий при ходьбе. @@ -115,8 +125,8 @@ const ( // Walking структура описывающая тренировку Ходьба type Walking struct { // добавьте необходимые поля в структуру - ... - ... // рост пользователя + Training + Height float64 // рост пользователя } // Calories возвращает количество потраченных килокалорий при ходьбе. @@ -126,14 +136,20 @@ type Walking struct { // Это переопределенный метод Calories() из Training. func (w Walking) Calories() float64 { // вставьте ваш код ниже - ... + meenSpeedMs := w.meanSpeed() * KmHInMsec + return ((CaloriesWeightMultiplier*w.Weight + (math.Pow(meenSpeedMs, 2)/w.Height)*CaloriesSpeedHeightMultiplier*w.Weight) * w.Duration.Hours() * MinInHours) } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. // Это переопределенный метод TrainingInfo() из Training. func (w Walking) TrainingInfo() InfoMessage { // вставьте ваш код ниже - ... + var walking InfoMessage + walking.TraingType = w.TrainingType + walking.Duration = w.Duration + walking.Distance = w.distance() + walking.Speed = w.meanSpeed() + return walking } // Константы для расчета потраченных килокалорий при плавании. @@ -146,9 +162,9 @@ const ( // Swimming структура, описывающая тренировку Плавание type Swimming struct { // добавьте необходимые поля в структуру - ... - ... // длина бассейна - ... // количество пересечений бассейна + Training + LengthPool int // длина бассейна + CountPool int // количество пересечений бассейна } // meanSpeed возвращает среднюю скорость при плавании. @@ -157,7 +173,10 @@ type Swimming struct { // Это переопределенный метод Calories() из Training. func (s Swimming) meanSpeed() float64 { // вставьте ваш код ниже - ... + if s.Duration != 0 { + return float64(s.LengthPool) * float64(s.CountPool) / MInKm / s.Duration.Hours() + } + return 0 } // Calories возвращает количество калорий, потраченных при плавании. @@ -166,25 +185,30 @@ func (s Swimming) meanSpeed() float64 { // Это переопределенный метод Calories() из Training. func (s Swimming) Calories() float64 { // вставьте ваш код ниже - ... + return (s.meanSpeed() + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * s.Weight * s.Duration.Hours() } // TrainingInfo returns info about swimming training. // Это переопределенный метод TrainingInfo() из Training. func (s Swimming) TrainingInfo() InfoMessage { // вставьте ваш код ниже - ... + var swimming InfoMessage + swimming.TraingType = s.TrainingType + swimming.Duration = s.Duration + swimming.Distance = s.distance() + swimming.Speed = s.meanSpeed() + return swimming } // ReadData возвращает информацию о проведенной тренировке. func ReadData(training CaloriesCalculator) string { // получите количество затраченных калорий - calories := ... + calories := training.Calories() // получите информацию о тренировке - info := ... + info := training.TrainingInfo() // добавьте полученные калории в структуру с информацией о тренировке - ... + info.Calories = calories return fmt.Sprint(info) }