Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория ответы.doc
Скачиваний:
39
Добавлен:
24.12.2018
Размер:
1.61 Mб
Скачать
  1. Структурированные типы данных: одномерные массивы. Создание и заполнение массива информацией. Доступ к элементу массива. Основные операции с одномерным массивом.

В этой главе мы рассматриваем массивы. Массив (array) — это коллекция перемен­ных одинакового типа, обращение к которым происходит с применением общего для всех имени. В C++ массивы могут быть одно- или многомерными, хотя в основном используются одномерные массивы. Массивы представляют собой удобное средство группирования связанных переменных.

Чаще всего используются символьные массивы, в которых хранятся строки. Как упо­миналось выше, в C++ не определен встроенный тип данных для хранения строк. Поэто­му строки реализуются как массивы символов. Такой подход к реализации строк дает С++-программисту больше "рычагов" управления по сравнению с теми языками, в кото­рых используется отдельный строковый тип данных.

Одномерные массивы

Одномерный массив — это список связанных переменных. Для объявления одномер­ного массива используется следующая форма записи.

тип имя_массива [размер] ;

Здесь с помощью элемента записи тип объявляется базовый тип массива. Базовый тип определяет тип данных каждого элемента, составляющего массив. Количество элемен­тов, которые будут храниться в массиве, определяется элементом размер. Например, при выполнении приведенной ниже инструкции объявляется int-массив (состоящий из 10 элементов) с именем sample.

int sample[10];

Индекс идентифицирует конкретный элемент массива.

Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива. В C++ первый элемент массива имеет ну­левой индекс. Поскольку массив sample содержит 10 элементов, его индексы изменяются от 0 до 9. Чтобы получить доступ к элементу массива по индексу, достаточно указать нужный номер элемента в квадратных скобках. Так, первым элементом массива sample является sample [ 0 ], а последним — sample [ 9]. Например, следующая про­грамма помещает в массив sample числа от 0 до 9.

#include <iostream>

using namespace std;

int main ()

{

int sample[10]; // Эта инструкция резервирует область

// памяти для 10 элементов типа int.

int t;

// Помещаем в массив значения.

for(t=0; t<10; ++t) sample[t]=t;

// Отображаем массив.

for(t=0; t<10; ++t) cout << sample[t] « ' ' ;

return 0; }

В C++ все массивы занимают смежные ячейки памяти. (Другими словами, элементы массива в памяти расположены последовательно друг за другом.) Ячейка с наименьшим адресом относится к первому элементу массива, а с наибольшим — к последнему. Например, после выполнения этого фрагмента кода

int i[7];

int j;

for(j=0; j<7; j+ + ) i[j] = j;

массив будет выглядеть следующим образом.

i[0]

i[1]

i[2]

i[3]

i[4]

i[5]

i[6]

0

1

2

3

4

5

6

Для одномерных массивов общий размер массива в байтах вычисляется так:

всего байтов = размер типа в байтах х количество элементов.

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

#include <iostream>

#include <cstdlib>

using namespace std;

int main () {

int I, min_value, max_value;

int list[10] ;

for(i=0; i<10; i++) list[i] = rand();

//Находим минимальное значение.

min_value = list[0];

for(i=l; i<10; i++)

if(min_value > list[i]) min_value = list[i];

cout << "Минимальное значение: " << min_value << '\n';

//Находим максимальное значение.

max_value = list[0];

for(i=l; i<10; i++)

if(max_value < list[i]) max_value = list[i];

cout << "Максимальное значение: " << max_value << '\n';

return 0;

}

В C++ нельзя присвоить один массив другому. В следующем фрагменте кода, напри­мер, присваивание а = b; недопустимо.

int а[10] , b[10] ;

a = b; // Ошибка!!!

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

На границах массивов погранзаставы нет

В C++ не выполняется никакой проверки "нарушения границ" массивов, т.е. ничего не может помешать программисту обратиться к массиву за его пределами. Если это про­исходит при выполнении инструкции присваивания, могут быть изменены значения ячейках памяти, выделенных некоторым другим переменным или даже вашей програм­ме. Другими словами, обращение к массиву (размером N элементов) за границей N-го элемента может привести к разрушению программы при отсутствии каких-либо замеча­ний со стороны компилятора и без выдачи сообщений об ошибках во время работы про граммы. Это означает, что вся ответственность за соблюдение границ массивов лежит только на программистах, которые должны гарантировать корректную работу с массивами. Другими словами, программист обязан использовать массивы достаточно большого размера, чтобы в них можно было без осложнений помещать данные, но лучше всего в программе предусмотреть проверку пересечения границ массивов.

Например, С++-компилятор "молча" скомпилирует и позволит запустить следующую программу на выполнение, несмотря на то, что в ней происходит выход за границы массива crash.

Осторожно! Не выполняйте следующий пример программы. Это может разрушить вашу систему.

// Некорректная программа. Не выполняйте ее!

int main()

{

int crash [10], i;

for(i=0; i<100; i++) crash[i]=i;

return 1;

}

В данном случае цикл for выполнит 100 итераций, несмотря на то, что массив crash предназначен для хранения лишь десяти элементов. При выполнении этой программы возможна перезапись важной информации, что может привести к аварийному останову программы.

Вас, возможно, удивляет такая "непредусмотрительность" C++, которая выражается в отсутствии встроенных средств динамической проверки на "неприкосновенность" границ массивов. Напомню, однако, что язык C++ предназначен для профессиональных программистов, и его задача — предоставить им возможность создавать максимально эффективный код. Любая проверка корректности доступа средствами C++ существенно замедляет выполнение программы. Поэтому подобные действия оставлены на рассмотрение программистам. Как будет показано ниже в этой книге, при необходимости программист может сам определить тип массива и заложить в него проверку нерушимости границ.