Структуры, указатели, методы и интерфейсы

Структуры и указатели: объявление, инициализация и передача по адресу

Содержание курса

Последовательная поправка датчика

В промышленных системах мониторинга каждый датчик температуры накапливает погрешности: механический износ, дрейф опорного напряжения, температурные градиенты вблизи корпуса — всё это смещает показания относительно эталона. Чтобы не заменять оборудование при каждом отклонении, инженеры применяют программную калибровку: к текущему значению последовательно прибавляют набор заранее вычисленных поправок, каждая из которых учитывает отдельный источник погрешности.

Датчик в этой задаче обладает строковым идентификатором и целочисленным значением температуры. Идентификатор закреплён за физическим устройством и не должен меняться ни при каких обстоятельствах, тогда как температура — рабочая величина, открытая для корректировки. Список поправок задаёт строго упорядоченную последовательность шагов калибровки: каждый следующий шаг применяется к результату предыдущего, а не к исходному значению.

Задача состоит в том, чтобы реализовать функцию, принимающую адрес датчика и список целочисленных поправок, и последовательно изменяющую температуру датчика прямо по этому адресу. Если список пуст, состояние датчика остаётся нетронутым. После вызова функции датчик должен отражать итог всей цепочки поправок — именно это финальное состояние структуры и проверяется.

Что уже дано

В проекте есть редактируемый файл solution.go с типом Sensor и функцией ApplyCorrections. Публичные Go-тесты создают структуру по именам полей и вызывают функцию с адресом датчика.

Что нужно сделать

Реализуйте ApplyCorrections(sensor *Sensor, corrections []int). Она должна последовательно прибавить каждую поправку к полю Temperature исходного датчика. Идентификатор ID менять нельзя. При пустом списке состояние не меняется.

Ввод и вывод

stdin и stdout не используются. Проверяющая система запускает тесты проекта и проверяет изменённую структуру после вызова функции.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (2)· скрытых: 1
  • Public go test ./...
Go-проект · solution.go

Сначала выполняется 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)
	}
}
РешениеGo · Go 1.27 (Modal)

Отправьте решение, чтобы увидеть результаты тестов.