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

Двумірні массиви в 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. Чому при перевірці елементів масиву ми віднімаємо від floor і parkingPlace одиницю?
    (floorsAndParkings[floor – 1][parkingPlace – 1])

    1. Тому що нумерація елементів масиву починається з 0. Наприклад: Людина вводить номер 7 - Нам треба перевірити осередок 6.

  2. Чому у мене вийшла помилка “error : пошук імені в «е’ змінилося ISO «для’ оглядового [-fpermissive]”.

  3. Як поміняти стовпці або рядки місцями? Можна непосредсвенно взяти стовпець і поміняти його місце?

  4. Код програми про місця на парковці абсолютно не робітник. При компіляції Microsoft Visual Studio 2017 видав куев хмару помилок .

  5. вже який раз все що я пишу так переривається Т Т можете підказати чому функція відмовляє?
    #include
    using namespace std;
    недійсна showTable(Int ** обр);
    int main(){
    Const INT AMOUNT_FLOOR = 7;
    Const ІНТ AMOUNT_PARKING = 10;
    Int ** parking_and_floor[AMOUNT_FLOOR][AMOUNT_PARKING];
    INT вихід = 1;
    do
    {
    показати таблицю(**parking_and_floor);
    ІНТ підлогу = 0, парковка = 0;

    for(INT I = 0; ;i )
    {
    cout<>floor;
    if(floor8)
    {
    cout<<"there is no "<<floor<<" floor!Будь ласка, виберіть між 1-7: "<0||floor<8);
    INT I = 0;
    for(INT I = 0;i<10;i ){
    сума + = ** parking_and_floor[floor][i];
    };
    if(сума == 0){
    cout<<"There is no place in this floor"<<endl;
    показати таблицю(**parking_and_floor);
    }else{
    break;
    };
    };
    for(INT I = 0; ;i )
    {cout<>parking;
    if(parking10){
    cout<<"There is no parking place "<<parking<<". Будь ласка, виберіть між 1-10: "<0||parking<11);
    if(parking_and_floor[floor][parking]== 0)
    {
    cout<<"This place is reserved, please choose another one";
    показати таблицю(**parking_and_floor);
    }else
    { break;
    };
    };
    parking_and_floor[floor][parking]= 0;
    cout<<"Your choice: floor "<<floor<<endl<<"place: "<<parking<<" ;"<<endl<<" був зарезервований успішно!"<<endl<>exit;
    }while(exit!= 0);
    return 0;
    }
    недійсна showTable(Int ** обр){
    cout<<"Table of parking place"<<endl;
    for(INT I = 0;i<7;i )
    {
    cout<<"floor"<<+ 1;
    for(Int J = 0;j<10;j )
    {
    arr[i][j]= J + 1;
    cout<<arr[i][j]<<"|";
    };
    cout<<endl<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    };
    };

    1. ой там дивлюся шматки від коду пропали
      #include
      using namespace std;
      недійсна showTable(Int ** обр);
      int main(){
      Const INT AMOUNT_FLOOR = 7;
      Const ІНТ AMOUNT_PARKING = 10;
      Int ** parking_and_floor[AMOUNT_FLOOR][AMOUNT_PARKING];
      INT вихід = 1;
      do
      {
      показати таблицю(**parking_and_floor);
      ІНТ підлогу = 0, парковка = 0;

      for(INT I = 0; ;i )
      {
      cout<>floor;
      if(floor8)
      {
      cout<<"there is no "<<floor<<" floor!Будь ласка, виберіть між 1-7: "<0||floor<8);
      INT I = 0;
      for(INT I = 0;i<10;i ){
      сума + = ** parking_and_floor[floor][i];
      };
      if(сума == 0){
      cout<<"There is no place in this floor"<<endl;
      показати таблицю(**parking_and_floor);
      }else{
      break;
      };
      };
      for(INT I = 0; ;i )
      {cout<>parking;
      if(parking10){
      cout<<"There is no parking place "<<parking<<". Будь ласка, виберіть між 1-10: "<0||parking<11);
      if(parking_and_floor[floor][parking]== 0)
      {
      cout<<"This place is reserved, please choose another one";
      показати таблицю(**parking_and_floor);
      }else
      { break;
      };
      };
      parking_and_floor[floor][parking]= 0;
      cout<<"Your choice: floor "<<floor<<endl<<"place: "<<parking<<" ;"<<endl<<" був зарезервований успішно!"<<endl<>exit;
      }while(exit!= 0);
      return 0;
      }
      недійсна showTable(Int ** обр){
      cout<<"Table of parking place"<<endl;
      for(INT I = 0;i<7;i )
      {
      cout<<"floor"<<+ 1;
      for(Int J = 0;j<10;j )
      {
      arr[i][j]= J + 1;
      cout<<arr[i][j]<<"|";
      };
      cout<<endl<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
      };
      };

  6. (floorsAndParkings[floor – 1][parkingPlace – 1] !Поясніть будь ласка, що означають одиниці у квадратних дужках,що вони означають

Залишити коментар до Андрій Скасувати відповідь

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