Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save annalev0503-netizen/83b6bda89262f0461ef7b1f16b249122 to your computer and use it in GitHub Desktop.

Select an option

Save annalev0503-netizen/83b6bda89262f0461ef7b1f16b249122 to your computer and use it in GitHub Desktop.

🎓 Microlearning: Масиви в C++ (1D та 2D)

🔹 Передісторія

Ви аналітик університетської групи. Мета: збирати оцінки студентів, аналізувати їх і сортувати. Ми будемо працювати поступово, блок за блоком, щоб освоїти:

Введення та виведення масивів

Обчислення суми, добутку, max/min, середнього

Підрахунок додатніх та від’ємних

Сортування (обмін та бульбашка)

🟢 Одновимірний масив (1D)

🔹 Блок 1: Введення та виведення

#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "Скільки студентів у групі? ";
    cin >> n;

    int grades[100];

    cout << "Введіть оцінки:" << endl;
    for(int i = 0; i < n; i++) {
        cin >> grades[i]; // заповніть тут
    }

    cout << "Всі оцінки: ";
    for(int i = 0; i < n; i++) {
        cout << grades[i] << " "; // заповніть тут
    }
    cout << endl;

    return 0;
}

💡 Підказка: grades[i]

🧩 Міні-завдання: введіть від'ємні числа і нулі.

🧠 Квіз:

  • Який індекс першого елемента?
    0
  • Що станеться, якщо вийти за межі n? Ми перейдемо в ділянку пам'яті яка не належить нашому масиву - це може спричинити перезапис інших даних у програмі або аварійному завершенню цієї програми.

🔹 Блок 2: Сума та добуток

int sum = 0;
int dob = 1;
for(int i = 0; i < n; i++) {
    sum = sum + grades[i]; // сума
    dob = dob * grades[i]; // добуток
}
cout << "Сума = " << sum << endl;
cout << "Добуток = " << dob << endl;

💡 Підказка:
sum += grades[i];
dob *= grades[i];

🧩 Експеримент:
Змініть один елемент на 0. Що буде з добутком? Увесь добуток дорівнюватиме нулю

🧠 Квіз:

  • Чому добуток ініціалізують 1, а не 0? Для того щоб не було множення на нуль та весь добуток не дорівнював нулю

🔹 Блок 3: Max і Min

int maxVal = grades[0];
int minVal = grades[0];

for(int i = 1; i < n; i++) {
    if(grades[i] > maxVal) maxVal = grades[i];
    if(grades[i] < minVal) minVal = grades[i];
}

cout << "Максимальна оцінка = " << maxVal << endl;
cout << "Мінімальна оцінка = " << minVal << endl;

💡 Підказка: порівнюємо з maxVal/minVal

🧩 Експеримент: перший елемент мінімальний — що зміниться? minVal не буде змінюватись протягом виконання програми

🧠 Квіз: як знайти другий за величиною елемент? Використовувати дві змінні: для найбільшого та другого по величині

🔹 Блок 4: Середнє

double average = (double) sum / n;
cout << "Середнє = " << average << endl;

💡 Підказка: використовуйте sum 🧩 Експеримент: int замість double — що зміниться? Виконається цілочисельне ділення без залишку - відкидається дробова частина 🧠 Квіз: чому важливо перетворювати sum у double перед діленням? Щоб не втратити дробову частину частки ділення

🔹 Блок 5: Додатні та від’ємні

int plus = 0, minus = 0;
for(int i = 0; i < n; i++) {
    if(grades[i]>0) plus++;
    if(grades[i]<0) minus++;
}
cout << "Додатні = " << plus << endl;
cout << "Від’ємні = " << minus << endl;

💡 Підказка: >0 для додатніх, <0 для від’ємних

🧩 Експеримент: що якщо ввести 0? Це число не буде враховано

🧠 Квіз: як порахувати лише непарні числа? Перевірити остачу від ділення на 2: if(grades[i]<0 && grades[i]%2!=0)

🔹 Блок 6: Сортування

// Обмін
for(int i = 0; i < n-1; i++) {
    for(int j = i+1; j < n; j++) {
        if(grades[i]>grades[j]) {
            int temp = grades[i];
            grades[i] = grades[j];
            grades[j] = temp;
        }
    }
}
cout << "Відсортовано (обмін): ";
for(int i = 0; i < n; i++)
cout << grades[i] << " ";
cout << endl;

