Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДВУМЕРНЫЕ МАССИВЫ.doc
Скачиваний:
4
Добавлен:
25.11.2019
Размер:
77.31 Кб
Скачать

Лаба 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();

}