* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
МАССИВЫ в С/С++
Поэлементные операции
1 . Одномерные (линейные) массивы
Линейным массивом в програ мме на C ++ называется упорядоченный набор однотипных переменных, которые располагаются в па мяти последов а тельно
Массив является простейшей структурой данных , облегчающей работ у с большими объемами инфо р мации путем их упорядочения. В случае с массивами, упорядочен ие происходит за счет индексир о вания эле ментов, то есть обращения к каждому из них по порядк о вому номеру. Показанный на рисунк е массив состоит из n элементов с индексами от 0 до n -1, в который з а писаны числа 5, 21, 0, 12 и т.д.
Любой массив в C ++ хар актеризуется тремя параметрами: именем , типом элементов и размером . Как и обычная пер е менная, пе ред использованием массив должен быть объявлен. О б щая форма записи объявления :
тип_элементов имя_массива[размер_массива];
Здесь тип_элементов – это любой из известных стандартных типов ( int , float , double , char и т.д .), имя_массива – уникальное им я (идентифик а тор), исполь зуемое для обращения к массиву, размер_массива – количество его элементов. В качестве последнего па раметра в объявлении может быть использована только целочисленная кон станта или ко н стантное выражение. Примеры объявлений
int A [15]; // массив из 15 целочисленных элементов с именем A
float x [3]; // массив x из 3-х элементов типа float
Объявление массива является командой компилятор у на в ы деление памяти дл я хранения его элементов. Общее количество выд е ленной памяти зависит не только от числа элемент ов, но и от ра з мера каждо го элемента, то есть от его типа. Например, текстовая строка из 1000 символов ( тип char ) займет P = 1000* sizeof ( char ) = 1000 байтов, а массив из такого же количества вещественных чисел двойной то ч ности (тип double ) займет уже в восемь раз больше – P = 1000* sizeof ( double ) = 8000 байтов.
Нумерация эле ментов в массиве начинается с нуля . Таким образом , первый элемент массива имеет инд екс 0, а последний – индекс n -1, где n – размер масси ва . Обращение к элементу произв о дится с использованием имени массива и индекса элемента в ква д ратных скобках . Наприме р , запись “ x [0] = 5.5;” означает “присв о ить значение 5.5 нулевому элементу массива x ”.
Для работы с массивами характерным явл яется использо вание итерационных ци к лов for . С их помощью организуется выполнение однотипных опе раций со всеми элементами массива , в частн ости , поэлементный ввод-вывод , поэлементные арифмет ические опер а ции и др . Рассмотрим это на следующем примере.
Пример 1. Напишите пр ограмму , запрашивающую у пользо вателя 10 целых чисел , и выводящую ее на экран их сумму .
Решение . Будем использовать массив с и менем A и размером 10 для хранения введенных чисел . Ввод данных и суммирование орган и зуем поэле ментно с помощью циклов for .
//- ---------- Сумма элементов массива -------------
# pragma hdrstop
# include < conio . h >
#include
#pragma argsused
int main(int argc, char* argv[])
int A [10]; // объявля ем массив из 10 целых
for(int i=0; i<10; i++) // орган изуем цикл по i от 0 до 9
cout << "input A[" << i << "] = "; // приглашение
cin >> A[i]; // вводим A[i]
int sum = 0; // объявляем переменную
for(int i=0; i<10; i++) // организуем цикл
sum = sum + A[i]; // в цикле суммируем эле менты
cout << "\ nSumma : " << sum ; // выводим результат на экран
getch (); // задерж ка
return 0;
//-------------------------------------------------
Наберите код этой программы в среде Turbo C ++ и запустите ее на выполнение. Проверьте правильность получаемых с ее по мощью результатов. Нарисуйте блок-схему и объясните алг о ритм ее работы. Объясните смысл ис пользования дополнительной пер е менной sum в этой программе.
2. Многомерные массивы
Массивы в программах C ++ могут быть не только линейными . Довольно частым является использование двух - (и более ) - мерных структур . К примеру , прямоугольная матр ица – типичная структ у ра , представимая с помощью двумерного массива ; а 3 D -тензор может быть з аписан как соответствующий трехмерный ма с сив.
Многомерный массив в C ++ организован по принципу «ма с сива массивов» . Общий формат его объявления
тип имя[ N 1][ N 2]…[ NM ];
Здесь M – число индексов (или размерность ) массива . Индексы и з меняются в пределах от 0 до N 1 – 1, от 0 до N 2 – 1, от 0 до N 3 – 1, ..., от 0 до NM – 1, соотве т ственно .
К примеру , з а пись int G [5][4]; означает объявление двумерного массива целых чисел с именем G и размерами 5 4. На рис . справа такой массив пре д ст авлен в виде таблицы . Здесь первый индекс является номером строки , вт о рой – но мером столбца таблицы , с диапазонами изме нения от 0 до 4, и от 0 до 3, соответстве н но.
Доступ к элементам многомерного массива в программе производится так же , как и в одномерном случае , то есть путем ук аз а ния имени массива и набора индексов в квад ратных скобках . Н а пример , операция присваивания з начения 0 последнему элементу будет зап и сана как G [4][3] = 0.
При работе с многомерными массивами уд обно использовать вложенные циклы for . С их помощью можно выполнить заданное действие с каждым из элементов массива путем перебора всех зн а чений индексов . Приведенный ниже фрагмент программного кода в ы водит на экран все элементы массива G .
for(int i=0; i<5; i++) // цикл по строкам i
for ( int j =0; j <4; j ++) // цикл по стр окам j
cout << G[i][j] << “\ t” ; // выводим G[i][j]
cout << endl ; // перевод на новую строку
Алгоритм работы этого фрагмента иллюстрируется с ледующей блок-схемой
Здесь внешний цикл по I последовательно пробег а ет все значения от 0 до 5. При к аждом i запускается внутре н ний цикл по j от 0 до 4. В теле этого цик ла на э к ран выводятся зн ачение элемента G [ i ][ j ] и знак табуляции (горизонтал ьный отступ). Внутренний цикл продолжается до тех пор, пока не будут п е ребраны все значения j , то есть не будет вывед ена вся i -я строка. По завершении внутреннего цикла, экранный курсор перемещается на н о вую строку манипулятором endl , и далее внешний цикл п родолжает свою работу, последов а тельно выводя на экран другие строки массива.
Пример 2. Имеется вещественная квадратная матрица размером 4 4. Напишите программу , вы числяющую произведение элементов в каждой ее строке . Матрица вводится с кл а виатуры.
Реш ение . Условимся использовать для хранения мат рицы массив float X [4][4]. Расчет произведения реализуем с огласно сл е дующему алгоритму . Введем вспомогательную переменную (к примеру , float P ). Заметим , что в i -й с тр о ке расположены элементы X [ i ][ j ], где j меняется от 0 до 3, включите льно . Организуем цикл по j , внутри к о торого будем домножать P на X [ i ][ j ]. Тогда на выходе из цикла P бу дет содержать искомое произведение . Выведем его на экран и продолжим расчеты для следующей строки . Для правил ь ной работы алгоритма перед началом расчетов в каждой строке матрицы необходимо присвоить P зн а чение 1.
//-------- Произведение элементов строки ----------
# pragma hdrstop
# include < conio . h >
#include
#pragma argsused
int main(int argc, char* argv[])
float X[4][4]; // объявляем массив 4 4
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
cout << "input X[" << i <<
"," << j << "] = ";
cin >> X [ i ][ j ]; // вводим элементы матрицы
cout << "\n Results:\n";
for(int i=0; i<4; i++) // цикл по стро кам
float P = 1.0; // вспомогательная переменная
for ( int j =0; j <4; j ++) // цикл по элементам в строке
P = P * X[i][j]; // домножаем P на X[i][j]
cout << "\n proizvedenie " << i
<< "-i stroki = " << P; // выводим результат на экра н
getch ();
return 0;
//-------------------------------------------------
Наберите и откомпилируйте код этой программы в Turbo C ++. Проверьте результаты, выдав аемые программой.
3. Типизиров анные константы
В рассмотренном выше примере текст программы сод ержит явные выражения, задающие размеры массива X . Он объявлен как float X [4][4], то есть с явным указанием р азмерности, и далее везде по ходу программы цифра 4 и с пользуется явно при записи цикло в for .
Такая техника программирования является допустимой и даже часто испол ьзуемой, однако создает некоторые трудности в плане масштабируемости программы. В данном случае под масштабируемой мы будем понимать программу, которая может бы ть легко перестроена для работы с массивами других размеров. В рассмотре нном выше примере при изменении размера массива X нам пр и дется просмотреть весь код прогр аммы, заменяя 4 на другое целое число.
Этого можно избежать, если ввести типизированные ко н станты , которые будут использоваться для указания размеров массив а. Так же, как и переменная, типизированная константа имеет уникальное им я и тип, однако ее значение не может быть изм е нено по ходу выполнения программы. Это дает право и спользовать ее в объявлении ма с сива.
Типизированная константа должна быть объявлена с ключ е вым словом const , вслед за которым указывает ся ее тип ( int , float , double , char , и т.д.), далее, через пробел, – ее имя и инициализирующее в ы ражение
const тип имя = выражени е;
Например, запись const int N = 4; означает объявление целочи с ленной константы с именем N и значением 4. В рассмотренном выше примере N могла быть использована как при объявлении ма с сива float X [ N ][ N ], так и в езде далее вместо 4. Такая программа будет легко масштабируемой в силу то го, что в ней достаточно изменить зн а чение N работы с массивами других размеров.
Типизированная константа может быть объявлена в любом месте программы до момента своего первого использования. Одн а ко хорошим стилем считается объявление всех конст ант в самом начале программного файла, после подключения библиотек дире к тивами # include .
4. Инициализация элементов массива
В рассмотренных выше примерах начальные значения эл е ментов массива зада вались пользователем с клавиатуры. Можно поступить иначе и каждому из эл ементов присвоить начальное зн а чение с помощью оператора «=». Это потребует довольно большог о количества записей – по отдельному оператору для каждого из эл е ментов. C ++ дает программисту еще один, б олее удобный, способ. Массив может быть инициализ ирован при объявлении . Для этого в строке об ъ явления сразу вслед за указан ием типа элементов, имени массива и его размеров, зап и сывается знак присваивания, и дал ее в фигурных скобках задаются значения элементов через запятую
тип имя[размер N ] = знач1, знач2, знач3, ..., знач N ;
Запись означает, что сразу после размещения массив а в операти в ной памяти к аждому из элементов должно быть присвоено соотве т ствующее значение из списка. Если список значений в фигурных скобках короче, чем размер массива, то оставш иеся элементы будут ин и циализированы значением по умолчанию, то есть обнулены.
В следующем примере
float mark [5] = 7.3, 4.0, 2.2, 12.1, 8.9 ;
создается м ассив с именем mark , состоящий из 5 чисел типа float , которые инициализируются значениями 7.3, 4.0, 2.2 и т.д. Эт о экв и валентно следующ ему набору операторов
float mark[5]; mark[0]=7.3; mark[1]=4.0; mark[2]=2.2 и т . д .
Многомерный массив также может быть инициализиро ван в строке объявления. Для этого достаточно помнить о том, что многомер ный массив в C ++ – это «массив массивов», о чем уже гов о рилось выше. Пример
int F [3][3] = 3, 0, 2 , (1, 9, 8 , 5, 7, 4 ;
Здесь создает ся двумерный массив с именем F и разме рами 3 3, эл ементы которого получают начальны е значения F [0][0] = 3, F [0][1] = 0, F [0][2] = 2, F [1][0] = 1 и т.д .
Пример 3. Пусть и – две квадратные матрицы размером 3 3. Требуетс я написать программу , ра ссчитывающую их произв е дение
Решение. Искомое произведение – это также мат рица 3 3, эл ементы которой рассчитываются по формуле ( ). Аналогично Пример у 1, организуем суммирование с помощью всп о могательной переменной s и цикла по k . Для перебора всех и с пользуем два дополнительных вло женных друг в друга цикла по i и по j . Эт и циклы будут внешними по отношению к ци к лу по k .
//-------------- Перемножение матриц --------------
#pragma hdrstop
#include
#include
#pragma argsused
const int N = 3; // используем константу N=3
int main(int argc, char* argv[])
float A[N][N] = 1, 1, 1 ,
2, 2, 2 ,
3, 3, 3 ; // исходная матрица A
float B[N][N] = 1, 2, 3 ,
1, 2, 3 ,
1, 2, 3 ; // исходная матрица B
float C [ N ][ N ]; // матрица произведения С
for(int i=0; i