Базовий курс програмування на С++. Урок 9. Двовимірний масив (матриця) в C++. Функція rand. |
Написав Joker | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Понеділок, 09 березня 2015 16:25 Переглядів: 57603
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Хороший програміст – це той, хто дивиться в обидва боки, переходячи дорогу з одностороннім рухом Даг Ліндер
Сьогодні ми розглянемо: 1. Розв’язок д/з минулого уроку 2. Функція rand 3. Двовимірні масиви в C++ 4. Домашнє завдання
Розв’язок д/з минулого уроку про масиви 1. Заповнити масив з 10 елементів з клавіатури. І знайти суму всіх елементів більших 2,7. Масив типу double. Я написав два способи розв’язку цього завдання. 1 спосіб: Тут здається все просто і ясно. У нас є два окремих цикли. Перший заповнює масив, другий – обчислює результат. Тепер 2 спосіб: Тут все заповнюється і обчислюється у одному циклі. Кращою і швидшою вважається програма реалізована 2 способом, оскільки тут менша кількість операцій. При потребі цю ж проблему можна реалізувати взагалі без масиву і використовувати всього 2 змінні, що зменшило б розмір нашої програми. Подумайте як це зробити.
2. Масиву типу int з 5 елементів. Заповнюється з клавіатури. Знайти і вивести на екран максимальне значення у вашому масиві (будьте дуже наполегливими, насправді це просто і якщо у вас не получиться зараз, то з часом вам буде смішно, що колись ви не змогли вирішити це завдання з першого разу) У нас знову ж декілька варіантів. Ми можемо спершу відсортувати масив і вивести останній його елемент. Або ж просто знайти максимум.
3. Масив заповнений таким чином: 5,112,4,3. Вивести його елементи навпаки (3,4,112,5). При цьому використання циклу є обов’язковим.
4. Знайти суму всіх парних і непарних елементів. Масив заповнюється з клавіатури, 5 елементів, тип int.
Функція rand У домашніх вправах вам часто доводилося вводити значення масивів з клавіатури, що з часом стає нудним. І наші масиви були маленьких розмірів. А коли їх розміри будуть перевищувати сотню? Давайте надамо таке завдання комп’ютеру, він зробить це набагато швидше. Частково це завдання можна виконати за допомогою циклу, але тоді у них буде певна залежність. А як зробити випадкові числа у певному діапазоні? Для цього є особлива функція яка міститься у бібліотеці cstdlib. Ця функція – rand. Але тут не все так просто як здається. Давайте спробуєм написати програму. Ось таку: Результат буде таким, чи не так? Спробуйте запустити програму знову, результат не зміниться. Що не так? Де ж пропала наша магія, у якій комп’ютер мав сам вибирати число? Вся справа в тому, що rand не видумує число, а працює за відповідним алгоритмом. Цей алгоритм використовує «зерно» - початкова точка відносно якої визначається rand. Все, що нам потрібно це задати якась число яке постійно змінюється. Таким постійним зерном буде час. Час змінюється щосекунди і це те, що нам потрібне. Щоб працювати з часом нам потрібно підключити спеціальну бібліотеку time.h. Але ще потрібно знати як задавати це «зерно». Для цього потрібна ще одна функція srand(). Саме вона задає початкову точку для функції rand. Тепер як ми казали раніше, треба задати час. Будемо використовувати бібліотеку time.h і функцію time(). Але варто додати параметр NULL. Ось так: time(NULL). Ця функція повертає кількість мілісекунд з 1 січня 1970 року. Тепер поєднаємо всі наші знання у два рядки коду.
Ура, працює! І що нам це дало? Нічого. А от якби ми могли встановити певні межі для чисел, от тоді це було б круто. Ну тоді давайте вчитися. Загальний діапазон чисел, які можна отримати викликаючи функцію rand: 0 – 32767. Якщо дуже добре подумати, то ваші знання дозволяють керувати діапазонами. Тут нам знадобиться ділення по модулю. Візьмемо будь-яке число, для прикладу 57. І число x. Якщо x%52 = 0 (тобто x = 52), це мінімальне значення, яке ми можемо досягти. Всі інші будуть мати певний залишок і при цьому цей залишок не може бути більшим 51. Ось і все. rand()%52; // Діапазон від 0 до 51 Добре, ми навчилися встановлювати діапазони з 0 до . Але радіти ще рано, нам може знадобитися діапазон від x до (x+15) (для прикладу, де x>0). Допустимо нам потрібен діапазон від 15 до 24. Для цього потрібно зробити декілька кроків: 1. 24 – 15 = 9 Тепер все!
Двовимірні масиви Давайте згадаємо як виглядають прості масиви: int a[15]; char arr[153]; bool q[1]; char str[]; У всіх масивах вказується к-сть елементів. Виглядає він як стрічка поділена на клітинки.
Думаю ви здогадалися, що багатовимірний масив відрізняється від одновимірного кількістю вимірів. Найпростіший двовимірний масив або ж матриця – це шахова дошка. Кожна клітинка має два параметри (D5, H7). Такі масиви можна уявляти як просту таблицю, думаю багато з вас працювали з MS Excel, кожна його клітинка теж має два параметри. Тобто ці масиви відрізняються кількістю параметрів. Нумерується матриця також з нуля. Ось так виглядає матриця : Але у пам’яті комп’ютера вона буде виглядати так: Я думаю, ви вже самі зрозуміли як створювати такі масиви, але все ж напишу декілька прикладів: int a[5][5]; char s[15][34]; bool q [3][2]; До речі, у С++ дозволено 64-х вимірні масиви. Це максимум. Тепер давайте навчимося заповнювати такий масив. int arr[2][2] = {{5,8},{6,4}}; Думаю, це не потребує пояснень. Майже все аналогічне з простими масивами. Тепер спробуєм заповнювати його з клавіатури. Ми проходимося по кожному елементу окремо і заповнюємо його, все просто і ясно. Я думаю, що ви зрозуміли, що означає цей запис arr[i][j]; Ми звертаємося до елемента який знаходиться у і-ому рядку j-ому стовпці. Працювати з такими масивами важче ніж із звичайними, але реально і потрібно.
Домашнє завдання Всі масиви в цьому уроці повинні заповнюватися за допомогою функції rand. Діапазон від 0 до 10; 1. Знайти суму всіх елементів, розмір двовимірного масиву 5х5 2. Знайти максимальне і середнє значення двовимірного масиву, розміром 3х3 3. Знайти суму всіх елементів двовимірного масиву (3х7), якщо будь-який з індексів кратний 3. 4. Знайти максимальне значення двовимірного масиву (6х6) у темній області малюнку (нижче діагоналі матриці). ( 22 Проголосувало ) Новіші матеріали:
Старіші матеріали:
3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved." |