Алгоритмізація та програмування. Обробка масивів у С

Матеріал з Фізмат Вікіпедії
Перейти до: навігація, пошук


Мета

Повторити і узагальнити знання студентів про масиви у мові програмування С. Освоїти методи роботи з масивами, та навчитися їх використовувати для розв'язування задач.

Тип уроку

Урок формування навичок і вмінь.

Хід уроку

Привітання, відмічання відсутніх, перевірка виконання задач для самостійного опрацювання та оголошення теми заняття

Доброго дня, сьогодні ми будемо працювати з масивами і навчимося використовувати їх для розв'язування задач.

Повторення теоретичного матеріалу

- Давайте пригадаємо що таке масив, і для чого використовують масиви? (Відповідь студентів)

Масив — це тип даних, який використовується для представлення послідовності однотипних елементів.

-Хто може сказати нам, як ініціалізується масив у мові С? (Студент відповідає і пише на дощі приклад)

Масив у мові С оголошується подібно до звичайних змінних, але із вказуванням у квадратних дужках розміру масиву (кількості елементів у масиві).

Тип_елементів_масиву назва_масиву[розмір_масиву];

Наприклад:

 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)