МНОГОМЕРНЫЕ МАССИВЫ

МНОГОМЕРНЫЕ МАССИВЫ

     Темпест Клауд, метеоролог, занимающаяся явлением перисто-сти облаков, хочет проанализировать данные о ежемесячном количестве осадков на протяжении пяти лет. В самом начале она должна решить, как представлять данные. Можно использовать 60 переменных, по одной на каждый месяц. (Мы уже упоминали о таком подходе ранее, но в данном случае он также неудачен.) Лучше было бы взять массив, состоящий из 60 элементов, но это устроило бы нас только до тех пор, пока можно хранить раздельно данные за каждый год. Мы могли бы также использовать 5 массивов по 12 элементов каждый, но это очень примитивно и может создать действительно большие неудобства, если Темнеет решит изучать данные о количестве осадков за 50 лет вместо пяти. Нужно придумать что-нибудь получше.

     Хорошо было бы использовать массив массивов. Основной массив состоял бы тогда из 5 элементов, каждый из которых в свою очередь был бы массивом из 12 элементов. Вот как это записывается:

static float rain[5][12];

     Можно также представить массив rain в виде двумерного массива, состоящего из 5 строк и 12 столбцов.

     При изменении второго индекса на единицу мы передвигаемся вдоль строки, а при изменении первого индекса на единицу, передвигаемся вертикально вдоль столбца. В нашем примере второй индекс дает нам месяцы, а первый - годы.

РИС. 12.3. Двумерный массив.

     Используем этот двумерный массив в метеорологической программе. Цель нашей программы - найти общее количество осадков для каждого года, среднегодовое количество осадков и среднее количество осадков за каждый месяц. Для получения общего количества осадков за год следует сложить все данные, находящиеся в нужной строке. Чтобы найти среднее количество осадков за данный месяц, мы сначала складываем все данные в указанном столбце. Двумерный массив позволяет легко представить и выполнить эти действия. Рис. 12.4 содержит программу.

/* найти общее количество осадков для каждого года, среднего */

/* довое, среднемесячное количество осадков, за несколько лет */

#define TWLV 12 /* число месяцев в году */

#define YRS 5 /* число лет */

main( )

