Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
235 changes: 102 additions & 133 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,195 +2,167 @@ 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)
info := training.TrainingInfo()
// Переопределяем поле Calories, используя метод Calories() конкретной структуры
info.Calories = training.Calories()
return info.String()
}

// main демонстрация работы программы
func main() {

swimming := Swimming{
Training: Training{
TrainingType: "Плавание",
Expand All @@ -200,11 +172,9 @@ func main() {
Weight: 85,
},
LengthPool: 50,
CountPool: 5,
CountPool: 40,
}

fmt.Println(ReadData(swimming))

walking := Walking{
Training: Training{
TrainingType: "Ходьба",
Expand All @@ -216,8 +186,6 @@ func main() {
Height: 185,
}

fmt.Println(ReadData(walking))

running := Running{
Training: Training{
TrainingType: "Бег",
Expand All @@ -228,6 +196,7 @@ func main() {
},
}

fmt.Println(ReadData(swimming))
fmt.Println(ReadData(walking))
fmt.Println(ReadData(running))

}