Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

3. Массивы

Переменные, с которыми мы встречались ранее, удобны тогда, когда они характеризуют только одно значение. Но порой возникает необходимость хранить пару или большее количество чисел или символов, характеризующих одну величину. Например, список средней температуры каждого дня года. Для хранения такого рода информации применяются так называемые массивы. Массив это упорядоченная совокупность данных. Можно дать еще одно определение – массив это тип переменной в которой хранится несколько значений. Аналогом массива в математике является вектор, а аналогом элемента массива переменная с индексом. Для того, чтобы определить массив в программе нужно указать тип переменных хранящихся в массиве, имя массива и его размер. Например, для хранения температуры в течение года целесообразно объявить массив

int temperature[365];

Если нужно учитывать температуру с большей точностью, то можно объявить массив

double temp2[365];

В каждый элемент такого массива при его объявлении можно занести число, например так

int temperature[7]={25, 26, 24, 22, 20, 24, 24};

В результате получится маленькая таблица температур на первом месте будет стоять число 25, далее 26, 24 и т.д.

К каждому элементу массива можно обратиться отдельно. Например, если потребуется исправить температуру второго дня на 27, можно записать

temperature[1]=27;

Обратите внимание, на индекс для второго числа, он равен не 2, а 1. Дело в том, что элементы массива нумеруются с нуля. Иногда это обстоятельство вызывает некоторые трудности. Например, мы собрались хранить некие данные характеризующие итоговые показатели года, например, с 1995 по 2005гг. в массиве. Было бы удобным в качестве индекса использовать номер года. Однако необходимость нумерации первого компонента массива с 0, а не с 1995 несколько ограничит наши действия. Хотя конечно можно создать массив размером 2006 элементов (с 0 до 2005 ) и использовать только 10 последних. Однако такая расточительность ничем не оправдывается.

В качестве номера элемента массива можно использовать выражения целого типа. Например, если нужно узнать только температуру в четные дни, то можно это сделать так

void main(){

double tempr2[365];

for(int i=0; i<184; i++){

cin >>temp2[2*i]// указании номера с помощью выражения

}

}

Нужно отметить, что использовать выражение при объявлении размера массива неразрешается, хотя обращении к элементу массива, как только, что было показано, вполне допустимо.

Возникает вопрос – как быть, если нужно сохранить в массиве информацию о температуре за последние 10 лет? Конечно, можно увеличить размер массива объявить tempr[3650]. Чаще всего такой выход оказывается неудобным. Тем более что существует возможность создать двумерный массив, впрочем, как и трехмерный, четырехмерный и т.д. Двумерный массив создается аналогично, только квадратные скобки ставятся дважды, например

tempr[10][365];

Для трехмерного массива объявление выглядело бы так:

double tempr[10][52][7];

и т.д.

Обращение к элементу двухмерного массива выглядит так:

tempr[3][300]=-2;

Соответственно трехмерного

temp[6][22][7]=18;

Для лучшего понимания одномерный массив можно представлять себе как вектор, двумерный в виде матрицы, трехмерный в виде объемном таблицы, т.е. таблицы из нескольких листов, и т.д.

На самом деле двумерный массив double tempr[10][365]это одномерный массив, состоящий из 10 элементов, но каждый элемент это тоже одномерный массивов элементами которого являются одномерные массивы из 365 элементов типа double. То же самое можно сказать о трехмерном массиве double tempr[10][52][7]- это 10 двумерных массивов размером 52×7 элементов типа double.

Многомерные массивы инициализируются подобно одномерным. Например, нужно инициализировать двухмерный массив 4×2, где в первом столбце. записаны числа от 1 до 4, а во второй квадраты этих чисел.

int sqrs[4][2]={

1,1,

2,4,

3,9

4,16

};

Размер массива должен быть известен к моменту компиляции. Но его не обязательно задавать в виде числа. Это может быть выражение или определенную в #define величину.

Одной из наиболее частых ошибок возникающих при работе с массивами является выход индекса за границы массива. Нужно сказать, что большинство компиляторов никаких сообщений в этом случае не выдают. Разработчики этих компилятора отказались от такой проверки, возложив эту задачу на программистов. Хотя некоторые компиляторы, а среди них Microsoft Visual Studio C++ выдают информацию о выходе за пределы массива. Следует запомнить, что максимальный номер элемента массива на единицу меньше его размера!

Работа с массивом сводится к работе с его элементами. Массивы нельзя сравнивать, присваивать друг другу. Все это можно делать только с отдельными элементами.

Пример

#include <iostream>

#define size1 3 //так определен размер size1

using namespace std;

int main(){

int n, array1[size1],array2[3]; //объявление двух массивов

for(int i=0; i< size1; i++){

array1[i]=1; // все элементы равны 1

cout<<"\n"<<array1[i]; //вывод каждого элемента

}

for(int i=0; i< size1; i++){

array2[i]=2; //все элементы равны 2

cout<<"\n"<<array2[i];

}

int array3[size1]; //объявление 3-го массива

for(int i=0; i< size1; i++){

cout<<"\n"<<array1[i];

cout<<"\n"<<array2[i];

array3[i]=array1[i]+array2[i]; //вычисление элементов массива

cout<<"\n array3[" << i << "]="<< array3[i];

}

}

Решим еще одну задачу. Тебуется заполнить двумерный массив размером 10х10 целыми числами от 0 до 99.

#include <iostream>

using namespace std;

int main(){

int array[10][10];

for(int i=0;i<10;i++){

for(int j=0;j<10;j++){

array[i][j]=10*i+j;

cout<<"array["<<i<<"]["<<j<<"]="<<array[i][j]<<endl;

}

}

}

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

char array[20]={‘P’,’r’,’i’,’v’,’e’,’t’};

cout<< array;

позволяет вывести на экран слово Privet.

Особенностью символьных массивов является то, что их можно инициализировать двумя способами:

  1. инициализировать каждый элемент

char arr1[6]={‘p’,’r’,’i’,’v’,’e’,’t’};

  1. инициализировать строкой

char arr2[7]=”privet”;

Обратите внимание, что в последнем случае размер массива на единицу больше соличества символов. Дело в том, что в этом случае в конец массива автоматически добавляется символ \0. О необходимости этого символа мы расскаже тогда, когда подайде к теме «строки».

Самое интересное, что для символьных массивов размер при его объявлении вообще можно не указывать

char arr3[]=”privet”;

Более того, выод массива можно осуществлять не поэлементно, а в виде строки, т.е.

Cout<<arr3;

С символьным массивом, инициализированным строкой можно работать как с обычным массивом. В частности, если необходимо внести в массив какие то изменения, то это можно сделать только путем обращения к каждому элементу массива, т.е. код

char arr3[]=”privet”;

arr3[]=”Privet”;

рассматривается как ошибочный.

Пример:

<тип> <имя>[<размерность1>]...[<размерностьN>]={<значения для инициализации массива>}; Причём, к примеру,

int x[2][3]={{1,2,3},{4,5,6}}

и

int x[2][3]={1,2,3,4,5,6}

- одно и то же, однако

int x[][3]={{1,2},{4,5,6}}

и

int x[][3]={1,2,4,5,6}

- это не одно и то же (в первом случае x[0][2]==0, а во втором - x[1][2]==0, а x[0][2]==4 - думаю, понятно, к чему я клоню). В этом же примере показано, что самую первую размерность в случае инициализации указывать необязательно (но необходимо, если реально программа использует большие индексы) - она определяется компилятором автоматически.