Лаба 6 Двумерные массивы
Двумерные массивы
Язык С позволяет использовать массивы любой размерности, но наиболее часто встречаются двумерные массивы. Двумерным называется массив, элементы которого являются сами массивами.
Двумерный массив можно представить как таблицу, имеющие столбцы и строки. Такой массив следует объявлять с двумя индексами, один из которых определяет количество строк, а второй количество столбцов таблицы. Например массив, объявленный как:
int table [3] [4] ;
можно представить в виде таблицы 1. Этот массив имеет три строки и четыре столбца. Для доступа к элементу массива следует указать два индекса. Первый индекс элемента двумерного массива представляет собой номер строки, а второй – номер столбца. Для массива table индекс номера строки принимает значения 0,1,2, а индекс номера столбца – значения 0,1,2,3.
Таблица 1. Массив table [3] [4].
-
table [0] [0]
table [0] [1]
table [0] [2]
table [0] [3]
table [1] [0]
table [1] [1]
table [1] [2]
table [1] [3]
table [2] [0]
table [2] [1]
table [2] [2]
table [2] [3]
количество байт памяти, которое необходимо для размещения массива, вычисляется по формуле:
Количество байт = размер типа данных * количество строк * количество столбцов.
Под массив table [3] [4] требуется 2*3*4 = 24 байта памяти.
В памяти двумерный массив занимает непрерывную область и располагается по строкам, как одномерный. Например массив table [3][4] располагается в памяти так, как показано на рис.1.
t able [0][0] …table [0][3] table [1][0… table [1][3] table [2][0… table [2][3
первая строка вторая строка третья строка
Рис.1. Размещение двумерного массива table [3][4] в памяти.
Инициализация двумерных массивов.
Для инициализации двумерного массива следует при объявлении массива в фигурных скобках записать список констант, значения которых присваиваются элементам массива.
Например, массив table [3][4] может быть инициализирован так:
int table [3][4] = {
{5 ,8 ,9 ,7},
{3, 6, 4, 7},
{6, 2, 1, 0}
};
Массив table будет заполнен так:
5 |
8 |
9 |
7 |
3 |
6 |
4 |
7 |
6 |
2 |
1 |
0 |
Если констант в списке будет указано меньше, чем элементов массиве, то оставшиеся значения элементов массива не определены. Например, при инициализации массива table следующим образом:
int table [3][4] = {
{5 ,8 },
{3, 6, 4, 7},
{6, 1, 0}
};
Массив table будет заполнен так:
5 |
8 |
|
|
3 |
6 |
4 |
7 |
6 |
1 |
0 |
|
В пустых клеточках значения элементов массива не определены.
Пример 1. Пусть в маленькой гостинице имеется 10 комнат. Известны номера комнат: 102,107,109,112,115,116,123,125,127,130 и вместимость каждой комнаты соответственно: 12,43,23,12,20,15,16,23,12,15. Рассмотрим задачу поиска и вывода списка комнат, вместимость которых составляет не меньше значения, вводимого с клавиатуры.
#include <stdio.h>
//объявление двумерного массива room. Значения элементов первой строки массива
//представляют собой номера комнат,
//а значения элементов второй строки – вместимость комнат
int room[2][10]= {
{102,107,109,112,115,116,123,125,127,130},
{12,43,23,12,20,15,16,23,12,15}
};
void main (void)
{
int i,j, flag=0,num;
//вывод вместимости всех комнат гостиницы
puts("Вместимость всех комнат гостиницы:");
for( j=0; j<10; j++)
printf("Комната #%d рассчитана на %d мест\n",room[0][j],room[1][j]);
puts("Введите минимальное необходимое количество мест");
scanf("%d",&num);
// поиск списка комнат с заданной вместимостью
for(j=0; j<10; j++)
if(room[1][j]>=num)
{flag=1;
printf("Комната #%d рассчитана на %d мест\n",room[0][j],room[1][j]);
}
if(flag==0)
puts("Комнат с таким количеством мест нет");
}
Пример 2. По введенным числу, месяцу и году определить порядковый номер дня в году. Например, если ввести 10 - это число, 4 – это месяц, 2001 – это год, то программа должна вывести:
В 2001 году это день имеет номер 100.
Для решения этой задачи используется двумерный массив, имеющий две строки и 13 элементов в каждой строке. В первую строку занесены значения количества дней в каждом месяце не високосного года, а во вторую - то же для високосного года. В строке 13 элементов, а на 12, т.к. месяцы года нумеруются, начиная с первого, а индексы элементов массива начинаются с нуля.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
clrscr();
int year,month,day,i,k;
//объявление и инициализация массива
int tab_days[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
puts("Введите число, месяц и год");
scanf("%d %d %d",&day,&month,&year);
// определим, високосный ли год
k=year%4==0 && year%100 !=0 || year%400 ==0;
if(k==1)
puts("Год високосный" );
else
puts("Год не високосный" );
// контроль правильности ввода месяца
if(month<1 || month >12)
{
puts("Неверно введен месяц");
exit(-1); //завершение работы программы при ошибке
}
// контроль правильности ввода числа
if(day <1 || day >tab_days[k][month])
{
puts("Неверно введен день");
exit(-1);
}
// цикл по номеру месяца
for(i=1; i<month; i++)
day+= tab_days[k][i];
printf("В %d году этот день имеет номер %d\n",year, day);
getch();
}