Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 7. Хранение последовательностей в массивах 79




Программа                   начинается с объявления прототипов функций

и displayArra y (), которые понадобятся нам позже. Главная часть программы со- держит довольно скучный цикл ввода значений. На этот раз вводимые значения со- храняются в массиве inputvalues .

Ввод осуществляется в цикле for. Введенное значение сначала сохраняется в ло- кальной  переменной  Если оно оказывается отрицательным, оператор break прерывает выполнение цикла. Если же нет, значение integerValu e копирует- ся в массив.

Целочисленная  переменная                                   используется в качестве индекса массива. Она инициализирована нулем еще до начала цикла for. При каждой итера- ции индекс увеличивается. В условии выполнения цикла for осуществляется кон- троль за тем, чтобы количество введенных чисел не превышало                                                                                                 т.е. размера мас- сива (после введения 128 чисел программа                                                                                                       к выводу элементов массива на экран независимо от того, ввел пользователь отрицательное число или нет).

объявлении массива inputvalue s было указано, что его максимальная длина равна 128. При записи большего числа данных, чем определено в объявлении, ваша программа может работать неправильно и даже аварийно завершать работу. Поэтому лучше застраховаться и оставить больше места для хранения данных. Неважно, насколько велик массив; всегда нужно следить за тем, чтобы операции с массивом не приводили к выходу за его пределы.

Функция main заканчивается выводом на экран содержимого массива и суммы его элементов. Функция displayArra y () содержит обычный цикл for, который исполь- зуется для прохождения по массиву. Каждый очередной элемент массива добавляется к переменной accumulator. Передаваемый функции параметр sizeOfArray включа- ет количество значений, содержащихся в массиве.

Напомню еще раз, что индекс массива в C++ отсчитывается от 0, а не от 1. Кроме того, обратите внимание, что цикл for прерывается в тот момент, когда значение i становится равным sizeOfArray. Вы же не хотите добавлять все 128  элементов массива integerArra y к accumulator? Ни один элемент массива, индекс которого больше или равен числу sizeOfArray, учитываться не будет.

 

Инициализация массива

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

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

float floatArray[5] {0.0, 1.0, 3.0,

В этом  фрагменте   элементу    loatArra y [0]   присваивается значение    0,

floatArra y [1] — 1,                      [2 ] — 2 и Т.Д.

Размер массива может определяться и количеством инициализирующих констант. Например, перечислив в скобках значения инициализаторов, можно ограничить раз- мер массива floatArra y пятью элементами. C++ умеет очень хорошо считать (по крайней мере, его можно спокойно использовать для этого). Так, следующее объявле- ние идентично представленному выше:

f l o a  t  f l o a t A r r a y [  ]                       1 . 0 ,            3 . 0 ,

 

 

80                                        Часть II. Становимся программистами


Выход за границы массива

Математики пересчитывают содержимое массивов, начиная с элемента номер 1. Первым элементом математического массива х является х(1) . Во многих языках программирования также начинают перечисление элементов массива с 1. Но в C++ массивы индексируются начиная с 0! Первый элемент массива C++ обозначается как Первый индекс массива C++ нулевой; поэтому последним элемен-

том                               целочисленного массива является                                 [127], а не in - tegerArra y [128].

К сожалению, в C++ не проверяется выход индекса за пределы массива. Этот язык будет рад предоставить вам доступ к элементу                                                                                                                    [200]. Более того, C++ позволит вам обратиться даже к                                                                                         [-15].

Приведем такую аналогию. Длину трассы можно измерять равными промежутками между многочисленными придорожными столбами. Назовем их единицами измере- ния длины дороги. Чтобы попасть к моему дому, нужно свернуть с главной трассы и по прямой ехать до конца дороги, длина которой равна точно девяти столбам. Если начинать отсчет с последнего телеграфного столба на трассе, тогда столб у моего дома будет иметь 10-й номер.

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

Конечно, вы можете отмерить расстояние в 20  столбов от трассы. Но дороги там уже не будет (помните, она кончается у моего дома?). Трудно точно сказать, что вы сможете там найти. Вы можете оказаться на следующей трассе, где-нибудь в поле или даже в чьей-то спальне (вот будет весело!). Угадать, куда в этом случае попадешь, до- вольно трудно, но хранить там еще рискованнее. Оставить вещь в поле — это одно, но забросить ее в комнату моего соседа совсем другое (я-то знаю это навер- няка, так как каждый раз, когда газеты исчезают из моего почтового яшика, они ока- зываются в гостиной моего соседа).

То же происходит и в программировании. Пытаясь прочитать  20-й  элемент (arra y                                      массива, вы получите то или другое случайное число (а  возможно,                  программа просто аварийно завершит работу). А                          записывая какое-то значение, вы получите непредсказуемый результат. Скорее

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

Самой распространенной ошибкой является неправильное обращение к по- следнему элементу по адресу integerArra y 1128]. Хотя это всего лишь следующий за концом массива элемент, записывать или считывать его не менее опасно, чем любой другой некорректной адрес.

 



Использовать ли массивы

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

И все же в возможности повторного отображения введенных значений кроется значительное преимущество использования массивов. Массивы позволяют программе многократно обрабатывать серии чисел. Главная программа была способна передать массив входных значений функции displayArra y () для отображения, а затем в Su-

для суммирования.

Глава 7. Хранение последовательностей в массивах                  81


Определение и использование массивов

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

В C++ матрицы определяются следующим образом:

int

Эта матрица может иметь 10 элементов в одном измерении и 5 в другом, что в сумме составляет 50 элементов. Другими словами, intMatri x является 10- элементным массивом, каждый элемент которого — массив из 5 элементов. Легко догадаться, что один угол матрицы  обозначается                           [0] [0] , тогда как вто- рой —

Индексы intMatri x можно  рассматривать в любом удобном порядке. По какой оси отложить длину 10 — решайте сами, исходя из удобства представления. Матрицу можно инициализировать так же, как и массив:

i n  t                                     = { { 1 , 2 , 3 )  , ( 4 , 5 , 6 } } ;

Здесь фактически выполняется инициализация двух трехэлементных массивов: intMatri x [0] значениями I, 2 и 3, a intMatri x [1] — 4, 5 и 6 соответственно.

 

символьных

Элементы массива могут быть любого типа. В C++ возможны массивы любых чи- словых типов — float , double, long, однако символьные массивы имеют особое значение.

Слова разговорной речи могут быть интерпретированы как массивы символов.

Массив символов, содержащий мое имя, таков:

c h a r   s M y N a r a e [  ]      =                           ' e '  ,  ' p '  ,  ' h '  ,  ' e ' ,

Мое имя можно отобразить с помощью следующей небольшой программы:

// CharDisplay — выводит экран массив

// символов в окне MS DOS

 

 

// объявления прототипов void

int

 

int     nArg, char*

{

char           { ' S , '                   'n'}; 7) ;

cout << "\n"; return 0;

 

//displayCharArray — отображает массив символов,

// одному при каждой итерации void

int

 

 


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 229; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь