Сегодня вспомним, что такое медиана и накодим её нахождение на гошечке. Медиана — это число ровно посередине упорядоченного списка. Весьма полезная штука в статистике; нужна, чтобы получить не среднюю температуру по больнице, а реальное значение 🙂 Например, у нас список 55, 1, 22, 7, 92… чтобы найти медиану:
- упорядочиваем его. Получим: 1, 7, 22, 55, 92
- ищем то, что посередине.. это 22 (кэп одобряэ)
Если у нас четное количество элементов в списке, то медиана — среднее из суммы двух соседних значений. В общем, вот код самого простого варианта:
package main
import "fmt"
func main() {
var median float64
slice := []float64{3, 18, 49, 51, 121, 132}
sliceLen := len(slice)
center := sliceLen / 2
if sliceLen%2 == 0 {
median = (slice[center-1] + slice[center]) / 2
} else {
median = slice[center]
}
fmt.Println(median)
}
Упорядочивать список — это отдельная тема для разговора.. есть много разных алгоритмов сортировки (метод пузырька далеко не самый эффективный), потом их покурим в отдельном посте 🙂
А вот еще один вариант программы — где мы уже вводим значения самостоятельно. Эта версия работает только с нечетным числом членов:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func getN(r *bufio.Reader, nums int) int {
for i := 1; nums > i; i++ {
nRaw, err := r.ReadString('\n')
if err != nil {
panic(err)
}
n, err := strconv.Atoi(strings.TrimSpace(nRaw))
if err != nil {
panic(err)
}
if i > nums/2 {
return n
}
}
return 0
}
func main() {
r := bufio.NewReader(os.Stdin)
fmt.Println("How much numbers for calc?")
numsR, err := r.ReadString('\n')
if err != nil {
panic(err)
}
nums, err := strconv.Atoi(strings.TrimSpace(numsR))
if err != nil {
panic(err)
}
n := getN(r, nums)
fmt.Println(n)
}
Домашнее задание: допилите эту версию до того, чтобы она корректно работала не только с нечетными значениями, но и с чётными 😉
