Программирование >>  Процедурные приложения 

1 ... 44 45 46 [ 47 ] 48 49 50 ... 150


for(index = 0; index < iDAYS; index++)

cout << siarray[ << index << ] = << &iarray[index] << \n ;

return(0); }

Выход за пределы массива

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

* norun.c

* НЕ запускайте эту программу.

#include <stdio.h> #define iMAX 10 #define iOOT OF RANGE 5 0 main{)

int inot enough room[iMAX] , index;

for (index = 0; index < iOUT OF RANGE; index++)

inot enough room[index] = index;

return(0);

Массивы символов

Хотя языки С и C++ поддерживают тип данных char, в переменных этого типа могут храниться только одиночные символы, но не строки текста. Если в программе необходимо работать со строками, их можно создавать как массивы символов. В таком массиве для каждого символа строки отводится своя ячейка, а последний элемент содержит символ конца строки - \0.

В следующем примере создаются три символьных массива. Массив szvehicle1 заполняется символ за символом с помощью оператора присваивания. Данные в массив szvehicle2 заносятся с помощью функции scanf(), а массив szvehicle3 инициализируется константной строкой.

* string. с

* Эта программа на языке С демонстрирует работу с массивами символов .

#include <stdio.h> main() {

char szvehiclel[7], /* машина */

szvehicle2[8]; /* самолет */

static char szvehicleS[8] = корабль ; /* корабль */

szvehiclel[0] = м

szvehiclel[1] = a

szvehiclel [2] = ш

szvehiclel[3] = и

szvehiclel[4] = н

szvehiclel[5] = a

szvehiclel[6] = \0;

printf ( \n\n\tВведите слово -> самолет ) ; scanf( %s ,szvehicle2);



printf( %s\n ,szvehiclel); printf( %s\n ,szvehicle2); printf( %s\n ,szvehicle3); return(0);

Хотя слово машина , сохраненное в массиве szvehiclel, состоит из шести букв, массив содержит семь элементов: по одному для каждой буквы плюс еще один для символа конца строки. То же самое справедливо и для других двух массивов. Вспомните также, что массив szvehicle3 можно задать путем указания последовательности символов в фигурных скобках:

static char szvehicleS[8]= {к,о,р,а,б,л,ь,\0};

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

static char szvehicleS[] = корабль ;

При этом размер массива определяется компилятором автоматически.

Часто содержимое массива запрашивается у пользователя с помощью функции scanf( ) , как в случае с массивом szvehicle2. В нашем примере в функции scanf( ) применяется спецификация %s,означающая ввод строки. В результате функция пропустит ведущие пробельные литеры (символы пробела, табуляции и конца абзаца), после чего; запишет в массив последовательность символов вплоть до следующей пробельной литеры. В завершение к набору символов будет автоматически добавлен символ конца строки. Помните, что при объявлении массива следует указать такой размер, чтобы в массиве поместился весь вводимый текст вместе с символом \0.

Рассмотрим еще раз строку программы, в которой в массив szvehicle2 записывается информация:

scanf ( %s ,szvehicle2);

Не удивил ли вас тот факт, что имени szvehicle2 не предшествует оператор взятия адреса &? Это объясняется тем, что имя массива, в отличие от имен других переменных, уже является адресом первого его элемента.

Когда в функции printf ( ) задана спецификация %s, то предполагается наличие аргумента также в виде адреса строки. Строка текста будет выведена на экран полностью, за исключением завершающего нулевого символа.

Ниже показана программа на языке C++, аналогичная рассмотренной выше:

string. срр

Это версия предыдущей программы на языке C++.

#include <iostream.h> main () {

char szvehiclel [7], машина

szvehicle2 [8]; самолет

static char szvehicleS[8] = корабль ; корабль

szvehiclel[0] = м

szvehiclel[1] = a

szvehiclel[2] = ш

szvehiclel[3] = и

szvehiclel[4] = н

szvehiclel[5] = a

szvehiclel[6] = \0;

cout<< \n\n\tВведите слово --> самолет ;

cin >> szvehicle2;

cout << szvehiclel << \n ;

cout << szvehicle2 << \n ;



cout << szvehicleS << \n ; return(0);

При выполнении любой из приведенных программ на экран будет выведено следующее:

машина самолет корабль

Многомерные массивы

Под размерностью массива понимают число индексов, которые необходимо указать для получения доступа к отдельному элементу массива. Все массивы, рассмотренные до сих пор, были одномерными и требовали указания только одного индекса. Чтобы определить размерность массива, достаточно посмотреть на его объявление. Если в нем указана только одна пара квадратных скобок ([]), то перед нами одномерный массив, если две ([][]), то двухмерный, и т.д. Массивы с более чем одной размерностью называются многомерными. В реальных программах размерность массива не превышает трех.

В следующей программе создается двухмерный массив:

* 2darray.c

* Эта программа на языке С демонстрирует работу с двухмерным массивом.

#include <stdio.h> #define iROWS 4 #define iCOLUMNS 5 main() { int irow; int icolumn;

int istatus [iROWS] [iCOLUMNS] ;

int iadd;

int imultiple;

for (irow = 0; irow < iROWS; irow++)

for (icolumn = 0; icolumn < iCOLUMNS; icolumn++)

{ iadd = iCOLUMNS - icolumn; imultiple = irow; istatus [irow][icolumn]

(irow+1) *icolumn +

iadd*imultiple;

for(irow = 0; irow < iROWS; irow++)

{ printf( ТЕКУЩАЯ СТРОКА: %d\n , irow);

printf( CMEmEHME ОТ НАЧАЛА МАССИВА:\п );

for(icolumn = 0; icolumn < iCOLUMNS; icolumn++)

printf( %d , istatus[irow][icolumn]); printf( \n\n );

return(0);}

В программе используются два цикла for, в которых каждый элемент массива инициализируется значением смещения этого элемента относительно первой ячейки массива. Созданный массив имеет 4 строки (константа irows) и 5 столбцов (константа icolumns), что в сумме дает 20 элементов. Многомерные массивы представляются в памяти компьютера в виде линейной последовательности элементов, при этом группировка по индексам осуществляется справа налево, т.е. от самого правого индекса к самому левому.

Хотя процедура вычисления смещения может показаться несколько запутанной, получить доступ к любому элементу многомерного массива очень просто:

istatus[irow][icolumn] = ...



1 ... 44 45 46 [ 47 ] 48 49 50 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика