Основи програмування на С ++ для початківців

Двумірні массиви в C++

Помимо одномерных массивов вам может понадобиться для работы использование многомерного массива (двумерного, трёхмерного…). В этом уроке будут рассмотрены двумерные массивы. Они самые распространенные, а остальные встречаются крайне редко.

Ми вже розглядали в попередніх статтяходномерные массивы  і Си-строки (символьные массивы).Там говорилось, что элементы массива размещаются в памяти последовательно – элемент за элементом. Визуально их можно представить в виде одной строки данных в памяти.  Щоб звернутися до будь-якого елементу такого масиву, достаточно указать его имя и индекс элемента. Первое отличие двумерного массива от одномерного – його елементи містять два індексу: int arr [3][4];  Дані такого масиву можна уявити, как таблицу: 3 х 4.

двумерные массивы c++, многомерные массивы c++

Первый за именем массива индекс – это индекс строки, второй – индекс столбца.

двумерные массивы c++, многомерные массивы c++

Когда вы уже посмотрели на эти рисунки, можна сказати про двовимірному масиві так – это массив, в якому кожен елемент також є масивом. int arr [3][4];  – это массив из 3-х элементов, кожен з яких це масив з 4-х елементів.

Дані двовимірного масиву також розташовуються в пам'яті послідовно, но построчно. Сначала строка с индексом 0 – осередки від 0-й до 3-ї, далі рядок з індексом 1 – осередки від 0-й до 3-ї…

Що можуть зберігати елементи двовимірних масивів? Наприклад, можна зберігати номери паркувальних місць в багатоповерховому паркінгу (6 этажей и на каждом 15 мест для парковки). Для цього треба оголосити двовимірний масив int floorsAndParkings[6][15];  і записати в його осередку номера місць на кожному поверсі.   Двовимірний масив може зберігати Сі-рядки. Наприклад: char someStr [3][256];  Так ми оголосили масив, который будет хранить 3 строки по 256 символов каждая.

Ініціалізація двовимірного масиву.

Записать данные в двумерный массив можно при его объявлении. Рассмотрим на примере с местами парковки. Допустим в паркинге 2 этажа по 4 места парковки на каждом. Объявим массив и инициализируем его:

int floorsAndParkings[2][4] = { { 1, 2, 3, 4 }, { 1, 2, 3, 4 } };

Щоб така ініціалізація виглядала більш читабельно, оформим её так:

Як ви пам'ятаєте, согласно стандарту C 11, знак=  можна упустити. Рядки не започатковано за тим же принципом:

Как вывести на экран данные двумерного массива? Можно пойти длинным путём и обращаться к каждому элементу вручную:

двумерные массивы c++, многомерные массивы c++

Вывод Си-строк двумерного массива на экран немного легче, так как нам достаточно указать только имя массива и индекс строки. Далее выходной поток cout самостоятельно будет выводить все элементы символьного массива, пока не обнаружит ' 0'

двумерные массивы c++, многомерные массивы c++

Хорошо! А якщо нам треба заповнити і показати дані масивуint floorsAndParkings[20][100] или char someStr[50][256]? Цю невдячну роботу можна в десятки разів полегшити, використовуючи цикли. Точнее вложенные циклы.

Рассмотрим пример с паркингом. Показать пользователю схему паркинга: этажи и места для парковки. Щоб забронювати місце він повинен вибрати номер поверху і номер місця. После бронирования – записать значение 0 в соответствующую ячейку, что будет означать “место занято”.

Мы использовали цикл for ,в строках 15 – 24, для записи данных в массив и одновременно отображения их на экране. Якщо представляти цей двовимірний масив як таблицю – то внешний цикл for проходить за індексами рядків– от 0-й до 6-й. Вложенный цикл – по индексам столбцов (по ячейкам строк таблицы) – от 0-й до 9-й.

