Ви аналітик університетської групи. Мета: збирати оцінки студентів, аналізувати їх і сортувати. Ми будемо працювати поступово, блок за блоком, щоб освоїти:
Введення та виведення масивів
Обчислення суми, добутку, max/min, середнього
Підрахунок додатніх та від’ємних
Сортування (обмін та бульбашка)
#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? Ми перейдемо в ділянку пам'яті яка не належить нашому масиву - це може спричинити перезапис інших даних у програмі або аварійному завершенню цієї програми.
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? Для того щоб не було множення на нуль та весь добуток не дорівнював нулю
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 не буде змінюватись протягом виконання програми
🧠 Квіз: як знайти другий за величиною елемент? Використовувати дві змінні: для найбільшого та другого по величині
double average = (double) sum / n;
cout << "Середнє = " << average << endl;
💡 Підказка: використовуйте sum 🧩 Експеримент: int замість double — що зміниться? Виконається цілочисельне ділення без залишку - відкидається дробова частина 🧠 Квіз: чому важливо перетворювати sum у double перед діленням? Щоб не втратити дробову частину частки ділення
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)
// Обмін
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])
🧠 Квіз: які переваги та недоліки бульбашкового сортування порівняно з обміном?
#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]
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];
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;
}
🧠 Квіз: що станеться, якщо матриця порожня? Скоріше за все ми прочитаємо якесь "сміттєве" значення з цієї ділянки пам'яті, або буде помилка доступу до елементу пам'яті
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
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;
}
}
}
}
-
Як оголосити двовимірний масив розміром 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]