Массив представляет собой коллекции данных одного типа, сохраненные в памяти компьютера. Каждая единица данных называется элементом массива.
Массив определяется именем, типом данных и размером. Пример объявления массив приведен ниже:
float Salary[20];
где float – тип данных;
Salary – имя массива;
[20] – количество элементов массива.
Встретив подобную запись, компилятор зарезервирует в памяти место размером 20x6=120 байт (6- размер переменной типа float).
Адресация элементов массива производится по сдвигу относительно первого элемента, сохраненного в имени массива. Так к первому элементу можно обратиться следующим образом: Salary[0], ко второму – Salary[1], и.т.д.
Если объявлен массив размера N, то к его элементам можно обращаться, указывая индекс в диапазоне от 0 до (N-1).
Пример программы, работающей с массивом данных, приведен ниже:
#include "stdafx.h"
#include "iostream"
using namespace std;
int main(int argc, char* argv[])
{
int a[4];
for (int i=0;i<4;i++ )
{
cout<<"Value["<<i+1<<"]:";
cin>>a[i];
}
for (int i=0;i<4;i++ )
cout<<i<<":"<<a[i]<<"\n";
return 0;
}
Результат работы программы представлен на рисунке 2.1.
Рисунок 2.1 –Результат работы программы
Компилятор не контролирует выход за пределы массива при обращении к элементам массива. Если в предыдущем примере, мы вставим в конце программы выражение cout<<a[4], компилятор при построении проекта не выдаст ошибки. При выполнении программы в лучшем случае произойдет критическая ошибка и программа завершит свое выполнение, в худшем будут выдаваться не правильные результаты.
Пример программы с подобной ошибкой представлен ниже:
#include "stdafx.h"
#include "iostream"
using namespace std;
int main(int argc, char* argv[])
{
int a[4];
for (int i=0;i<4;i++ )
a[i]=i;
int summa=0;
for (int i=0;i<=4;i++ )
summa+=a[i];
cout<<"summa="<<summa<<"\n";
return 0;
}
Результат выполнения программы представлен на рисунке 2.2.
Рисунок 2.2 – Результат работы программы
Объясните, почему получился такой результат.
Инициализация массива базового типа можно производить одновременно с его объявлением:
float Salary [3]={20000, (15750,35), 7500};
int A []={1, 3, 4, 5};
Обратите внимание, что во втором случае компилятор сам определит размер массива.
Язык С++ позволяет создавать многомерные массивы, например, двухмерные:
short int Board [8][8];
Если нужно узнать, находится ли шахматная фигура в позиции А2, то нужно будет обратиться к элементу двумерного массива:
Board [0][1];
Ниже приведены примеры инициализации двумерных массивов:
intA[3][3]={1,2,3,4,5,6,7,8,9};
intA[3][3]={{1,2,3},
{4,5,6},
{7,8,9}};
Строка текста представляет собой набор символов. В С++ строку можно представить как массив символов, заканчивающийся концевым нулевым символов строки, например:
Во втором случае нет необходимости добавлять в конце нулевой символ, компилятор это сделает сам. Инициализацию строкового массива можно оставить на потом, но при этом также необходимо следить, чтобы в массив не было записано больше символов, чем под него отведено.
На следующем листинге представлен пример использования строкового массива.
Листинг 2.3.- Работа со строковыми массивами
#include "stdafx.h"
#include "iostream"
using namespace std;
int main(int argc, char* argv[])
{
char buffer[20];
cout<<"Enter the string:";
cin>>buffer;
cout<<"Here the string:\""<<buffer<<"\"\n";
return 0;
}
Результат выполнения программы представлен на рисунке 2.3.
Рисунок 2.3 –Результат выполнения программы
Как видно, при выполнении программы возникает ряд проблем:
- если пользователь введет строку, содержащую более 19 символов, то оператор cin введет их за пределы массивы;
- оператор cin воспринимает пробел, как окончание строки.
Эти проблемы позволяет решить метод get(), применяемый вместе с оператором cin: cin.get(). Для выполнения данного метода необходимо задать: буфер ввода, максимальное число символов, разделительный символ прерывания ввода.
Листинг 2.4.- Работа со строковыми массивами
#include "stdafx.h"
#include "iostream"
using namespace std;
int main(int argc, char* argv[])
{
char buffer[20];
cout<<"Enter the string:";
cin.get(buffer,19);
cout<<"Here the string:\""<<buffer<<"\"\n";
return 0;
}
Для хранения списка строковых данных можно воспользоваться двухмерным строковым массивом.
#include "stdafx.h"
#include "iostream"
using namespace std;
int main(int argc, char* argv[])
{
char names[20][80];
char ch='y';
int ind=0;
while ((ch=='y'||ch=='Y')&&ind<20)
{
cout<<"Enter name:";
cin.get(names[ind],19);
ind++;
cout<<"Continue?:";
cin>>ch;
cin.ignore();//убираем из потока символ «возврата строки»