|
Программирование >> Процедурные приложения
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] = ...
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |