Skip to content
Open
Show file tree
Hide file tree
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
8 changes: 4 additions & 4 deletions cmd/tracker/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package main
import (
"fmt"

"github.com/Yandex-Practicum/go1fl-sprint5-final/internal/actioninfo"
"github.com/Yandex-Practicum/go1fl-sprint5-final/internal/daysteps"
"github.com/Yandex-Practicum/go1fl-sprint5-final/internal/personaldata"
"github.com/Yandex-Practicum/go1fl-sprint5-final/internal/trainings"
"github.com/moduleFitnessTrexter02/internal/actioninfo"
"github.com/moduleFitnessTrexter02/internal/daysteps"
"github.com/moduleFitnessTrexter02/internal/personaldata"
"github.com/moduleFitnessTrexter02/internal/trainings"
)

func main() {
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module github.com/Yandex-Practicum/go1fl-sprint5-final
module github.com/moduleFitnessTrexter02

go 1.23.6
go 1.24.0
24 changes: 21 additions & 3 deletions internal/actioninfo/actioninfo.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,29 @@
package actioninfo

import (
...
"fmt"
)

// создайте интерфейс DataParser
...
type DataParser interface {
Parse(string) error
ActionInfo() (string, error)
}

// создайте функцию Info()
...
func Info(dataset []string, dp DataParser) {
for _, v := range dataset {

err := dp.Parse(v)
if err != nil {
fmt.Printf("error dp.Parse: %v", err)
continue
}
data, err := dp.ActionInfo()
if err != nil {
fmt.Printf("[Ошибка] %v\n\n", err)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

кажется опечатка с вторым переводом строки \n

continue
}
fmt.Println(data)
}
}
52 changes: 47 additions & 5 deletions internal/daysteps/daysteps.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,61 @@
package daysteps

import (
...
"fmt"
"strconv"
"strings"
"time"

"github.com/moduleFitnessTrexter02/internal/personaldata"
"github.com/moduleFitnessTrexter02/internal/spentenergy"
)

const (
StepLength = 0.65
)

// создайте структуру DaySteps
...

type DaySteps struct {
Steps int
Duration time.Duration
personaldata.Personal
}

// создайте метод Parse()
...
func (ds *DaySteps) Parse(datastring string) (err error) {

parts := strings.Split(datastring, ",")
if len(parts) != 2 {
return fmt.Errorf("invalid format: expected 2 parts, got %d", len(parts))
}

stepsStr := strings.TrimSpace(parts[0])
ds.Steps, err = strconv.Atoi(stepsStr)
if err != nil {
return fmt.Errorf("steps conversion error: %w", err)
}

durationStr := strings.TrimSpace(parts[1])
ds.Duration, err = time.ParseDuration(durationStr)
if err != nil {
return fmt.Errorf("duration parsing error: %w", err)
}

return nil
}

// создайте метод ActionInfo()
...
func (ds DaySteps) ActionInfo() (string, error) {
if ds.Duration <= 0 {
return "", fmt.Errorf("duration <= 0 error")
}
if ds.Weight <= 0 {
return "", fmt.Errorf("weight <= 0 error")
}

calcDistanse := spentenergy.Distance(ds.Steps)
calories := spentenergy.WalkingSpentCalories(ds.Steps, ds.Personal.Weight, ds.Personal.Height, ds.Duration)

return fmt.Sprintf("Количество шагов: %d.\nДистанция составила %f км.\nВы сожгли %f ккал.", ds.Steps, calcDistanse, calories), nil

}
15 changes: 11 additions & 4 deletions internal/personaldata/personaldata.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package personaldata

import ...
import (
"fmt"
)

// Ниже создайте структуру Personal
...
type Personal struct {
Name string
Weight float64
Height float64
}

// Ниже создайте метод Print()
...

func (p Personal) Print() {
fmt.Printf("Имя: %s\nВес: %.2f\nРост: %.2f\n", p.Name, p.Height, p.Weight)
}
58 changes: 49 additions & 9 deletions internal/spentenergy/spentenergy.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package spentenergy

import ...
import (
"fmt"
"time"
)

// Основные константы, необходимые для расчетов.
const (
Expand Down Expand Up @@ -28,8 +31,20 @@ const (
// duration time.Duration — длительность тренировки.
//
// Создайте функцию ниже.
...

func WalkingSpentCalories(steps int, weight, height float64, duration time.Duration) float64 {
if weight <= 0 || height <= 0 {
fmt.Println("error, weight or height <= 0 in WalkingSpentCalories")
return 0
}
if duration <= 0 {
fmt.Println("error, duration <= 0 in WalkingSpentCalories")
return 0
}
averageSpeed := MeanSpeed(steps, duration)
durationHours := duration.Hours()
WalkCalories := ((walkingCaloriesWeightMultiplier * weight) + (averageSpeed*averageSpeed/height)*walkingSpeedHeightMultiplier) * float64(durationHours) * minInH
return WalkCalories
}

// Константы для расчета калорий, расходуемых при беге.
const (
Expand All @@ -46,28 +61,53 @@ const (
// duration time.Duration — длительность тренировки.
//
// Создайте функцию ниже.
...
func RunningSpentCalories(steps int, weight float64, duration time.Duration) float64 {

if weight <= 0 {
fmt.Println("error, weight <= 0 in RunningSpentCalories")
return 0
}
if duration <= 0 {
fmt.Println("error, duration <= 0 in RunningSpentCalories")
return 0

}
meanSpeed := MeanSpeed(steps, duration)
RunCalories := ((runningCaloriesMeanSpeedMultiplier * meanSpeed) - runningCaloriesMeanSpeedShift) * weight
return float64(RunCalories)
}

// МeanSpeed возвращает значение средней скорости движения во время тренировки.
//
// Параметры:
//
// steps int — количество совершенных действий(число шагов при ходьбе и беге).
// duration time.Duration — длительность тренировки.
//
//
// Создайте функцию ниже.
...
func MeanSpeed(steps int, duration time.Duration) float64 {
if duration <= 0 {
return 0
}

Distance := Distance(steps)

durationHours := duration.Hours()
meanSpeed := Distance / float64(durationHours)
return float64(meanSpeed)

}

// Distance возвращает дистанцию(в километрах), которую преодолел пользователь за время тренировки.
//
// Для расчета дистанции нужно шаги умножить на длину шага lenStep и разделить на mInKm
// Параметры:
//
// steps int — количество совершенных действий (число шагов при ходьбе и беге).
//
//
// Создайте функцию ниже
...


func Distance(steps int) float64 {
Distance := (float64(steps) * lenStep) / float64(mInKm)
return Distance
}
72 changes: 67 additions & 5 deletions internal/trainings/trainings.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,78 @@
package trainings

import (
...
"fmt"
"strconv"
"strings"
"time"

"github.com/moduleFitnessTrexter02/internal/personaldata"
"github.com/moduleFitnessTrexter02/internal/spentenergy"
)

// создайте структуру Training
...

type Training struct {
Steps int
TrainingType string
Duration time.Duration
personaldata.Personal
}

// создайте метод Parse()
...
func (t *Training) Parse(datastring string) (err error) {
parts := strings.Split(datastring, ",")
if len(parts) != 3 {
return fmt.Errorf("invalid format: expected 3 parts, got %d", len(parts))
}

// Очищаем пробелы
stepsStr := strings.TrimSpace(parts[0])
typeStr := strings.TrimSpace(parts[1])
durationStr := strings.TrimSpace(parts[2])

// Парсим шаги
t.Steps, err = strconv.Atoi(stepsStr)
if err != nil {
return fmt.Errorf("steps conversion error: %w", err)
}

// Проверяем тип тренировки
if typeStr != "Ходьба" && typeStr != "Бег" {
return fmt.Errorf("invalid activity type: %s, expected 'Ходьба' or 'Бег'", typeStr)
}
t.TrainingType = typeStr

// Парсим продолжительность
t.Duration, err = time.ParseDuration(durationStr)
if err != nil {
return fmt.Errorf("duration parsing error: %w", err)
}

return nil
}

// создайте метод ActionInfo()
...
func (t Training) ActionInfo() (string, error) {
// 1. Исправление опечатки
calcDistance := spentenergy.Distance(t.Steps)
if calcDistance <= 0 {
return "", fmt.Errorf("distance calculation error: result is %f (non-positive)", calcDistance)
}

averageSpeed := spentenergy.MeanSpeed(t.Steps, t.Duration)

var calories float64

switch t.TrainingType {
case "Бег":
calories = spentenergy.RunningSpentCalories(t.Steps, t.Personal.Weight, t.Duration)

case "Ходьба":
calories = spentenergy.WalkingSpentCalories(t.Steps, t.Personal.Weight, t.Personal.Height, t.Duration)

default:
return "", fmt.Errorf("unknown training type: %s", t.TrainingType)
}
return fmt.Sprintf(
"Тип тренировки: %s\nДлительность: %v\nДистанция: %.2f км\nСкорость: %.2f км/ч\nСожгли калорий: %.2f", t.TrainingType, t.Duration, calcDistance, averageSpeed, calories), nil
}