Фильтрация элементов массива
1. Задача: вывод только чётных чисел
Условие
Из массива чисел вывести только те, которые делятся на 2 без остатка.
Пример
Массив: [12, 7, 23, 14, 9, 18, 5, 20]
Чётные: 12 14 18 20
2. Алгоритм
Шаги:
- Пройти по всем элементам массива
- Проверить каждый элемент:
число % 2 == 0 - Если условие выполнено → вывести число
3. Реализация
data := [8]int{12, 7, 23, 14, 9, 18, 5, 20}
fmt.Print("Чётные числа: ")
for i := 0; i < len(data); i++ {
if data[i] % 2 == 0 { // Остаток от деления на 2
fmt.Printf("%d ", data[i])
}
}
fmt.Println()
Вывод:
Чётные числа: 12 14 18 20
4. Проверка чётности: оператор %
Модуль (остаток от деления)
12 % 2 == 0 // true → чётное
7 % 2 == 1 // false → нечётное
14 % 2 == 0 // true → чётное
9 % 2 == 1 // false → нечётное
Правило: Если число % 2 == 0 → число чётное.
5. Пошаговая трассировка
Массив
Индекс: 0 1 2 3 4 5 6 7
Данные: [12, 7, 23, 14, 9, 18, 5, 20]
Итерация по элементам
i=0: data[0] = 12
12 % 2 == 0? → ДА
Вывод: 12
i=1: data[1] = 7
7 % 2 == 0? → НЕТ (остаток 1)
Пропускаем
i=2: data[2] = 23
23 % 2 == 0? → НЕТ
Пропускаем
i=3: data[3] = 14
14 % 2 == 0? → ДА
Вывод: 14
i=4: data[4] = 9
9 % 2 == 0? → НЕТ
Пропускаем
i=5: data[5] = 18
18 % 2 == 0? → ДА
Вывод: 18
i=6: data[6] = 5
5 % 2 == 0? → НЕТ
Пропускаем
i=7: data[7] = 20
20 % 2 == 0? → ДА
Вывод: 20
Результат: 12 14 18 20 ✅
6. Применение со случайными числами
rand.Seed(time.Now().UnixNano())
var nums [10]int
for i := 0; i < len(nums); i++ {
nums[i] = rand.Intn(100) + 1
}
fmt.Printf("Массив: %v\n", nums)
fmt.Print("Чётные: ")
for i := 0; i < len(nums); i++ {
if nums[i] % 2 == 0 {
fmt.Printf("%d ", nums[i])
}
}
Пример вывода:
Массив: [36, 34, 83, 45, 80, 14, 48, 86, 36, 33]
Чётные: 36 34 80 14 48 86 36
7. Варианты фильтрации
Только нечётные числа
for i := 0; i < len(data); i++ {
if data[i] % 2 != 0 { // Остаток не равен 0
fmt.Printf("%d ", data[i])
}
}
Числа больше порога
threshold := 15
for i := 0; i < len(data); i++ {
if data[i] > threshold {
fmt.Printf("%d ", data[i])
}
}
Числа, кратные 3
for i := 0; i < len(data); i++ {
if data[i] % 3 == 0 {
fmt.Printf("%d ", data[i])
}
}
Положительные числа
data := [5]int{-3, 7, -1, 0, 12}
for i := 0; i < len(data); i++ {
if data[i] > 0 {
fmt.Printf("%d ", data[i])
}
}
// Вывод: 7 12
8. Подсчёт отфильтрованных элементов
count := 0
for i := 0; i < len(data); i++ {
if data[i] % 2 == 0 {
count++
}
}
fmt.Printf("Чётных чисел: %d\n", count)
9. Сохранение результата в новый массив
data := [8]int{12, 7, 23, 14, 9, 18, 5, 20}
var evens [8]int // Максимум столько же элементов
evenCount := 0
for i := 0; i < len(data); i++ {
if data[i] % 2 == 0 {
evens[evenCount] = data[i]
evenCount++
}
}
// Вывести только заполненную часть
fmt.Printf("Чётные: %v\n", evens[:evenCount])
Вывод:
Чётные: [12 14 18 20]
10. Отладка через debugger
Точка останова
for i := 0; i < len(data); i++ {
// ← breakpoint
if data[i] % 2 == 0 {
fmt.Printf("%d ", data[i])
}
}
Что отслеживать
i— текущий индексdata[i]— проверяемое числоdata[i] % 2— остаток (0 или 1)- Условие — выполнилось или нет
Совет: Если непонятно — пройдите каждую итерацию с F10.
11. Итоги
✅ Фильтрация = цикл + условие
✅ % (модуль) — проверка делимости
✅ Чётное: число % 2 == 0
✅ Нечётное: число % 2 != 0
✅ Можно комбинировать несколько условий
Паттерн:
for i := 0; i < len(array); i++ {
if условие(array[i]) {
// Действие с элементом
}
}
Практика: Выведите числа, кратные 5; числа в диапазоне ; отрицательные числа.