Помимо одномерных массивов вам может понадобиться для работы использование многомерного массива (двумерного, трёхмерного…). В этом уроке будут рассмотрены двумерные массивы. Они самые распространенные, а остальные встречаются крайне редко.
Ми вже розглядали в попередніх статтяходномерные массивы і Си-строки (символьные массивы).Там говорилось, что элементы массива размещаются в памяти последовательно – элемент за элементом. Визуально их можно представить в виде одной строки данных в памяти. Щоб звернутися до будь-якого елементу такого масиву, достаточно указать его имя и индекс элемента. Первое отличие двумерного массива от одномерного – його елементи містять два індексу: int arr [3][4]; Дані такого масиву можна уявити, как таблицу: 3 х 4.
Первый за именем массива индекс – это индекс строки, второй – индекс столбца.
Когда вы уже посмотрели на эти рисунки, можна сказати про двовимірному масиві так – это массив, в якому кожен елемент також є масивом. 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, знак= можна упустити. Рядки не започатковано за тим же принципом:
Как вывести на экран данные двумерного массива? Можно пойти длинным путём и обращаться к каждому элементу вручную:
Вывод Си-строк двумерного массива на экран немного легче, так как нам достаточно указать только имя массива и индекс строки. Далее выходной поток cout самостоятельно будет выводить все элементы символьного массива, пока не обнаружит ' 0'
Хорошо! А якщо нам треба заповнити і показати дані масиву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) – сообщает об этом, предлагает повторить выбор этажа и места и отображает обновлённую схему паркинга, где отмечены забронированные места.
Работает это так:
продолжение…
Предлагаю решить несколько задач по теме двумерные массивы.
Рекомендую подивитися ці відео – двовимірні масиви
Чому при перевірці елементів масиву ми віднімаємо від floor і parkingPlace одиницю?
(floorsAndParkings[floor – 1][parkingPlace – 1])
Тому що нумерація елементів масиву починається з 0. Наприклад: Людина вводить номер 7 - Нам треба перевірити осередок 6.
Чому у мене вийшла помилка “error : пошук імені в «е’ змінилося ISO «для’ оглядового [-fpermissive]”.
Як поміняти стовпці або рядки місцями? Можна непосредсвенно взяти стовпець і поміняти його місце?
Код програми про місця на парковці абсолютно не робітник. При компіляції Microsoft Visual Studio 2017 видав куев хмару помилок .
Брайану: чол, все працює. У мене та ж сама Visual Studio 2017.
цікаве завдання,таких більше!
вже який раз все що я пишу так переривається Т Т можете підказати чому функція відмовляє?
#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<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
};
};
ой там дивлюся шматки від коду пропали
#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<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
};
};
(floorsAndParkings[floor – 1][parkingPlace – 1] !Поясніть будь ласка, що означають одиниці у квадратних дужках,що вони означають