Алгоритмізація та програмування. Обробка масивів у С
Зміст
Мета
Повторити і узагальнити знання студентів про масиви у мові програмування С. Освоїти методи роботи з масивами, та навчитися їх використовувати для розв'язування задач.
Тип уроку
Урок формування навичок і вмінь.
Хід уроку
Привітання, відмічання відсутніх, перевірка виконання задач для самостійного опрацювання та оголошення теми заняття
Доброго дня, сьогодні ми будемо працювати з масивами і навчимося використовувати їх для розв'язування задач.
Повторення теоретичного матеріалу
- Давайте пригадаємо що таке масив, і для чого використовують масиви? (Відповідь студентів)
Масив — це тип даних, який використовується для представлення послідовності однотипних елементів.
-Хто може сказати нам, як ініціалізується масив у мові С? (Студент відповідає і пише на дощі приклад)
Масив у мові С оголошується подібно до звичайних змінних, але із вказуванням у квадратних дужках розміру масиву (кількості елементів у масиві).
Тип_елементів_масиву назва_масиву[розмір_масиву];
Наприклад:
int mas[20]; //масив із 20-ти цілочисельних елементів //Деколи досить зручно вказувати елементи масиву під час ініціалізації: int new_mas[5] = {1,5,2,4,0};
-Як здійснюється доступ до елементів масиву? (Студенти відповідають)
Доступ до елементів масиву здійснюється за допомогою індекса(порядкового номера елемента, порядкові номери відраховуються починаючи з 0)
- Добре, а що тоді виведеться у консоль при виконанні наступних дій?
std::cout << new_mas[2]; // виведе “?” std::cout << new_mas[4]; // виведе “?”
Виведе 2 і 0
- Зауваження: потрібно бути дуже уважним, тому що компілятор не завжди може відслідковувати вихід індекса за межі масиву, тому при виконанні такого доступу до елемента масиву new_mas[10] компілятор не видасть помилки, хоч 10 > (5 — 1), але підчас виконання програми відбудеться критична помилка.
- Нагадаймо що коли ми оголошуємо наприклад масив int s[10] от:
s — це вказівник на перший елемент масиву
10 — кількість зарезервованих для масиву комірок.
Тому якщо:
int s[10] = 9,5,3,6,3,1,3,9,7,5”; std::cout << *(s+5); //виведе “1”
- Щойно ми пригадали, що таке масив, і як з ним працювати, а що ж таке багатомірний масив?
Багатомірний масив — це масив елементи яких є масивами. Приклад оголошення таких масивів:
- Хто зможе показати, як оголошується масив цілих чисел розміром 10х3? int a2[10][3];// двомірний масив розміром 10х3
- Добре а розміром 5х4х2
int a3[5][4][2];// трьох мірний масив розміром 5х4х2
- Подумайте, яка відмінність між наступними двома ініціалізаціями, чи виникне помилка під час компіляції?
int a[2][3] = {{2,1,3},{3,2,4}}; int a[2][3] = {2,1,3,3,2,4};
- Фактично усі елементи багатомірних масивів в пам'яті зберігаються лінійно, тому ці два способи ініціалізації масиву аналогічні.
Для доступу до змінних багатомірних масивів використовують індекси по кожній із розмірностей.
- Скажіть, що виведеться в консоль після виконання наступного коду?
std::cout << a[0][1]; //виведе “?” std::cout << *(a+5); //виведе “?”
- У першому випадку все зрозуміло і ми отримаємо 1
- У другому випадку, так як а — це вказівник на перший елемент масиву і значення у памяті записуються лінійно то:
std::cout << *(a+5); //виведе “4”
Розв’язання задач
- Давайте для зручності подальшої нашої роботи опишемо функцію для вводу даних у масив. (Викладач сам пише і пояснює алгоритм)
void ReadM(int m; int len)//оголошуємо функцію з назвою ReadM, тип функції void вказує на те, що підпрограма не буде повертати жодного значення { for (int i = 0; i < len; i++) // організовуємо цикл, для здійснення певних дій над кожним елементом масив, для чого у розділі початкової ініціалізації ми оголошуємо цілочисельну змінну і, та одразу ж присвоюємо їй значення 0 (0 тому що нумерація індексів у масиві починається саме з 0), цикл буде виконуватись доки і буде менше за довжину масиву, покрокова корекція збільшуватиме і на одиницю std::cin >> *(m+i); //при кожній ітерації ми заноситемиво зчитане значення з клавіатури в і-ту комірку }
- А тепер давайте розв'яжемо наступні задачі. (Студенти біля дошки з допомогою викладача розв’язують задачі).
Задача 1
Нехай задано цілочисельний масив з восьми елементів, знайти найбільший серед них.
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { int m[8]; //оголошуємо масив ReadM(m,8); //вводимо масив int max = m[0]; // нехай максимальний елемент це перший елемент масиву for (int i = 0; i < 8; i++) //описуємо цикл, за допомогою якого переглянемо усі елементи масиву if (max < m[i]) // якщо і-й елемент масиву більший за максимальний то max = m[i]; // максимальний присвоїти значення і-го елемента std::cout << max; //виводимо результат. }
Задача 2
Нехай задано цілочисельний масив з 10-ти елементів, знайти індекс найменшого серед усіх непарних елементів масиву.
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { int m[10]; //оголошуємо масив ReadM(m,10); //вводимо масив int max_id = 1; // нехай максимальний елемент це перший непарний елемент масиву for (int i = 0; i < 10; i += 2) //описуємо цикл, за допомогою якого переглянемо лише непарні елементи масиву if (m[max_id] < m[i]) // якщо і-й елемент масиву більший за максимальний то max_id = i; // максимальний присвоїти значення і-го елемента std::cout << max_id; //виводимо результат. }
Задача 3
Нехай задано масив дійсних чисел з 10-ти елементів, знайти суму усіх від'ємних елементів масиву.
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { float m[10] = {-1,2,3,5,-2,-6,6,4,2,0}; //оголошуємо масив int sun = 0; // нехай сума рівна 0 for (int i = 0; i < 10; i++) //описуємо цикл, за допомогою якого переглянемо усі елементи масиву if (m[i] < 0) // якщо і-й елемент масиву відємний то sum += m[i]; // то до суми додаємо і-й елемент масиву std::cout << sum; //виводимо результат. }
Задача 4
Нехай задано масив з 20 елементів, підрахувати скільки разів число “0” зустрічається у масиві.
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { int m[20]; //оголошуємо масив ReadM(m,20); //вводимо масив int count = 0; // нехай ця кількість рівна 0 for (int i = 0; i < 20; i++) //описуємо цикл, за допомогою якого переглянемо усі елементи масиву if (m[ш] = 0) // якщо і-й елемент масиву рівний нулю то count++; // збільшуємо лічильник їх кількості на одиницю std::cout << count; //виводимо результат. }
Задача 5
Нехай задано двомірний масив цілих чисел, розміром 10x10. Усім діагональним елементам присвоїти значення 0.
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { int m[10][10]; //оголошуємо масив ReadM(m,100); //вводимо масив int count = 0; // нехай ця кількість рівна 0 for (int i = 0; i < 10; i++) //описуємо цикл, за допомогою якого зможемо пробігтися по рядку масиву m[i][i] = 0 // де діагональний елемент присвоюємо нулю }
Задача 6
Нехай задано двомірний масив цілих чисел, розміром 10x10. Знайти мінімальний серед усіх максимальних елементів рядків(стовбців).
#include <stdio.h> //Підключення необхідним модулів #include <iostream> void main() { int m[10][10]; //оголошуємо масив ReadM(m,100); //вводимо масив int min = m[0][0],max; // оголошуємо змінні, нехай цей результат (min) ріний елементу 0х0. for (int i = 0; i < 10; i++) // будемо пробігатися по рядках { max = m[i][0]; // незай максимальний елемент рядка рівний першому його елементові for (int j = 0; j < 10; j++) //пробігаємося по елементах рядка if (max < m [i][j]) // і шукаємо максимальний max = m[i][j]; if (max < min)// якщо знайдений максимальний менший за мінімальне то min = max; // у мінімальне заносимо його значення } std::cout << min; //виводимо результат. }
Задачі для самостійного опрацювання
Задача 1
Нехай задано трьох вимірний масив 5х3х7, елементи якого є дійсні числа. Знайти індекси елемента, значення якого є найменшим.
Задача 2
Написати функцію, яка заміняє кожен елемент масиву, значенням його квадратного кореня.
Задача 3
Нехай задано масив, елементами якого є цілі числа від 0 до 9. Знайти число, що зустрічається у масиві найбільшу кількість разів. (Підказка: необхідно використовувати іще один масив, який би містив відомості про кількість входжень кожного із чисел). --vansach_ia 10:45, 5 березня 2011 (UTC)