diff --git a/.github/workflows/autotest.yml b/.github/workflows/autotest.yml index 2368d0b..a23563e 100644 --- a/.github/workflows/autotest.yml +++ b/.github/workflows/autotest.yml @@ -10,7 +10,7 @@ jobs: ftrackertest: runs-on: ubuntu-latest - container: golang:1.21 + container: golang:1.23 steps: - name: Checkout code diff --git a/__debug_bin2564749646.exe b/__debug_bin2564749646.exe new file mode 100644 index 0000000..8373107 Binary files /dev/null and b/__debug_bin2564749646.exe differ diff --git a/bash.exe.stackdump b/bash.exe.stackdump new file mode 100644 index 0000000..370fee9 --- /dev/null +++ b/bash.exe.stackdump @@ -0,0 +1,40 @@ +Stack trace: +Frame Function Args +0007FFFFC720 00021005FEBA (00021029E1D0, 00021026AB81, 000000000063, 0007FFFFB670) msys-2.0.dll+0x1FEBA +0007FFFFC720 0002100467F9 (0007FFFFC720, 000200000000, 000700000000, 000700000001) msys-2.0.dll+0x67F9 +0007FFFFC720 000210046832 (000000000000, 000000000000, 000000000063, 000200000003) msys-2.0.dll+0x6832 +0007FFFFC720 0002100FF9B1 (000210173780, 000800007AD8, 000000000000, 000000000013) msys-2.0.dll+0xBF9B1 +00021026D320 0002100FF9C9 (000A00001690, 000000000044, 000210176196, 0007FFFFCAB0) msys-2.0.dll+0xBF9C9 +00021026D320 000210102455 (00000000000D, 00021026D320, 0007FFFFCA70, 000000000000) msys-2.0.dll+0xC2455 +00021026D320 000210057D77 (000000000004, 000000000004, 0007FFFFC9F8, 0000FFFFFFFF) msys-2.0.dll+0x17D77 +00021026D320 00021005862D (6F5C4C5C5C5C615C, 5C5C6C5C615C635C, 675C6F5C725C505C, 735C6D5C615C725C) msys-2.0.dll+0x1862D +0000027F0720 000210058B07 (000000000000, 000000000000, 000000000000, 000000000000) msys-2.0.dll+0x18B07 +0007FFFFCD30 000210058E3E (000000000000, 000000000000, 0002100C9939, 000000000000) msys-2.0.dll+0x18E3E +0007FFFFCD30 000210046FA9 (000000000000, 000000000000, 000000000000, 000000000000) msys-2.0.dll+0x6FA9 +000000000000 000210045AC3 (000000000000, 000000000000, 000000000000, 000000000000) msys-2.0.dll+0x5AC3 +0007FFFFFFF0 000210045B74 (000000000000, 000000000000, 000000000000, 000000000000) msys-2.0.dll+0x5B74 +End of stack trace +Loaded modules: +000100400000 bash.exe +7FFCAFAF0000 ntdll.dll +7FFCAE570000 KERNEL32.DLL +7FFCACE00000 KERNELBASE.dll +7FFCADD60000 USER32.dll +000210040000 msys-2.0.dll +7FFCAD580000 win32u.dll +7FFCAEAC0000 GDI32.dll +7FFCAD6D0000 gdi32full.dll +7FFCAD230000 msvcp_win.dll +7FFCAD5B0000 ucrtbase.dll +7FFCAEAF0000 advapi32.dll +7FFCAF4D0000 msvcrt.dll +7FFCAD8F0000 sechost.dll +7FFCACDD0000 bcrypt.dll +7FFCADC40000 RPCRT4.dll +7FFCAC500000 CRYPTBASE.DLL +7FFCAD440000 bcryptPrimitives.dll +7FFCAE6D0000 IMM32.DLL +7FFC9D630000 netapi32.dll +7FFC9A7B0000 SAMCLI.DLL +7FFCA00F0000 SAMLIB.dll +7FFCAB890000 NETUTILS.DLL diff --git a/ftracker.go b/ftracker.go index edf04d5..54e7d8e 100644 --- a/ftracker.go +++ b/ftracker.go @@ -1,17 +1,17 @@ package ftracker import ( - "fmt" - "math" + "fmt" + "math" ) // Основные константы, необходимые для расчетов. const ( - lenStep = 0.65 // средняя длина шага. - mInKm = 1000 // количество метров в километре. - minInH = 60 // количество минут в часе. - kmhInMsec = 0.278 // коэффициент для преобразования км/ч в м/с. - cmInM = 100 // количество сантиметров в метре. + lenStep = 0.65 // средняя длина шага. + mInKm = 1000 // количество метров в километре. + minInH = 60 // количество минут в часе. + kmhInMsec = 0.278 // коэффициент для преобразования км/ч в м/с. + cmInM = 100 // количество сантиметров в метре. ) // distance возвращает дистанцию(в километрах), которую преодолел пользователь за время тренировки. @@ -20,7 +20,7 @@ const ( // // action int — количество совершенных действий (число шагов при ходьбе и беге, либо гребков при плавании). func distance(action int) float64 { - return float64(action) * lenStep / mInKm + return float64(action) * lenStep / mInKm } // meanSpeed возвращает значение средней скорости движения во время тренировки. @@ -30,11 +30,11 @@ func distance(action int) float64 { // action int — количество совершенных действий(число шагов при ходьбе и беге, либо гребков при плавании). // duration float64 — длительность тренировки в часах. func meanSpeed(action int, duration float64) float64 { - if duration == 0 { - return 0 - } - distance := distance(action) - return distance / duration + if duration == 0 { + return 0 + } + distance := distance(action) + return distance / duration } // ShowTrainingInfo возвращает строку с информацией о тренировке. @@ -45,22 +45,22 @@ func meanSpeed(action int, duration float64) float64 { // trainingType string — вид тренировки(Бег, Ходьба, Плавание). // duration float64 — длительность тренировки в часах. func ShowTrainingInfo(action int, trainingType string, duration, weight, height float64, lengthPool, countPool int) string { - // ваш код здесь - switch { + // ваш код здесь + switch { case trainingType == "Бег": - distance := ... // вызовите здесь необходимую функцию - speed := ... // вызовите здесь необходимую функцию - calories := ... // вызовите здесь необходимую функцию + distance := distance(action) // вызовите здесь необходимую функцию + speed := meanSpeed(action, duration) // вызовите здесь необходимую функцию + calories := RunningSpentCalories(action, weight, duration) // вызовите здесь необходимую функцию return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories) case trainingType == "Ходьба": - distance := ... // вызовите здесь необходимую функцию - speed := ... // вызовите здесь необходимую функцию - calories := ... // вызовите здесь необходимую функцию + distance := distance(action) // вызовите здесь необходимую функцию + speed := meanSpeed(action, duration) // вызовите здесь необходимую функцию + calories := WalkingSpentCalories(action, duration, weight, height) // вызовите здесь необходимую функцию return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories) case trainingType == "Плавание": - distance := ... // вызовите здесь необходимую функцию - speed := ... // вызовите здесь необходимую функцию - calories := ... // вызовите здесь необходимую функцию + distance := distance(action) // вызовите здесь необходимую функцию + speed := swimmingMeanSpeed(lengthPool, countPool, duration) // вызовите здесь необходимую функцию + calories := SwimmingSpentCalories(lengthPool, countPool, duration, weight) // вызовите здесь необходимую функцию return fmt.Sprintf("Тип тренировки: %s\nДлительность: %.2f ч.\nДистанция: %.2f км.\nСкорость: %.2f км/ч\nСожгли калорий: %.2f\n", trainingType, duration, distance, speed, calories) default: return "неизвестный тип тренировки" @@ -69,8 +69,8 @@ func ShowTrainingInfo(action int, trainingType string, duration, weight, height // Константы для расчета калорий, расходуемых при беге. const ( - runningCaloriesMeanSpeedMultiplier = 18 // множитель средней скорости. - runningCaloriesMeanSpeedShift = 1.79 // среднее количество сжигаемых калорий при беге. + runningCaloriesMeanSpeedMultiplier = 18 // множитель средней скорости. + runningCaloriesMeanSpeedShift = 1.79 // среднее количество сжигаемых калорий при беге. ) // RunningSpentCalories возвращает количество потраченных колорий при беге. @@ -81,14 +81,18 @@ const ( // weight float64 — вес пользователя. // duration float64 — длительность тренировки в часах. func RunningSpentCalories(action int, weight, duration float64) float64 { - // ваш код здесь - ... + // ваш код здесь + runningMeanSpeed := meanSpeed(action, duration) + runningSpentCalories := runningCaloriesMeanSpeedMultiplier * runningMeanSpeed * runningCaloriesMeanSpeedShift * weight + runningSpentCalories /= mInKm + runningSpentCalories *= duration * minInH + return runningSpentCalories } // Константы для расчета калорий, расходуемых при ходьбе. const ( - walkingCaloriesWeightMultiplier = 0.035 // множитель массы тела. - walkingSpeedHeightMultiplier = 0.029 // множитель роста. + walkingCaloriesWeightMultiplier = 0.035 // множитель массы тела. + walkingSpeedHeightMultiplier = 0.029 // множитель роста. ) // WalkingSpentCalories возвращает количество потраченных калорий при ходьбе. @@ -100,14 +104,22 @@ const ( // weight float64 — вес пользователя. // height float64 — рост пользователя. func WalkingSpentCalories(action int, duration, weight, height float64) float64 { - // ваш код здесь - ... + // ваш код здесь + walkingMeanSpeedKmH := meanSpeed(action, duration) + walkingMeanSpeedMSec := walkingMeanSpeedKmH * kmhInMsec + walkingSpentCalories := math.Pow(walkingMeanSpeedMSec, 2) + heightInM := height / cmInM + walkingSpentCalories /= heightInM + walkingSpentCalories *= walkingSpeedHeightMultiplier * weight + walkingSpentCalories += walkingCaloriesWeightMultiplier * weight + walkingSpentCalories *= duration * minInH + return walkingSpentCalories } // Константы для расчета калорий, расходуемых при плавании. const ( - swimmingCaloriesMeanSpeedShift = 1.1 // среднее количество сжигаемых колорий при плавании относительно скорости. - swimmingCaloriesWeightMultiplier = 2 // множитель веса при плавании. + swimmingCaloriesMeanSpeedShift = 1.1 // среднее количество сжигаемых колорий при плавании относительно скорости. + swimmingCaloriesWeightMultiplier = 2 // множитель веса при плавании. ) // swimmingMeanSpeed возвращает среднюю скорость при плавании. @@ -118,10 +130,10 @@ const ( // countPool int — сколько раз пользователь переплыл бассейн. // duration float64 — длительность тренировки в часах. func swimmingMeanSpeed(lengthPool, countPool int, duration float64) float64 { - if duration == 0 { - return 0 - } - return float64(lengthPool) * float64(countPool) / mInKm / duration + if duration == 0 { + return 0 + } + return (float64(lengthPool) * float64(countPool) / mInKm / duration) } // SwimmingSpentCalories возвращает количество потраченных калорий при плавании. @@ -133,6 +145,9 @@ func swimmingMeanSpeed(lengthPool, countPool int, duration float64) float64 { // duration float64 — длительность тренировки в часах. // weight float64 — вес пользователя. func SwimmingSpentCalories(lengthPool, countPool int, duration, weight float64) float64 { - // ваш код здесь - ... + // ваш код здесь + swimmingSpentCalories := swimmingMeanSpeed(lengthPool, countPool, duration) + swimmingSpentCalories += swimmingCaloriesMeanSpeedShift + swimmingSpentCalories *= swimmingCaloriesWeightMultiplier * weight * duration + return swimmingSpentCalories } diff --git a/ftracker_test.go b/ftracker_test.go index 1cca348..1a4717d 100644 --- a/ftracker_test.go +++ b/ftracker_test.go @@ -14,6 +14,14 @@ func Test_distance(t *testing.T) { want float64 }{ // TODO: Add test cases. + + { + name: "Success test", + args: args{ + action: 4000, + }, + want: 2.6, + }, { name: "Success test", args: args{ @@ -56,6 +64,22 @@ func Test_meanSpeed(t *testing.T) { want float64 }{ // TODO: Add test cases. + { + name: "Negative value of speed", + args: args{ + action: -1000, + duration: 2.0, + }, + want: -0.325, + }, + { + name: "Successful test", + args: args{ + action: 5500, + duration: 5.5, + }, + want: 0.65, + }, { name: "Successful test", args: args{ @@ -162,6 +186,19 @@ func TestShowTrainingInfo(t *testing.T) { }, want: unknownTest, }, + { + name: "unknown test", + args: args{ + action: 2300, + trainingType: "Гандбол", + duration: 3, + weight: 80, + height: 186, + lengthPool: 25, + countPool: 4, + }, + want: unknownTest, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/go.mod b/go.mod index 264a943..f6be94c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/Yandex-Practicum/go-first-floor-sprint-four -go 1.20 +go 1.23.2 + +toolchain go1.23.2 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e69de29