Вход

Массивы в С/С++

Реферат по программированию
Дата добавления: 06 сентября 2010
Язык реферата: Русский
Word, rtf, 394 кб (архив zip, 37 кб)
Реферат можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
МАССИВЫ в С/С++ Поэлементные операции 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