Untitled
unknown
golang
6 months ago
11 kB
1
Indexable
package main import ( "fmt" "math" "time" ) // Общие константы для вычислений. const ( MInKm = 1000 // количество метров в одном километре MinInHours = 60 // количество минут в одном часе LenStep = 0.65 // длина одного шага CmInM = 100 // количество сантиметров в одном метре ) // Training общая структура для всех тренировок type Training struct { TrainingType string // тип тренировки Action int // количество повторов(шаги, гребки при плавании) LenStep float64 // длина одного шага или гребка в м Duration time.Duration // продолжительность тренировки Weight float64 // вес пользователя в кг } // distance возвращает дистанцию, которую преодолел пользователь. // Формула расчета: // количество_повторов * длина_шага / м_в_км func (t Training) distance() float64 { // вставьте ваш код ниже return float64(t.Action) * t.LenStep / MInKm } // meanSpeed возвращает среднюю скорость бега или ходьбы. func (t Training) meanSpeed() float64 { // вставьте ваш код ниже if t.distance() == 0 || t.Duration.Hours() == 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, в которой хранится вся информация о проведенной тренировке. 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", i.TrainingType, i.Duration.Minutes(), i.Distance, i.Speed, i.Calories, ) } // CaloriesCalculator интерфейс для структур: Running, Walking и Swimming. type CaloriesCalculator interface { // добавьте необходимые методы в интерфейс Calories() float64 TrainingInfo() InfoMessage } // Константы для расчета потраченных килокалорий при беге. const ( CaloriesMeanSpeedMultiplier = 18 // множитель средней скорости бега CaloriesMeanSpeedShift = 1.79 // коэффициент изменения средней скорости ) // Running структура, описывающая тренировку Бег. type Running struct { // добавьте необходимые поля в структуру Training } // Calories возввращает количество потраченных килокалория при беге. // Формула расчета: // ((18 * средняя_скорость_в_км/ч + 1.79) * вес_спортсмена_в_кг / м_в_км * время_тренировки_в_часах * мин_в_часе) // Это переопределенный метод Calories() из Training. func (r Running) Calories() float64 { // вставьте ваш код ниже if r.distance() == 0 { return 0 } Calc := float64(CaloriesMeanSpeedMultiplier)*r.meanSpeed() + CaloriesMeanSpeedShift return Calc * r.Weight / MInKm * r.Duration.Minutes() } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. // Это переопределенный метод TrainingInfo() из Training. func (r Running) TrainingInfo() InfoMessage { // вставьте ваш код ниже return r.Training.TrainingInfo() } // Константы для расчета потраченных килокалорий при ходьбе. const ( CaloriesWeightMultiplier = 0.035 // коэффициент для веса CaloriesSpeedHeightMultiplier = 0.029 // коэффициент для роста KmHInMsec = 0.278 // коэффициент для перевода км/ч в м/с ) // Walking структура описывающая тренировку Ходьба type Walking struct { // добавьте необходимые поля в структуру Training Height float64 // рост пользователя } // Calories возвращает количество потраченных килокалорий при ходьбе. // Формула расчета: // ((0.035 * вес_спортсмена_в_кг + (средняя_скорость_в_метрах_в_секунду**2 / рост_в_метрах) // * 0.029 * вес_спортсмена_в_кг) * время_тренировки_в_часах * мин_в_ч) // Это переопределенный метод Calories() из Training. func (w Walking) Calories() float64 { // вставьте ваш код ниже if w.distance() == 0 || w.Height == 0 { return 0 } firstCalc := math.Pow(w.meanSpeed()*KmHInMsec, 2) / (w.Height / CmInM) secondCalc := CaloriesWeightMultiplier*w.Weight + firstCalc*CaloriesSpeedHeightMultiplier*w.Weight return secondCalc * w.Duration.Minutes() } // TrainingInfo возвращает структуру InfoMessage с информацией о проведенной тренировке. // Это переопределенный метод TrainingInfo() из Training. func (w Walking) TrainingInfo() InfoMessage { // вставьте ваш код ниже return w.Training.TrainingInfo() } // Константы для расчета потраченных килокалорий при плавании. const ( SwimmingLenStep = 1.38 // длина одного гребка SwimmingCaloriesMeanSpeedShift = 1.1 // коэффициент изменения средней скорости SwimmingCaloriesWeightMultiplier = 2 // множитель веса пользователя ) // Swimming структура, описывающая тренировку Плавание type Swimming struct { // добавьте необходимые поля в структуру Training LengthPool int // длина бассейна CountPool int // количество пересечений бассейна } // meanSpeed возвращает среднюю скорость при плавании. // Формула расчета: // длина_бассейна * количество_пересечений / м_в_км / продолжительность_тренировки // Это переопределенный метод Calories() из Training. func (s Swimming) meanSpeed() float64 { // вставьте ваш код ниже if s.distance() == 0 || s.Duration.Hours() == 0 { return 0 } return float64(s.LengthPool) * float64(s.CountPool) / MInKm / s.Duration.Hours() } // Calories возвращает количество калорий, потраченных при плавании. // Формула расчета: // (средняя_скорость_в_км/ч + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * вес_спортсмена_в_кг * время_тренировки_в_часах // Это переопределенный метод Calories() из Training. func (s Swimming) Calories() float64 { // вставьте ваш код ниже if s.distance() == 0 { return 0 } return float64((s.meanSpeed() + SwimmingCaloriesMeanSpeedShift) * SwimmingCaloriesWeightMultiplier * s.Weight * s.Duration.Hours()) } // TrainingInfo returns info about swimming training. // Это переопределенный метод TrainingInfo() из Training. func (s Swimming) TrainingInfo() InfoMessage { // вставьте ваш код ниже return InfoMessage{ TrainingType: s.TrainingType, Duration: s.Duration, Distance: s.distance(), Speed: s.meanSpeed(), Calories: s.Calories(), } } // ReadData возвращает информацию о проведенной тренировке. func ReadData(training CaloriesCalculator) string { // получите количество затраченных калорий calories := training.Calories() // получите информацию о тренировке info := training.TrainingInfo() // добавьте полученные калории в структуру с информацией о тренировке info.Calories = calories return info.String() } func main() { swimming := Swimming{ Training: Training{ TrainingType: "Плавание", Action: 2000, LenStep: SwimmingLenStep, Duration: 90 * time.Minute, Weight: 85, }, LengthPool: 50, CountPool: 5, } fmt.Println(ReadData(swimming)) walking := Walking{ Training: Training{ TrainingType: "Ходьба", Action: 20000, LenStep: LenStep, Duration: 3*time.Hour + 45*time.Minute, Weight: 85, }, Height: 185, } fmt.Println(ReadData(walking)) running := Running{ Training: Training{ TrainingType: "Бег", Action: 5000, LenStep: LenStep, Duration: 30 * time.Minute, Weight: 85, }, } fmt.Println(ReadData(running)) }
Editor is loading...
Leave a Comment