Массив называется одномерными, если элементы массива располагаются строго последовательно. При этом элемент массива имеет один индекс (одну размерность), определяющий порядковый номер элемента в массиве.
Формат описания одномерного массива:
<тип> <имя_массива> [размер];Здесь <тип> — тип элементов массива (int, float, char, структуры), <имя_массива> записывается по правилам идентификаторов; <размер> - размерность массива, количество его элементов в виде целочисленной константы или константного выражения. Эта величина определяет количество ячеек оперативной памяти, зарезервированной для массива.
Например:
а ) float A[10];
б ) const n=10; float A[n];
Здесь преимущество второго способа, с предварительным объявлением размерности в виде константы, заключается в следующем - если надо будет изменить размерность массива, то это достаточно сделать в одном месте программы при определении константы.
Для статического массива, на этапе компиляции, резервируется память для размещения n чисел указанного типа (10 вещественных чисел), при этом для него требуется память объёмом k * n байт (4*10), где k — необходимое количество байт для размещения одного элемента указанного типа (одного числа типа float). Эта память сохраняется на всё время выполнения программы, а точнее, функции или блока, где описан массив.
Программно необходимый объём памяти определяется с помощью операции sizeof , например:
M=sizeof (<тип>) * n;
или M = sizeof (<имя_масива>);
или M = sizeof <имя_масива>;
где M — переменная целого типа, определяющая размер массива в байтах. Тип обязательно записывается в скобках, а имя может быть без скобок.
Следующая программа выведет дважды число 40.
float A [10]; int M 1, M 2;
M1=sizeof(float)*10; // но M1=sizeof float *10;— ошибка!
M2=sizeof(A); // или M2=sizeof A;
cout <<M1<<endl<<M2;
При работе с массивом необходимо помнить, что нумерация элементов массива начинается с 0. Тогда A[n-1] — последний элемент массива. Это связано с использованием указателей при работе с массивами. Поэтому в нашем примере индекс элементов массива может изменяется от 0 до 9 включительно, то есть индекс последнего элемента массива на единицу меньше его размерности. Объявленные 10 элементов массива обозначаются следующим образом: A[0], A[1], A[2] ,…, A[9].
Замечание. В языке С/С++ отсутствует проверка границ массивов, поэтому возможна ситуация выхода за его границы. Выходя за границы массивы можно записать значение в некоторую переменную или даже в код программы, что может привести к неожиданным результатам. О таком контроле должен позаботиться программист.
При использовании статических массивов возникают ситуации, когда размер массива заранее не известен. В этом случае описывается массив с максимальной размерностью. Реальную размерность вводим и используем далее, например, в циклах и для других целей:
const nmax=100;
float X[nmax];
int n;
cout <<”Введите размер массива ”;
cin >> n ;
// Дальше работаем с n (а не с nmax) элементами массива, например, вводим их
for ( int i =0; i < n ; i ++)
{
cout <<” X [“<< i <<”]=”;
cin >>X[i];
}
Замечание. Такой способ проще, но неэффективен с точки зрения распределения памяти, так как “заказываем” больше памяти, чем реально используем. В таких случаях профессионально используются динамические массивы.
Основные действия с массивами
I . Инициализация массива.
1) Ввод элементов массива с клавиатуры (см. выше) или с заранее подготовленного файла.
2) Задание значения элементов массива можно (проинициализировать) на этапе его описания:
<тип> <имя_массива> [размер]={список значений};
где в фигурных скобках записываются значения элементов массива соответствующего типа, разделённые запятыми. Например:
const N=5;
float A[N]={-1.1, 22, 3, -4.4, 50};
Замечание. Если в списке меньше N значений, то недостающие элементы массива примут нулевое значение. Наоборот, если указать больше N значений, “компилятору это не понравится”.
в) Ввод массива символов (или строку) можно выполнить по-разному.
* Можно указать размерность, достаточную для размещения текста и символа конца строки (‘\0’). Этот символ надо явно записать в конце списка, например:
char T[11]={‘м’,’а’,’т’,’е’,’м’,’а’,’т’,’и’,’к’,’а’,’\0’};
* Второй способ проще и удобнее: char T[11]=“математика”;
В этом случае нулевой символ добавляется к концу строки автоматически. Кроме того, как для числовых, так и для символьных массивов необязательно указывать размерность. Она будет определена в зависимости от количества записанных элементов или длины строки. Например,
int V[]={11, 2, -3, 44, -5}; //объявляет и инициализирует целочисленный массив из пяти элементов,
сhar S[]=”ВМФ”; // строку из четырёх символов, так как добавлен символ конца строки.
Указанный способ определения массива удобен для отладки программы, так как не надо тратить время на многократный ввод его элементов. При тестировании достаточно изменить несколько элементов массива.
г) Задание значения элементов массива с помощью генератора случайных чисел:
const n=5;
int Y[n];
randomize(); //srand(time(0));
for (int i=0; i<n; i++)
{ Y[i]=random(100); //Y[i]=rand()%100;
cout <<Y[i]<<" ";
}
Функция randomize () ( или srand( time (0)) ) – генерирует новую последовательность случайных чисел, которая может использоваться для функции random () ( rand () ). (рекомендуют использовать, чтобы массив был «более случайным», в противном случае массив может быть таким же, каким был при предыдущем выполнении программы).
Параметр функции random (в нашем примере 100) ( или rand()%100 ) означает, что числа массива будут целыми на промежутке от 0 до 99 включительно. Если надо, чтобы числа были не только положительными, можно записать, например, так: Y[j]=random(100)-50; или Y [ i ]= -50+ rand ()%100; Тогда числа будут на промежутке от –50 до 49.
Если надо получить вещественные числа, можно в цикле записать, например, так: A[i]=random(5)/10.-0.25; При этом массив A объявляется как float , а константу 10 надо записать обязательно с символом «.», то есть как вещественное число. Иначе получатся все одинаковые числа (-0.25), так как при делении любого целого числа, меньшего 5, на целое число 10 получится целая часть результата, то есть нуль.
д) Задание массива по некоторому правилу (закону), например:
for ( int j=0; j<n; j++)
if (j%2) A[j]= j*10;
else A [ j ]= j /100.;
Дата: 2018-12-28, просмотров: 281.