Структуры и указатели: объявление, инициализация и передача по адресу
Содержание курса
Последовательная поправка датчика
В промышленных системах мониторинга каждый датчик температуры накапливает погрешности: механический износ, дрейф опорного напряжения, температурные градиенты вблизи корпуса — всё это смещает показания относительно эталона. Чтобы не заменять оборудование при каждом отклонении, инженеры применяют программную калибровку: к текущему значению последовательно прибавляют набор заранее вычисленных поправок, каждая из которых учитывает отдельный источник погрешности.
Датчик в этой задаче обладает строковым идентификатором и целочисленным значением температуры. Идентификатор закреплён за физическим устройством и не должен меняться ни при каких обстоятельствах, тогда как температура — рабочая величина, открытая для корректировки. Список поправок задаёт строго упорядоченную последовательность шагов калибровки: каждый следующий шаг применяется к результату предыдущего, а не к исходному значению.
Задача состоит в том, чтобы реализовать функцию, принимающую адрес датчика и список целочисленных поправок, и последовательно изменяющую температуру датчика прямо по этому адресу. Если список пуст, состояние датчика остаётся нетронутым. После вызова функции датчик должен отражать итог всей цепочки поправок — именно это финальное состояние структуры и проверяется.
Что уже дано
В проекте есть редактируемый файл solution.go с типом Sensor и функцией ApplyCorrections. Публичные Go-тесты создают структуру по именам полей и вызывают функцию с адресом датчика.
Что нужно сделать
Реализуйте ApplyCorrections(sensor *Sensor, corrections []int). Она должна последовательно прибавить каждую поправку к полю Temperature исходного датчика. Идентификатор ID менять нельзя. При пустом списке состояние не меняется.
Ввод и вывод
stdin и stdout не используются. Проверяющая система запускает тесты проекта и проверяет изменённую структуру после вызова функции.
О данных в ответах
Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.
- Public go test ./...
Сначала выполняется go test ./..., затем сервис собирается и проверяется HTTP-запросами. Внешняя сеть и скачивание модулей отключены.
main.go
package main
import "net/http"
func main() {
http.HandleFunc("/health", func(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
_, _ = writer.Write([]byte(`{"status":"ok"}`))
})
_ = http.ListenAndServe(":18016", nil)
}
solution_test.go
package main
import "testing"
func TestApplyCorrectionsMutatesThePassedSensor(t *testing.T) {
sensor := Sensor{ID: "T-7", Temperature: 18}
ApplyCorrections(&sensor, []int{3, -1, 4})
if sensor.ID != "T-7" || sensor.Temperature != 24 {
t.Fatalf("got %#v, want ID T-7 and temperature 24", sensor)
}
}
func TestApplyCorrectionsKeepsAnEmptySequence(t *testing.T) {
sensor := Sensor{ID: "stable", Temperature: -2}
ApplyCorrections(&sensor, nil)
if sensor != (Sensor{ID: "stable", Temperature: -2}) {
t.Fatalf("unexpected mutation: %#v", sensor)
}
}
Отправьте решение, чтобы увидеть результаты тестов.
