Скачать 320.07 Kb.
|
ENDDO DX6. Массивы Массив – это именованный набор из конечного числа объектов одного типа . Массив обеспечивает доступ к некоторому множеству данных при помощи одного имени. Также имя массива используется для обеспечения доступа к элементу или группе элементов(сечению) массива. Массивы могут быть статическими и динамическими. Под статические массивы на этапе компиляции выделяется заданный объем памяти, которая занимается массивом во все время существования программы. Память под динамические массивы выделяется в процессе работы программы и при необходимости может быть изменена или освобождена. Массив характеризуется числом измерений (их может быть до семи), которое называется рангом. Число элементов всего массива называется его размером. Число элементов массива вдоль каждого измерения называется протяженностью(экстентом) массива вдоль измерения. Ранг и протяженность массива вдоль каждого измерения определяют форму массива. Каждое измерение массива может быть задано нижней и верхней границей, которые разделяются двоеточием. Если нижняя граница равна единице, то она, как правило, не указывается. Протяженность массива определяется по формуле: Протяженность = Верхняя граница – нижняя граница + 1 Пример: Real a(2,3), c(4:5,-1:1) описаны массивы а и с. Форма массива а (2,3) (протяженность первого измерения=2-1+1=2, протяженность второго измерения=3-1+1=3). Форма массива с (2,3) (протяженность первого измерения=5-4+1=2, протяженность второго измерения = 1-(-1)+1=3). Массивы а и с имеют одинаковую форму. Такие массивы называются согласованными. Объявление массивов Статические:
а) integer a(0:10); б) integer, parameter:: n=10, m=0 integer a(m:n). 2. С помощью Dimension а) integer, dimension(10):: a ! dimension как атрибут; а) integer a dimension a(10) ! dimension как оператор.
real, dimension(10):: a, b, b2(15), d(3,4) ! приоритет у явного описания формы Динамические:
а) real, pointer:: a(:), c(:), d(:) -! объявлены три одномерных масси- ва-ссылки a, c, d; б) integer, allocatable:: b(:,:) ! объявлен двумерный размещаемый массив b; в) real, allocatable, target:: t(:) ! объявлен размещаемый массив- адресат t.
integer, dimension(:,:):: ballocatable b. Для выделения реальной памяти под массивы-ссылки и размещаемые массивы применяется специальный оператор ALLOCATE. Примеры: а) real, pointer:: a(:) allocate(a(10)) ! прикрепление ссылки к области памяти в необходимом месте программы; б) real, pointer:: a(:) ! массив-ссылка real, target:: t(10) ! массив-адресат a => t ! массив-ссылка и массив-адресат должны быть одного типа и одно- го ранга; в) integer, dimension(6):: a=(/5,7,-10,8,-23,56/) integer, allocatable:: c(:) allocate(c(15)) ! выделение области памяти под массив с в необходимом месте программы allocate(c(size(a)) ! выделение памяти под массив с, равной размеру масси- ва а. allocate(c(count(mask=a>0)) – выделение памяти под массив с, равной коли- честву положительных элементов массива а. Для освобождения выделенной оператором ALLOCATE памяти используется оператор DEALLOCATE. Пример: integer, allocatable:: e(:) ! объявление размещаемого массив е real, pointer:: ra, b(:) ! объявление скаляра-ссылки ra и массива-ссылки b allocate(e(10), ra, b(20)) ! выделение памяти под массивы e и b и под скаляр ra ……………………….. deallocate(e, ra, b) ! освобождение динамической памяти Инициализация массивов Инициализацию массивов(задание начальных данных элементам массивов) можно осуществить несколькими способами. Инициализация одномерных массивов:
integer a(10)/1,2,3,4,5,1,7,2,12,9/
integer a(10) data a/1,2,3,4,5,1,7,2,12,9/
integer:: a(10)=(/ 1,2,3,4,5,1,7,2,12,9/) ! в конструкторе массива пробел между слешем и скобкой не допускается.
real b(5), a(5) b=sin(t) ! всем элементам массива b будет присвоено значения функции sin(t) a=2*(/3,3,4,4,6/) ! все элементы массива a, заданные с помо- щью конструктора массива, будут удвоены.
а) integer a(5) a = (/(i , i =1,5)/) встроенный Do – цикл ! элементы массива a получат значения i, равные 1,2,3,4,5 б) logical f1(10) f1=(/(.true.,k=1,5),(.false.,k=6,10)/) ! в конструкторе массива два встроенных цикла, массив f1 получит значения: T T T T T F F F F F Инициализация двумерных массивов:
integer b(2,3) data b/1,8,4,9,6,10/ ! значения вводятся по столбцам
integer b(2,3) / 1,8,4,9,6,10 / ! значения вводятся по столбцам
integer a(5,2),b(2,3),i,j a=reshape((/(2*i,i =2,11)/), shape=(/5,2/)) b=reshape((/1,3,5,7,8,10/),shape=(/2,3/)) ! в функции RESHAPE вначале задается конструктор массива, а затем из него формируется массив по форме массива shape. Размещение массивов в памяти Одномерный массив: Элементы массива занимают в памяти компьютера непрерывный, последовательный отрезок памяти. Пусть описан массив: integer:: a(10) = (/3,8,9,5,12,167,-4,6,-1,0/) Его элементы в памяти компьютера будут располагаться следующим образом: а
а(1) а(2) а(3) а(4) а(5) а(6) а(7) а(8) а(9) а(10) При этом а(i) - текущий элемент массива, где i - индексная переменная, может быть целым выражением, например, а(2*k), a(k+2*j). Двумерный массив: Память компьютера одномерная, поэтому элементы двумерного массива также занимают в памяти компьютера непрерывный, последовательный отрезок. В языке Фортран элементы двумерного массива упорядочены по столбцам. Пусть описан массив: real, dimension(2,3):: b /1.5,6.,7.1,-123.6,0.,1.78/ Такой массив можно представить в виде таблицы:
В памяти компьютера элементы этого массива будут располагаться в виде непрерывной последовательности по столбцам: b
b(1,1) b(2,1) b(1,2) b(2,2) b(1,3) b(2,3) При этом b(i,j) - текущий элемент массива, i, j - индексные переменные, которые могут быть выражениями целого типа. Причем i - номер строки, j - номер столбца. Элемент массива В общем виде обращение к элементу массива может быть представлено имя массива(список индексов) Пусть объявлены массивы: integer fac(20), d(3,4). Примерами обращений к элементам этих массивов могут быть: fac(15), fac(I+1), fac(2*I) - обращения к элементам массива fac; d(2,1), d(i+1, j*2), d(3, j-i) - обращения к элементам массива d. Сечение массива В FPS можно получить доступ не только к отдельному элементу массива, но и к некоторому подмножеству его элементов, которое называется сечением массива. Сечение массива может быть получено в результате применения индексного триплета или векторного индекса, которые при задании сечения подставляются вместо одного из индексов массива. Индексный триплет: Общий вид индексного триплета [нижняя граница]:[верхняя граница][:шаг] Каждый из параметров триплета является целочисленным выражением. Шаг может быть >0 и <0. Индексный триплет задает последовательность индексов, в которой первый элемент равен его нижней границе, а каждый последующий больше(меньше) предыдущего на величину шага. Примеры:
Его возможные сечения: а) d(5:15:5) - это сечение позволяет обратиться к элементам d(5), d(10), d(15); б) d(15:6:-3) - можно обратиться к элементам d(15), d(12), d(9), d(6); в) d(5::5) - то же, что и а), при этом верхняя граница опущена, по умолчанию , она принимается равной верхней границе экстента массива d; г) d(::5) - можно обратиться к элементам массива d(1), d(6), d(11), при этом нижняя и верхняя границы триплета опущены, по умолчанию они принимаются равными верхней и нижней границам экстента массива d; д) d(2:6:int(5/2)) - можно обратиться к элементам d(2), d(4), d(6), шаг при этом задан в виде целочисленного выражения; е) d(:) - обращение ко всем элементам массива d.
Примеры его возможных сечений: а) b(2:3,2:6:2) - для такого объявления доступны следующие элементы массива:
б) b(2, :) - обращение ко второй строке массива b; в) b(:,6) - обращение к шестому столбцу массива b; г) b(:,:) - обращение ко всем элементам массива b. Векторный индекс: Это одномерный целочисленный массив, содержащий значения индексов. Векторный индекс в отличие от индексного триплета позволяет извлечь в сечение массива произвольное подмножество элементов массива. Примеры:
integer vi(3),vj(2) ! объявление векторных индексов vi и vj vi=(/1,3,5/) ! инициализация вектора vi vj=(/2,5/) ! инициализация вектора vj a(vi)=1.5 ! инициированы элементы массива a(1), a(3), a(5) b(2,vj)=7 ! инициированы элементы массива b(2,2), b(2,5) b(vi,vj)=0 ! инициированы следующие элементы массива:
data a/5*3, 5*4,8*0/ ! инициализация массива a b=a(2,(/1,3,4,5,6/)) ! векторный индекс задан в виде конструктора масси- ва, в вектор b будут записаны элементы второй стро- ки массива a из столбцов с номерами 1,3,4,5,6. |
Курс посвящен изучению языка гипертекстовой разметки html. Рассматриваются основные конструкции языка, приемы разметки и связь с... | Назовите основные разделы науки о языке и единицы языка, изучаемые в этих разделах | ||
Данное пособие по английской разговорной речи содержит фразы, необходимые для общения в большинстве повседневных ситуаций. Предлагаемый... | Как связаны язык и общество? Как связаны язык и речь? Каковы основные уровни языка?Как отражаются в русском языке материальная и... | ||
Программа рассчитана на изучение французского языка по 2 часа в неделю 68 часов в учебном году | Художник учится смешивать краски и наносит мазок на холст. Музыкант учится этюдам. Журналист и писатель осваивают приемы письменной... | ||
Освоить основные приемы массажа, научиться использовать вспомогательные приемы массажа, освоить методику проведения массажа различных... | В результате освоения дисциплины студенты должны уметь осуществлять коммуникации на иностранном языке в профессиональной среде и... | ||
Цель работы: приобретение практических навыков работы в интегрированной среде C, изучение структуры программы на языке С | С обучением на венгерском языке. Данный вариант возможен даже для тех кто не знает венгерского языка, в данном случае наши специалисты... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |