From 511878ae86c61932551ee2c7294e8087b920ff62 Mon Sep 17 00:00:00 2001 From: Alexey Lampsi Date: Mon, 3 Mar 2025 03:17:11 +0300 Subject: [PATCH 1/3] first commit --- cmd/tracker/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/tracker/main.go b/cmd/tracker/main.go index 711b70e..60e8c74 100644 --- a/cmd/tracker/main.go +++ b/cmd/tracker/main.go @@ -3,8 +3,8 @@ package main import ( "fmt" - "github.com/Yandex-Practicum/go1fl-4-sprint-final/internal/daysteps" - "github.com/Yandex-Practicum/go1fl-4-sprint-final/internal/spentcalories" + "github.com/exercise/internal/daysteps" + "github.com/exercise/internal/spentcalories" ) func main() { From c770f90e0ad24be515dc72e202883e8ea6e991d7 Mon Sep 17 00:00:00 2001 From: Alexey Lampsi Date: Tue, 4 Mar 2025 18:53:23 +0300 Subject: [PATCH 2/3] second commit --- go.mod | 4 +- internal/daysteps/daysteps.go | 43 ++++++++++- internal/spentcalories/spentCalories.go | 98 +++++++++++++++++++++++-- 3 files changed, 134 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 67f76bf..779e12f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/Yandex-Practicum/go1fl-4-sprint-final +module github.com/exercise -go 1.23.5 +go 1.24.0 diff --git a/internal/daysteps/daysteps.go b/internal/daysteps/daysteps.go index 18bb45c..5b0bac2 100644 --- a/internal/daysteps/daysteps.go +++ b/internal/daysteps/daysteps.go @@ -1,7 +1,12 @@ package daysteps import ( + "fmt" + "strconv" + "strings" "time" + + "github.com/exercise/internal/spentcalories" ) var ( @@ -9,7 +14,28 @@ var ( ) func parsePackage(data string) (int, time.Duration, error) { - // ваш код ниже + var steps int + var duration time.Duration + var err error + + partsData := strings.Split(data, ",") + if len(partsData) != 2 { + return 0, 0, fmt.Errorf("error partsData need 2 parts, got %d", len(partsData)) + } + + stepsStr := strings.TrimSpace(partsData[0]) + durationStr := strings.TrimSpace(partsData[1]) + + steps, err = strconv.Atoi(stepsStr) + if err != nil { + return 0, 0, fmt.Errorf("error convert stepStr to integer") + } + + duration, err = time.ParseDuration(durationStr) + if err != nil { + return 0, 0, fmt.Errorf("error convert durationStr to time.Duration") + } + return steps, duration, nil } // DayActionInfo обрабатывает входящий пакет, который передаётся в @@ -19,5 +45,18 @@ func parsePackage(data string) (int, time.Duration, error) { // Если пакет валидный, он добавляется в слайс storage, который возвращает // функция. Если пакет невалидный, storage возвращается без изменений. func DayActionInfo(data string, weight, height float64) string { - // ваш код ниже + steps, duration, err := parsePackage(data) + if err != nil { + fmt.Errorf("error DayActionInfo, failed parsePackage(data)") + return "" + } + + if steps <= 0 { + return "" + } + distance := float64(steps) * StepLength + kmDistance := distance / 10 + kalories := spentcalories.WalkingSpentCalories(steps, weight, height, duration) // (steps int, weight, height float64, duration time.Duration) float64 + + return fmt.Sprintf(" Колличество шагов: %d\n Дистанция составила %.2fкм.\n Вы сожгли %.2f ккал.", steps, kmDistance, kalories) } diff --git a/internal/spentcalories/spentCalories.go b/internal/spentcalories/spentCalories.go index 03761ad..3c31a17 100644 --- a/internal/spentcalories/spentCalories.go +++ b/internal/spentcalories/spentCalories.go @@ -1,6 +1,9 @@ package spentcalories import ( + "fmt" + "strconv" + "strings" "time" ) @@ -14,7 +17,32 @@ const ( ) func parseTraining(data string) (int, string, time.Duration, error) { - // ваш код ниже + + var steps int + var species string + var duration time.Duration + var err error + + partsData := strings.Split(data, ",") + if len(partsData) != 3 { + return 0, "", 0, fmt.Errorf("error partsData, need len 3, have %d", len(partsData)) + } + + stepsStr := strings.TrimSpace(partsData[0]) + speciesStr := strings.TrimSpace(partsData[1]) // удаляем пробелы + durationStr := strings.TrimSpace(partsData[2]) + + species = speciesStr // сразу поместим в нужную переменную + steps, err = strconv.Atoi(stepsStr) + if err != nil { + return 0, "", 0, fmt.Errorf("error convert stepsStr to integer") + } + + duration, err = time.ParseDuration(durationStr) + if err != nil { + return 0, "", 0, fmt.Errorf("error convert durationStr to time.duration") + } + return steps, species, duration, nil } // distance возвращает дистанцию(в километрах), которую преодолел пользователь за время тренировки. @@ -23,7 +51,8 @@ func parseTraining(data string) (int, string, time.Duration, error) { // // steps int — количество совершенных действий (число шагов при ходьбе и беге). func distance(steps int) float64 { - // ваш код ниже + result := (float64(steps) * lenStep) / mInKm + return result } // meanSpeed возвращает значение средней скорости движения во время тренировки. @@ -33,7 +62,15 @@ func distance(steps int) float64 { // steps int — количество совершенных действий(число шагов при ходьбе и беге). // duration time.Duration — длительность тренировки. func meanSpeed(steps int, duration time.Duration) float64 { - // ваш код ниже + if duration <= 0 || steps == 0 { + return 0 + } + distance := distance(steps) + hourDuration := duration.Hours() // переводим в часы float64 + + avgHoursPerUnit := distance / hourDuration // вычисляем ср. скорость + return avgHoursPerUnit + } // ShowTrainingInfo возвращает строку с информацией о тренировке. @@ -43,7 +80,41 @@ func meanSpeed(steps int, duration time.Duration) float64 { // data string - строка с данными. // weight, height float64 — вес и рост пользователя. func TrainingInfo(data string, weight, height float64) string { - // ваш код ниже + + var resultCalories float64 + var resultDistance float64 + var resultAvgSpeed float64 + + steps, species, duration, err := parseTraining(data) + if err != nil { + fmt.Errorf("TrainingInfo error parseTraining(data): %w", err) + return "" + } + durationHours := duration.Hours() + + switch species { + case "Бег": + resultCalories = RunningSpentCalories(steps, weight, duration) + resultDistance = distance(steps) + resultAvgSpeed = meanSpeed(steps, duration) + + case "Ходьба": + resultDistance = distance(steps) + resultAvgSpeed = meanSpeed(steps, duration) + resultCalories = WalkingSpentCalories(steps, weight, height, duration) + default: + return "неизвестный тип тренировки" + } + + return fmt.Sprintf( + "Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", + species, // тип тренировки (string) + durationHours, // длительность в часах (float64) + resultDistance, // дистанция (float64) + resultAvgSpeed, // скорость (float64) + resultCalories, // калории (float64) + ) + } // Константы для расчета калорий, расходуемых при беге. @@ -60,8 +131,12 @@ const ( // weight float64 — вес пользователя. // duration time.Duration — длительность тренировки. func RunningSpentCalories(steps int, weight float64, duration time.Duration) float64 { - // ваш код здесь - + avgHoursPerUnit := meanSpeed(steps, duration) + if avgHoursPerUnit <= 0 || weight <= 0 { + return 0 + } + calories := ((runningCaloriesMeanSpeedMultiplier * avgHoursPerUnit) - runningCaloriesMeanSpeedShift) * weight + return calories } // Константы для расчета калорий, расходуемых при ходьбе. @@ -79,6 +154,15 @@ const ( // weight float64 — вес пользователя. // height float64 — рост пользователя. func WalkingSpentCalories(steps int, weight, height float64, duration time.Duration) float64 { - // ваш код здесь + if weight <= 0 || height <= 0 || duration <= 0 || steps <= 0 { + return 0 + } + avgHoursPerUnit := meanSpeed(steps, duration) + if avgHoursPerUnit <= 0 { + return 0 + } + durationHours := duration.Hours() // превращаеи duration в часы float64 + calories := ((walkingCaloriesWeightMultiplier * weight) + (avgHoursPerUnit*avgHoursPerUnit/height)*walkingSpeedHeightMultiplier) * durationHours * minInH + return calories } From 55c2dee7c9c9618fedb800aa5a3301e0c3904d1e Mon Sep 17 00:00:00 2001 From: Alexey Lampsi Date: Wed, 5 Mar 2025 16:39:52 +0300 Subject: [PATCH 3/3] last commit --- internal/daysteps/daysteps.go | 7 ++++--- internal/spentcalories/spentCalories.go | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/daysteps/daysteps.go b/internal/daysteps/daysteps.go index 5b0bac2..b7649e4 100644 --- a/internal/daysteps/daysteps.go +++ b/internal/daysteps/daysteps.go @@ -14,7 +14,7 @@ var ( ) func parsePackage(data string) (int, time.Duration, error) { - var steps int + var duration time.Duration var err error @@ -26,6 +26,7 @@ func parsePackage(data string) (int, time.Duration, error) { stepsStr := strings.TrimSpace(partsData[0]) durationStr := strings.TrimSpace(partsData[1]) + var steps int steps, err = strconv.Atoi(stepsStr) if err != nil { return 0, 0, fmt.Errorf("error convert stepStr to integer") @@ -52,10 +53,10 @@ func DayActionInfo(data string, weight, height float64) string { } if steps <= 0 { - return "" + return fmt.Sprintf("steps <0 err: %s", err.Error()) } distance := float64(steps) * StepLength - kmDistance := distance / 10 + kmDistance := distance / 1000 kalories := spentcalories.WalkingSpentCalories(steps, weight, height, duration) // (steps int, weight, height float64, duration time.Duration) float64 return fmt.Sprintf(" Колличество шагов: %d\n Дистанция составила %.2fкм.\n Вы сожгли %.2f ккал.", steps, kmDistance, kalories) diff --git a/internal/spentcalories/spentCalories.go b/internal/spentcalories/spentCalories.go index 3c31a17..9a8c6e3 100644 --- a/internal/spentcalories/spentCalories.go +++ b/internal/spentcalories/spentCalories.go @@ -87,8 +87,7 @@ func TrainingInfo(data string, weight, height float64) string { steps, species, duration, err := parseTraining(data) if err != nil { - fmt.Errorf("TrainingInfo error parseTraining(data): %w", err) - return "" + return fmt.Sprintf("Data parsing error: %s", err.Error()) } durationHours := duration.Hours()