{

static float rain [YRS][TWLV] = {

{10.2, 8.1, 6.8, 4.2, 2.1, 1.8, 0.2, 0.3, 1.1, 2.3, 6.1, 7.4},

{9.2, 9.8, 4.4, 3.3, 2.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 5.2},

{6.6, 5.5, 3.8, 2.8, 1.6, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 4.2},

{4.3, 4.3, 4.3, 3.0, 2.0, 1.0, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},

{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.2}

};

/* инициализация данных по количеству осадков за 1970-1974 */

int year, month;

float subtot, total;

printf("ГОД КОЛИЧЕСТВО ОСАДКОВ (дюймы) ");

for(year = 0, total = 0; year < YRS; year++)

{ /* для каждого года, суммируем количество осадков для каждого месяца */

for(month = 0, subtot = 0; month < TWLV; month++)

    subtot + = rain [year][month];

printf("%5d %15.lf ", 1970 + year, subtot);

total + = subtot; /* общее для всех лет */

}

printf(" среднегодовое количество осадков

        составляет %.lf дюймов. ", total/YRS );

printf(" Янв. Фев. Map. Апр.Май Июн.Июл. Авг.Сент.");

printf(" Окт. Нояб. Дек. " );

for(month = 0; month < TWLV; month++)

{   /* для каждого месяца, суммируем

    количество осадков за все годы */

for(year = 0, subtot = 0; year < YRS; year++)

subtot += rain[year][month];

printf(" %4.lf ", subtot/YRS); }

printf(" ");

}

РИС. 12.4. Метеорологическая программа.

ГОД КОЛИЧЕСТВО ОСАДКОВ (дюймы)

1970 50.6

1971 41.9

1972 28.6

1973 32.3

1974 37.8

Среднегодовое количество осадков составляет 38.2 дюйма.

ЕЖЕМЕСЯЧНОЕ КОЛИЧЕСТВО:

Янв. Фев. Mар. Апр. Mай. Июн. Июл. Авг.      Ceнт. OКТ. Нояб. Дек.

7.8   7.2    4.1   3.0    2.1    0.8   1.2    0.3         0.5    1.7    3.6     6.l

В этой программе следует отметить два основных момента: инициализацию и вычисления. Инициализация сложнее, поэтому мы сначала рассмотрим вычисления.

Чтобы найти общее количество осадков за год, мы не изменяем year, а заставляем переменную month пройти все свои значения. Так выполняется внутренний цикл for, находящийся в первой части программы. Затем мы повторяем процесс для следующего значения year. Это внешний цикл первой части программы. Структура вложенного цикла, подобная описанной, подходит для работы с двумерным массивом. Один цикл управляет одним индексом, а второй цикл - другим.

Вторая часть программы имеет такую же структуру, но теперь мы изменяем year во внутреннем цикле, a month во внешнем. Помните, что при однократном прохождении внешнего цикла внутренний цикл выполняется полностью. Таким образом, программа проходит в цикле через все годы, прежде чем изменится месяц, и дает нам общее количество осадков за пять лет для первого месяца, затем общее количество за пять лет для второго месяца и т. д.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

R.8.2.4 Массивы

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.8.2.4 Массивы В описании T D, в котором D имеет видD1 [ выражение-константа opt ]описывается идентификатор типа "… массив T". Если выражение-константа присутствует (§R.5.19), то оно должно иметь целочисленный тип и значение, большее 0. Это выражение задает число элементов массива.


Массивы

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Массивы Массив — это упорядоченная именованная совокупность однотипных значений, к которым можно обращаться по их порядковому номеру (индексу). Для описания массивов в языке Object Pascal используют следующие формы:• array [1..N1] of type — одномерный массив фиксированного размера


Массивы

Из книги 3ds Max 2008 для дизайна интерьеров автора Семак Рита

Массивы Для создания множества одинаковых объектов в 3ds Max есть специальная команда Array (Массив). Преимущество массивов заключается в том, что можно быстро создать большое количество объектов, сразу же указав, на сколько они будут сдвинуты, на какой угол повернуты и как


Многомерные базы данных (MDD)

Из книги Основы AS/400 автора Солтис Фрэнк

Многомерные базы данных (MDD) Реляционные базы данных организованы в виде двумерных таблиц. В MDD имеется одно или несколько дополнительных измерений. Например, Вам надо оценить свои доходы от продаж, рассмотрев в отдельности сводки по товарам, по регионам и по времени. В


Массивы

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Массивы В заключение этой дискуссии полезно рассмотреть пример контейнерного класса ARRAY, представляющего одномерный


8.1. Массивы

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

8.1. Массивы В Ruby массивы индексируются целыми числами; индексация начинается с нуля, как в языке С. На этом, впрочем, сходство и заканчивается.Массивы в Ruby динамические. Можно (хотя это и не обязательно) задать размер массива при создании. Но после создания он может расти без


8.1.11. Многомерные массивы

Из книги Macromedia Flash Professional 8. Графика и анимация автора Дронов В. А.

8.1.11. Многомерные массивы Если для численного анализа вам нужны многомерные массивы, то в архиве приложений Ruby есть прекрасная библиотека NArray, которую написал Масахиро Танака (Masahiro Tanaka). Если необходим аппарат для работы с матрицами, обратитесь к стандартной библиотеке


Массивы

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Массивы Мы уже довольно много знаем о переменных и работе с ними. Но наши знания все еще неполны. Так, мы ничего пока не знаем о массивах — особом способе хранения данных, доступном в ActionScript. Давайте же выясним, что это


Массивы

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Массивы Во многих отношениях массивы являются простейшей структурой данных. Проще могут быть только такие базовые типы данных, как integer или Boolean. Массив (array) представляет собой последовательный список определенного количества элементов. Все элементы в массиве


Массивы

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Массивы Массивы представляют собой простейшую реализацию набора элементов, для которой можно использовать алгоритм последовательного поиска. Возможны два случая: первый - элементы массива расположены в произвольном порядке и второй - элементы отсортированы. Сначала


Массивы

Из книги C++ для начинающих автора Липпман Стенли

Массивы Предположим, что у нас имеется отсортированный массив. Как было показано ранее, алгоритм последовательного поиска даже при использовании выхода из цикла в случае отсутствия в списке искомого элемента принадлежит к классу O(n). Каким образом можно улучшить


Многомерные массивы

Из книги автора

Многомерные массивы Firebird поддерживает многомерные массивы размерностью от 1 до 16. Например, следующий оператор определяет три столбца целочисленных массивов с двумя, тремя и четырьмя размерностями:CREATE TABLE BTABLE (/* хранит 4 строки по 5 элементов = 20 элементов */ARR_INT2 INTEGER[4,5],/* 6


МАССИВЫ 

Из книги автора

МАССИВЫ      Вы уже знаете, что массив представляет собой группу элементов одного типа. Когда нам требуется для работы массив, мы сообщаем об этом компилятору при помощи операторов описания. Для создания массива компилятору необходимо знать тип данных и требуемый класс


УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ

Из книги автора

УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ      Как создать указатели для многомерных массивов? Чтобы найти ответ на этот вопрос, рассмотрим несколько примеров. Предположим, что у нас есть описания int zippo[4][2];  /* массив типа int                 из 4 строк и 2 столбцов */int *pri;    /*


Функции и многомерные массивы

Из книги автора

Функции и многомерные массивы      Предположим, что вы хотите иметь функцию, работающую с двумерным массивом, причем со всем целиком, а не с частями. Как вы запишите определения функции и ее описания? Подойдем к этому более конкретно и скажем, что нам нужна функция,


3.9.1. Многомерные массивы

Из книги автора

3.9.1. Многомерные массивы В С++ есть возможность использовать многомерные массивы, при объявлении которых необходимо указать правую границу каждого измерения в отдельных квадратных скобках. Вот определение двумерного массива:int ia[ 4 ][ 3 ];Первая величина (4) задает