-
Notifications
You must be signed in to change notification settings - Fork 0
first commit #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
first commit #1
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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 { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Метод 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() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @LiebeBleck нужно реализовать метод func (s Swimming) TrainingInfo() InfoMessage { There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Для реализации этого метода для структуры Swimming{} нужно полностью переопределить TrainingInfo() с учетом того, как рассчитывается средняя скорость для плавания, дистанция и так далее. Реализация TrainingInfo() для Swimming{} будет похожа на реализацию TrainingInfo() для Training{}, но с иcпользованием методов для Swimming{}. |
||
| } | ||
|
|
||
| // 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() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. тут нужно поле Calories переопределить - иначе там напечатаются 0 для Walking и Running |
||
| } | ||
|
|
||
| // 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)) | ||
|
|
||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Метод TrainingInfo() возвращает переменную структуры InfoMessage{} с информацией о проведённой
тренировке.
Для реализации этого метода для структуры Running{} нужно вернуть вызов такого же метода TrainingInfo(), только для структуры Training{}. Вспомните, как вызывать методы встроенной структуры.