// Бульбашка
cout << "Введіть оцінки знову для бульбашки:" << endl;
for(int i = 0; i < n; i++) 
cin >> grades[i];

for(int i = 0; i < n-1; i++) {
    for(int j = 0; j < n-i-1; j++) {
        if(grades[j]>grades[j+1]) {
            int temp = grades[j];
            grades[j] = grades[j+1];
            grades[j+1] = temp;
        }
    }
}

cout << "Відсортовано (бульбашка): ";
for(int i = 0; i < n; i++)
cout << grades[i] << " ";
cout << endl;

💡 Підказка:

grades[i] > grades[j] для обміну

grades[j] > grades[j+1] для бульбашки

🧩 Міні-завдання: змініть сортування на спадання Потрібно змінити умову : if(grades[i] < grades[j])

🧠 Квіз: які переваги та недоліки бульбашкового сортування порівняно з обміном?

🟢 Двовимірний масив (2D)

🔹 Блок 1: Введення та виведення

#include <iostream>
using namespace std;

int main() {
    int rows, cols;
    cout << "Введіть кількість студентів і предметів: ";
    cin >> rows >> cols;

    int grades[100][100];

    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            cin >> grades[i][j];
        }
    }

    cout << "Оцінки студентів:" << endl;
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            cout << grades[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

💡 Підказка: grades[i][j]

🧩 Міні-завдання: введіть від'ємні та нульові оцінки

🧠 Квіз: який індекс 1-го предмету 2-го студента? grades[1][0]

🔹 Блок 2: Сума по рядках

for(int i = 0; i < rows; i++) {
    int sum = 0;
    for(int j = 0; j < cols; j++) {
        sum += grades[i][j];
    }
    cout << "Сума оцінок студента " << i+1 << " = " << sum << endl;
}

🧩 Міні-завдання: обчисліть суму лише додатніх оцінок

🧠 Квіз: як знайти суму по стовпцях?

    for(int i=0; i<cols; i++) {
        int sum = 0;
        for(int j=0; j<rows; j++) {
            sum+=grades[j][i];

🔹 Блок 3: Max і Min

int maxVal = grades[0][0], minVal = grades[0][0];
for(int i = 0; i < rows; i++) {
    for(int j = 0; j < cols; j++) {
        if(grades[i][j] > maxVal) maxVal = grades[i][j];
        if(grades[i][j] < minVal) minVal = grades[i][j];
    }
}
cout << "Max = " << maxVal << endl;
cout << "Min = " << minVal << endl;

🧩 Міні-завдання: визначте студента з найвищою оцінкою

    int theBest = 0;
    ....
        if(grades[i][j] > maxVal) {
            maxVal = grades[i][j];
            theBest = i;
        }

🧠 Квіз: що станеться, якщо матриця порожня? Скоріше за все ми прочитаємо якесь "сміттєве" значення з цієї ділянки пам'яті, або буде помилка доступу до елементу пам'яті

🔹 Блок 4: Середнє по рядку

for(int i = 0; i < rows; i++) {
    int sumRow = 0;
    for(int j = 0; j < cols; j++) sumRow += grades[i][j];
    double avg = (double) sumRow / cols;
    cout << "Середнє студента " << i+1 << " = " << avg << endl;
}

🧩 Міні-завдання: середнє тільки для додатніх

    for(int j = 0; j < cols; j++) {
        if (grades[i][j]>0)
            sumRow += grades[i][j];
    }
    double avg = (double) sumRow / cols;

🧠 Квіз: чому потрібно кастувати у double? Щоб уникнути цілочисельного ділення та не втратити дробову частину

##🔹 Блок 5: Додатні та від’ємні

int plus = 0, minus = 0;
for(int i = 0; i < rows; i++) {
    for(int j = 0; j < cols; j++) {
        if(grades[i][j]>0) plus++;
        if(grades[i][j]<0) minus++;
    }
}
cout << "Додатні = " << plus << endl;
cout << "Від’ємні = " << minus << endl;

🧩 Міні-завдання: порахуйте нулі окремо

    int zeros = 0;
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            if(grades[i][j]==0) zeros++;
        }
    }

🧠 Квіз: як порахувати непарні числа? Перевіряти остачу від ділення на 2: if grades[i][j]%2==0

🔹 Блок 6: Сортування одного рядка

int row; 
cout << "Який рядок відсортувати? "; 
cin >> row; 
row--;

for(int i = 0; i < cols-1; i++) {
    for(int j = i+1; j < cols; j++) {
        if(grades[row][i]>grades[row][j]) {
            int temp = grades[row][i];
            grades[row][i] = grades[row][j];
            grades[row][j] = temp;
        }
    }
}

cout << "Відсортований рядок " << row+1 << ": ";
for(int j = 0; j < cols; j++) 
cout << grades[row][j] << " ";
cout << endl;

💡 Підказка: grades[row][i] > grades[row][j]

🧩 Міні-завдання: змініть на спадання if(grades[row][i] < grades[row][j])

🧠 Квіз: як відсортувати усю матрицю? Додати третій цикл ззовні, який буде відповідати за номер рядка:

for(int row = 0; row < rows; row++) {
    for(int i = 0; i < cols-1; i++) {
        for(int j = i+1; j < cols; j++) {
            if(grades[row][i]>grades[row][j]) {
                int temp = grades[row][i];
                grades[row][i] = grades[row][j];
                grades[row][j] = temp;
            }
        }
    }
}

🟢 Рефлексія та завдання — Двовимірний масив (2D)

🔹 Просте введення та оголошення

  • Як оголосити двовимірний масив розміром 5x3 у C++?
    👉 Відповідь: int arr[5][3];

  • Як ввести елементи в 2D масив за допомогою циклів?
    👉 Відповідь: За допомогою двох циклів - зовнішній для рядків, внутрішній - для стовпців

for (int i = 0; i < 5; i++)
    for (int j = 0; j < 3; j++)
        cin >> arr[i][j];
  • Як вивести елементи 2D масиву на екран?
    👉 Відповідь: Так само за допомогою двох циклів:
for (int i = 0; i < 5; i++)
    for (int j = 0; j < 3; j++)
        cout << arr[i][j];

🔹 Доступ до елементів і обчислення

  • Як змінюється доступ до елементів у 2D порівняно з 1D масивом?
    👉 Відповідь: У одновимірному масиві 1 індекс: a[i]. У двовимірному масиві 2 індекси: a[i][j], де і - це номер рядка, j - номер стовпчика

  • Як обчислити суму по рядках та по стовпцях?
    👉 Відповідь: За допомогою двох циклів, де сума обнуляється перед початком роботи внутрішнього циклу, а виводиться після того як відпрацював внутрішній цикл. Зовнішній цикл проходиться по рядкам якщо потрібна сума по рядкам, або по стовпцяя - якщо сума по стовпцях.

  • Як обчислити середнє по рядках та по стовпцях?
    👉 Відповідь: Так само як і суму, але потрібно поділити на кількість елементів в рядку чи стовпці. Тільки ділене повинно бути типу double, щоб не втратити дробову частину.

  • Які помилки можуть виникнути при неправильній індексації?
    👉 Відповідь: Може бути вихід за межі масиву, що може призвести до помилки або зчитуванню "чужих" даних.

  • Що зміниться при від’ємних числах або нулях?
    👉 Відповідь: Для знаходження суми - нічого, але для добутку - якщо хоча б один елемент дорівнюватиме нулю - то і весь добуток теж буде нульовий.


🔹 Сортування та оптимізація

  • Як відсортувати усю матрицю?
    👉 Відповідь: Можна переписати матрицю в одновимірний масив, відсортувати його, а потім записати назад у матрицю.

  • Як оптимізувати сортування рядків?
    👉 Відповідь: Використовувати більш оптимізовні алгоритми ніж бульбашка, або використати вбудовану функцію sort.


🔹 Додаткові прості питання

  • Чому при оголошенні масиву важливо знати його розмір?
    👉 Відповідь: Компілятору потрібно знати скільки пам'яті треба виділити на статичний масив.

  • Що станеться, якщо спробувати ввести більше елементів, ніж розмір масиву?
    👉 Відповідь: Ми почнемо записувати дані в пам'ять за межами нашого масиву, що може призвести до непередбачуваної поведінки.

  • Як правильно ініціалізувати масив нулями?
    👉 Відповідь:

    int arr[5][3]={0};
  • Як можна обчислити добуток всіх елементів рядка або стовпця?
    👉 Відповідь: Зафіксувати рядок чи стовпець і перемножити в циклі його елементи. Наприклад, для рядка:
int dob = 1;
int row = 2;
for(int j = 0; j < cols; j++)
    dob*=arr[row][j]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment