diff --git a/cmd/tracker/main.go b/cmd/tracker/main.go index 8f8657e..03aceb8 100644 --- a/cmd/tracker/main.go +++ b/cmd/tracker/main.go @@ -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() { diff --git a/go.mod b/go.mod index 0794771..a8ca0a9 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/Yandex-Practicum/go1fl-sprint5-final +module github.com/moduleFitnessTrexter02 -go 1.23.6 +go 1.24.0 diff --git a/internal/actioninfo/actioninfo.go b/internal/actioninfo/actioninfo.go index 5a876d7..b2c1332 100644 --- a/internal/actioninfo/actioninfo.go +++ b/internal/actioninfo/actioninfo.go @@ -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) + continue + } + fmt.Println(data) + } +} diff --git a/internal/daysteps/daysteps.go b/internal/daysteps/daysteps.go index 8adcf56..4b7bc90 100644 --- a/internal/daysteps/daysteps.go +++ b/internal/daysteps/daysteps.go @@ -1,7 +1,13 @@ package daysteps import ( - ... + "fmt" + "strconv" + "strings" + "time" + + "github.com/moduleFitnessTrexter02/internal/personaldata" + "github.com/moduleFitnessTrexter02/internal/spentenergy" ) const ( @@ -9,11 +15,47 @@ const ( ) // создайте структуру 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 + +} diff --git a/internal/personaldata/personaldata.go b/internal/personaldata/personaldata.go index 4461ad6..0ee957e 100644 --- a/internal/personaldata/personaldata.go +++ b/internal/personaldata/personaldata.go @@ -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) +} diff --git a/internal/spentenergy/spentenergy.go b/internal/spentenergy/spentenergy.go index 9488aa7..d2d8354 100644 --- a/internal/spentenergy/spentenergy.go +++ b/internal/spentenergy/spentenergy.go @@ -1,6 +1,9 @@ package spentenergy -import ... +import ( + "fmt" + "time" +) // Основные константы, необходимые для расчетов. const ( @@ -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 ( @@ -46,8 +61,21 @@ 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 возвращает значение средней скорости движения во время тренировки. // @@ -55,10 +83,20 @@ const ( // // 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 возвращает дистанцию(в километрах), которую преодолел пользователь за время тренировки. // @@ -66,8 +104,10 @@ const ( // Параметры: // // steps int — количество совершенных действий (число шагов при ходьбе и беге). -// +// // Создайте функцию ниже -... - +func Distance(steps int) float64 { + Distance := (float64(steps) * lenStep) / float64(mInKm) + return Distance +} diff --git a/internal/trainings/trainings.go b/internal/trainings/trainings.go index a8046bf..9e3d4d5 100644 --- a/internal/trainings/trainings.go +++ b/internal/trainings/trainings.go @@ -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 +}