diff --git a/main.go b/main.go index 1248e38..39b8ed4 100644 --- a/main.go +++ b/main.go @@ -2,67 +2,68 @@ package main import ( "fmt" - "math" "time" ) // Общие константы для вычислений. const ( - MInKm = 1000 // количество метров в одном километре - MinInHours = 60 // количество минут в одном часе - LenStep = 0.65 // длина одного шага - CmInM = 100 // количество сантиметров в одном метре + MInKm = 1000 // количество метров в одном километре + MinInHours = 60 // количество минут в одном часе + LenStep = 0.65 // длина одного шага + CmInM = 100 // количество сантиметров в одном метре + KmHInMsec = 0.278 // коэффициент для перевода км/ч в м/с ) // Training общая структура для всех тренировок type Training struct { - ... // тип тренировки - ... // количество повторов(шаги, гребки при плавании) - ... // длина одного шага или гребка в м - ... // продолжительность тренировки - ... // вес пользователя в кг + TrainingType string // тип тренировки + Action int // количество повторов (шаги, гребки при плавании) + LenStep float64 // длина одного шага или гребка в м + Duration time.Duration // продолжительность тренировки + Weight int // вес пользователя в кг } // distance возвращает дистанцию, которую преодолел пользователь. -// Формула расчета: -// количество_повторов * длина_шага / м_в_км func (t Training) distance() float64 { - // вставьте ваш код ниже - ... + return (float64(t.Action) * t.LenStep) / float64(MInKm) } // meanSpeed возвращает среднюю скорость бега или ходьбы. func (t Training) meanSpeed() float64 { - // вставьте ваш код ниже - ... + if t.Duration == 0 { + return 0 + } + return t.distance() / t.Duration.Hours() } // Calories возвращает количество потраченных килокалорий на тренировке. -// Пока возвращаем 0, так как этот метод будет переопределяться для каждого типа тренировки. func (t Training) Calories() float64 { - // вставьте ваш код ниже - ... + return 0 } // InfoMessage содержит информацию о проведенной тренировке. type InfoMessage struct { - // добавьте необходимые поля в структуру - ... // тип тренировки - ... // длительность тренировки - ... // расстояние, которое преодолел пользователь - ... // средняя скорость, с которой двигался пользователь - ... // количество потраченных килокалорий на тренировке + TrainingType string // тип тренировки + Duration time.Duration // длительность тренировки + Distance float64 // расстояние, которое преодолел пользователь + Speed float64 // средняя скорость, с которой двигался пользователь + Calories float64 // количество потраченных килокалорий на тренировке } -// TrainingInfo возвращает труктуру InfoMessage, в которой хранится вся информация о проведенной тренировке. +// TrainingInfo возвращает структуру InfoMessage, в которой хранится вся информация о проведенной тренировке. func (t Training) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return InfoMessage{ + TrainingType: t.TrainingType, + Duration: t.Duration, + Distance: t.distance(), + Speed: t.meanSpeed(), + Calories: t.Calories(), + } } // String возвращает строку с информацией о проведенной тренировке. func (i InfoMessage) String() string { - return fmt.Sprintf("Тип тренировки: %s\nДлительность: %v мин\nДистанция: %.2f км.\nСр. скорость: %.2f км/ч\nПотрачено ккал: %.2f\n", + return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f мин\nДистанция: %.2f км.\nСр. скорость: %.2f км/ч\nПотрачено ккал: %.2f\n", i.TrainingType, i.Duration.Minutes(), i.Distance, @@ -73,8 +74,8 @@ func (i InfoMessage) String() string { // CaloriesCalculator интерфейс для структур: Running, Walking и Swimming. type CaloriesCalculator interface { - // добавьте необходимые методы в интерфейс - ... + Calories() float64 + TrainingInfo() InfoMessage } // Константы для расчета потраченных килокалорий при беге. @@ -85,55 +86,52 @@ const ( // Running структура, описывающая тренировку Бег. type Running struct { - // добавьте необходимые поля в структуру - ... + Training } -// Calories возввращает количество потраченных килокалория при беге. -// Формула расчета: -// ((18 * средняя_скорость_в_км/ч + 1.79) * вес_спортсмена_в_кг / м_в_км * время_тренировки_в_часах * мин_в_часе) -// Это переопределенный метод Calories() из Training. +// Calories возвращает количество потраченных килокалорий при беге. func (r Running) Calories() float64 { - // вставьте ваш код ниже - ... + return ((CaloriesMeanSpeedMultiplier*r.meanSpeed() + CaloriesMeanSpeedShift) * float64(r.Weight) / MInKm * r.Duration.Hours() * MinInHours) } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. -// Это переопределенный метод TrainingInfo() из Training. func (r Running) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return InfoMessage{ + TrainingType: r.TrainingType, + Duration: r.Duration, + Distance: r.distance(), + Speed: r.meanSpeed(), + Calories: r.Calories(), + } } // Константы для расчета потраченных килокалорий при ходьбе. 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. func (w Walking) Calories() float64 { - // вставьте ваш код ниже - ... + speed := w.meanSpeed() * KmHInMsec // конвертация средней скорости из км/ч в м/с + return ((CaloriesWeightMultiplier*float64(w.Weight) + (speed*speed)/(w.Height)*CaloriesSpeedHeightMultiplier*float64(w.Weight)) * w.Duration.Hours() * float64(MinInHours)) } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. -// Это переопределенный метод TrainingInfo() из Training. func (w Walking) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return InfoMessage{ + TrainingType: w.TrainingType, + Duration: w.Duration, + Distance: w.distance(), + Speed: w.meanSpeed(), + Calories: w.Calories(), + } } // Константы для расчета потраченных килокалорий при плавании. @@ -143,54 +141,48 @@ const ( SwimmingCaloriesWeightMultiplier = 2 // множитель веса пользователя ) -// Swimming структура, описывающая тренировку Плавание +// Swimming структура, описывающая тренировку Плавание. type Swimming struct { - // добавьте необходимые поля в структуру - ... - ... // длина бассейна - ... // количество пересечений бассейна + Training + LengthPool int // длина бассейна + CountPool int // количество пересечений бассейна } // meanSpeed возвращает среднюю скорость при плавании. -// Формула расчета: -// длина_бассейна * количество_пересечений / м_в_км / продолжительность_тренировки -// Это переопределенный метод Calories() из Training. func (s Swimming) meanSpeed() float64 { - // вставьте ваш код ниже - ... + if s.Duration == 0 { + return 0 + } + // расчет дистанции: длина бассейна * количество пересечений + distance := float64(s.LengthPool*s.CountPool) / float64(MInKm) + // средняя скорость: расстояние в км / длительность в часах + return distance / s.Duration.Hours() + } // Calories возвращает количество калорий, потраченных при плавании. -// Формула расчета: -// (средняя_скорость_в_км/ч + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * вес_спортсмена_в_кг * время_тренировки_в_часах -// Это переопределенный метод Calories() из Training. func (s Swimming) Calories() float64 { - // вставьте ваш код ниже - ... + return (s.meanSpeed() + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * float64(s.Weight) * s.Duration.Hours() } -// TrainingInfo returns info about swimming training. -// Это переопределенный метод TrainingInfo() из Training. +// TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. func (s Swimming) TrainingInfo() InfoMessage { - // вставьте ваш код ниже - ... + return InfoMessage{ + TrainingType: s.TrainingType, + Duration: s.Duration, + Distance: s.distance(), + Speed: s.Training.meanSpeed(), + Calories: s.Calories(), + } } // ReadData возвращает информацию о проведенной тренировке. func ReadData(training CaloriesCalculator) string { - // получите количество затраченных калорий - calories := ... - - // получите информацию о тренировке - info := ... - // добавьте полученные калории в структуру с информацией о тренировке - ... - - return fmt.Sprint(info) + info := training.TrainingInfo() + return info.String() } func main() { - swimming := Swimming{ Training: Training{ TrainingType: "Плавание", @@ -213,7 +205,7 @@ func main() { Duration: 3*time.Hour + 45*time.Minute, Weight: 85, }, - Height: 185, + Height: 1.85, } fmt.Println(ReadData(walking)) @@ -229,5 +221,4 @@ func main() { } fmt.Println(ReadData(running)) - }