У рядках 32 – 82 находится цикл do while. Его роль в том, чтобы снова и снова предлагать забронировать место для автомобиля, пока это необходимо пользователю. В нем находятся два вложенных цикла do while. Вони реалізовують вибір поверху і місця для паркування з захистом від некоректного введення значень.

Строки 57 – 81 содержат блок if else , который, в случае корректного выбора пользователя выводит сообщение об успешном бронировании. Если же место занято (ячейка содержит значение 0) – сообщает об этом, предлагает повторить выбор этажа и места и отображает обновлённую схему паркинга, где отмечены забронированные места.

Работает это так:

двумерные массивы c++, многомерные массивы c++

продолжение…

двумерные массивы c++, многомерные массивы c++

Предлагаю решить несколько задач по теме  двумерные массивы.

Рекомендую подивитися ці відео – двовимірні масиви

28 думки про "Двумірні массиви в C++

  1. Шановний автор статті і сайту, якщо ви одну особу…Стаття про двомірні масиви огидна!!! Замість того щоб показати як правильно заповнити двомірний масив – пояснити, що треба використовувати вкладень цикл for в такий же цикл for і як вивести двовимірний масив на екран, знову ж за допомогою вкладених циклів, або подібні необхідні речі!!!, ви бабахає нікому не потрібний код на 80 строк!!! У вас же сайт для початківців!!?? А після ще й завдання про це даєте…. Загалом жахливо викладено!

    1. Стаття чудова! Це просто класика. приклад заліковий. І масиви, і введення-виведення і логіка і обхід масиву, все в одному. Ви антидотом, коли доросте, зрозумієте про що я.

  2. Шановний автор поясніть, будь ласка, що таке “” , “\n … або де про таке можна почитати.

      1. помітив баг, коли заходиш з вк то твоя аватарка буде на місці ВСІХ аватарок, нетільки своїх.

  3. Я як новачок зовсім не можу зрозуміти ось це: floorsAndParkings[floor – 1][parkingPlace – 1] != 0 Як масив може бити дорівнює якомусь одному значенню.
    Адже масив заповнюється великою кількістю елементів, які записуються в фігурних скобках.Обьясніте пожайлуста, сам не можу.

    1. Сергій, floorsAndParkings[floor – 1][parkingPlace – 1] != 0 це не весь масив, а його окрема конкретна осередок. Наприклад: користувач вводить номер поверху 2 (floor ) і номер паркувального місця 3 (parkingPlace). Мы помним, що нумерація елементів масиву починається з нуля, а не з одиниці – тому віднімаємо від введених значень по одиниці. Отримуємо конкретний осередок floorsAndParkings[1][2] і перевіряємо її значення на нерівність нулю. Якщо не нуль значить місце вільно…

  4. Цікаво як надати можливість введення елементів багатовимірного масиву користувачеві, а не в процесі написання програми?

    1. Андрій, ми готуємо зараз завдання з рішенням. Там буде реалізований клас Matrix. У задачі буде показано, як оформити введення двовимірного масиву з клавіатури. Тобто користувач буде вводити числа. Enter = кінець рядка, Enter двічі = кінець введення матриці.

  5. Govnokod. і помоему ще й брехня!!!!! проведу зараз деякі дослідження. Але попередньо я думаю в пам'яті не зберігається двовимірний масив (а покажчики на початку одновимірних масивів) треба перевірити.

    1. таки да, зберігається у вигляді двовимірного масиву (як в статті). вважаю це багом з ++

    2. перш, ніж повторювати слова типу “govnokod”, почуті від Понта дебілів, які самі ви не розумієте – ви б перш самі розібралися з найелементарнішими поняттями … навіть не C ++, а що йдуть від C, які описані 40 років назад (це той випадок, коли йдеться: читай матчасть).

  6. Почему, при повторному виведенню таблиці, коли місце зайняте, у вкладеному циклі for 75-78, не пишемо ось цей рядок(20): floorsAndParkings[f][p] = p + 1; ???

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *