Великі \ початок 1 & 0 & 2 \\ -1 & ...
Після закінчення цієї лабораторії студент зможе:
Теоретичні поняття
Матриця
Матриця - це однорідна і двовимірна сукупність елементів. До них можна отримати доступ за допомогою двох індексів, пронумерованих, як у випадку з векторами, починаючи з 0. Оголошення матриці має вигляд:
Кількість елементів масиву буде dim_1 * dim_2, а значимість кожного виміру є питанням логіки програми. У математиці перший вимір може означати рядок і другий стовпець для кожного елемента, але це не є обов’язковим. Однак для того, щоб програма працювала належним чином, вибрані значення повинні дотримуватися у всьому вихідному коді.
Багатовимірні картини
Вектори та матриці можна екстраполювати до загального поняття багатовимірного масиву, яке формулюється наступним чином:
Хоча у випадку більш ніж 3-х вимірів картини можуть більше не мати конкретного чи фізичного значення, вони можуть бути особливо корисними у багатьох ситуаціях. Однак у цій лабораторії ми обмежимося двовимірними картинами.
Додавання та множення матриць
Сума матриць

$$ \ Large \ begin 1 & 3 \\ 0 & 4 \\ 5 & 8 \ end + \ begin 2 & 5 \\ 1 & 2 \\ 6 & 1 \ end = \ begin 3 & 8 \\ 1 & 6 \\ 11 & 9 \ end $$
Множення матриць

$$ \ Large \ begin 1 & 0 & 2 \\ -1 & 3 & 1 \ end \ cdot \ begin 3 & 1 \\ 2 & 1 \\ 1 & 0 \ end = \ begin 1 \ times 3 + 0 \ раз 2 + 2 \ раз 1 & 1 \ раз 1 + 0 \ раз 1 + 2 \ раз 0 \\ -1 \ раз 3 + 3 \ раз 2 + 1 \ раз 1 & -1 \ раз 1 + 3 \ раз 1 + 1 \ раз 0 \ end = \ begin 5 & 1 \\ 4 & 2 \ end $$
Представлення в пам'яті
Знання представлення масивів у пам’яті допомагає вам краще зрозуміти, як працювати з цими типами даних та уникнути як загальних, так і найтонших помилок. Як відомо, кожна змінна має відповідну адресу в пам'яті і займає певну довжину, що вимірюється в байтах. Стандарт C вимагає, щоб масив зберігався в області безперервної пам’яті, так що для масиву форми: вкладка T [dim1] [dim2]… [dimn]; розмір, зайнятий в пам'яті, буде sizeof (T) * dim1 * dim2 * ... * dimn. Далі ми розглянемо приватний випадок векторного вектора довжиною n та деякого його елемента з позиції i. Коли він зустріне ім'я vect, компілятор зрозуміє "адресу в пам'яті, з якої векторний вектор починається". Оператор індексації [], застосований до імені vect, доручає компілятору "оцінити той елемент типу T, який знаходиться у позиції i у векторі, починаючи з адреси vect". Це можна виразити безпосередньо: "оцінка змінної типу T з адреси vect + i * sizeof (T)" .
В останньому формулюванні ви помічаєте, що розмір вектора, поданий у декларації, більше не втручається в будь-якій формі. Це було потрібно лише для того, щоб компілятор знав, скільки пам'яті слід виділити для його представлення. Також зауважте, що індексування поза виділеним простором пам'яті дозволено, і тому програма випадково зможе отримати доступ до інших областей пам'яті, що може мати серйозні наслідки. У найкращому випадку наша програма буде поводитися дуже дивно (помилки в абсолютно непередбачуваних місцях), а в гіршому випадку вся система буде заблокована у випадку систем, які не реалізували простори віртуальної пам'яті, характерні для кожного додатка - платформи Windows NT та Linux).
Той факт, що межа між векторами та адресами пам'яті настільки тонка у мові С, її синтаксис допускає дивні вирази, такі як:
Останнє твердження просто означає "призначити 5 змінній char адреси 3 + a * sizeof (char) = 3 + a". Зверніть увагу, що це еквівалентно a [3] = 5;
Також ще одна перевага виявляється при визначенні параметра функції, векторного типу, і в цьому випадку не потрібно вказувати її розмір: void sort (int [] vect, n);