Farionova_Fortran
.pdfТема3. Базоваяуправляющаяконструкция"цикл" ...
жить условие на элемент ряда, нужно определить зависимость, покоторой он вычисляется. Очевидно, что в данном случае элемент равен
1 |
|
, где k – номер элемента в ряде. Если воспользоваться циклом |
||||
|
|
|
||||
|
k 2 + 1 |
|
|
|
||
do |
while, то условие выхода из цикла будет |
1 |
|
> 0,001. В теле |
||
k 2 + 1 |
|
цикла производятся суммирование элементов и подсчет порядкового номерасуммируемогоэлемента, равногоколичеству повторенийцикла:
Program |
row_summa |
|
Integer |
:: k=1 |
! номер элемента ряда |
Real :: |
sum=0, |
slag |
!sum -сумма ряда
!slag – значение текущего єлемента
Slag=1.0/(k*k+1) ! первый элемент ряда
Do while (slag > 0.001) ! проверка условия выхо-
да из цикла
Sum = sum + slag ! накапливаем сумму
K = k+1 ! считаем номер следующего элемента
ряда
Slag = 1.0/(k*k+1) ! вычисляем значение следующего элемента ряда
enddo
print '(a, f9.6)', 'summa=', sum
print '(a, i4)', 'kol-vo elementov=', k
print '(a, f9.6)', 'poslednee slagaemoe=', slag end
Последовательно, начиная с k = 1 вычисляется и проверяется каждый элемент ряда. Если элемент больше значения 0,001, то он добавляется в переменную sum. Если нет, то происходит выход из цикла и в переменной sum будет находиться искомая сумма.
Результат:
Summa = 1.044941 kol-vo elementov= 32
poslednee slagaemoe= 0.000976
32
Тема 4. Работа с массивами
4.1. Определение массива и его характеристик
Все данные (константы или переменные), которые были рассмотрены в предыдущих темах для реализации вычислительных процессов решения задач, назывались простыми или скалярными. Любая константа или переменная скалярного типа может принимать одно единственное значение, которое хранится в ячейке памяти с ее именем.
Этобывает неочень удобно, когда взадачах приходится иметьдело
снабором однотипных величин. В таком случае в практике программированияпринятоиспользоватьсоставные, илиструктурные, типыданных, к которым относятся массивы. Массив можно представить как "большую" переменную, состоящуюизнесколькихячеек. Ячейкиназываются элементами массива. Каждый элемент имеет одинаковый тип, но может хранить разные значения. Все элементы имеют одно имя – имя массива, но отличаются номерами.
Массив – это сложная структура данных, которая имеет одно имя, состоит из последовательности конечного количества однородных скалярныхэлементов, каждыйэлементимеетсвойуникальныйпорядковый номер в массиве.
Схематично массив Х (рис. 4.1) можно изобразить как последовательность элементов, каждый из которых имеет имя, совпадающее
сименем массива, и порядковый номер (индекс), определяющий положение элемента по отношению к началу массива.
|
|
|
|
|
|
|
|
|
х(1) |
х(2) |
х(3) |
х(4) |
х(5) |
х(6) |
х(7) |
х(8) |
х(9) |
Рис. 4.1. РасположениеэлементовмассивавпамятиЭВМ
Индексами массива могут быть только целые числа. Все элементы массива должны иметь одинаковый тип данных.
Характеристики массива:
1)имя массива;
2)тип массива;
3)число измерений (ранг) массива – допускается от 1 до 7;
33
Тема4. Работасмассивами
4)размерность (протяженность) – неотрицательное число, указывающеенаколичествовозможныхзначенийиндексаповыбранномуизмерению, например число строк или столбцов матрицы;
5)диапазон значений индекса – задается указанием нижней и верхнейгранициндекса; когданижняяграницаопущена, верхняяграницасовпадает с размерностью;
6)форма массива – это перечисление или вектор всех размерностей, характеризующий порядок размещения элементов в памяти;
7)число элементов – это произведение размерностей массива;
8)объем памяти, занимаемой массивом, равен памяти, приходящейся на один элемент, помноженной на число элементов; ограничивается лишь объемом доступной памяти компьютера.
Память под массив выделяется несколькими способами: статически, динамически, динамически автоматически – массив с переменной размерностью в подпрограмме.
Для статического массива все характеристики известны уже при компиляции. Память под статический массив рассчитывается по описанию массива и выделяется при запуске программы.
Для динамического [allocatable] массива при запуске программы известен только ранг, а размерности не известны и память под него не выделяется. Когда размерности станут известны, будет подсчитан
ивыделеннеобходимыйобъемпамятиприисполненииспециальногоопе-
ратора allocate.
Массив с переменной размерностью спрятан в процедуре, где для него допускается вместо констант указывать размерность переменной целого типа. Память под массив известна или не известна, но она выделяется в вызывающей программе, массив передается в подпрограмму
вкачестве параметра вместе со своими размерностями, что создает возможность перераспределения памяти.
Будем рассматривать только статические массивы. Массив может иметь нулевой размер.
4.2. Описание массива
Все массивы в программе должны быть объявлены, и размерность определяется в объявлении (описании). При описании массива необходимоуказатьеготип, размерностьидиапазонизмененияиндексов. Раз-
34
4.2. Описание массива
мерность массива – это количество измерений. Бывают одномерные (векторы), двухмерные (матрицы или таблицы) и многомерные массивы. Элементы массива имеют те же типы, что и обычные переменные. Описание массива имеет вид
name(d1,d2,...,dn),
где name – имя массива; d1,d2,...,dn – диапазон изменения индексов; n – размерность массива. При этом di имеют вид (n1:n2) (n1 – нижняя, а n2 – верхняя границы изменения индексов). Размерность массива n не может превышать 7. В случае, если n1 равно 1, т. е. нумерацияэлементовмассиваначинаетсяс1, применяетсяупрощенная форма задания di – (n), где n – количество переменных в массиве.
Примеры
1. Описание массива на рис. 4.1 можно представить следующим образом:
real x(9)
или
real, dimension (9):: х
Это означает, что создан массив с именем Х, элементы которого вещественного типа и нумеруются от 1 до 9.
2. Real a(0:100),b(3,3),c(-2:4)
Описываются три действительных массива: a, b и c.
В массиве a число элементов 101: a0, a1, ..., a100. Массив b является
матрицей, состоящейиз9 элементов: b1,1, b2,1, b3,1, b1,2, b2,2, b3,2, b1,3, b2,3, b3,3. В памяти двухмерные массивы хранятся по столбцам. Массив c
состоит из семи элементов: c–2, c–1, c0, c1, c2, c3, c4.
Обращение к элементу массива производится по имени массива, за которым следуют в круглых скобках индексы, разделенные запятыми.
Например:
X(1)=5
Нужно различать индекс элемента массива и значение элемента массива. В примере индекс элемента 1, а значение элемента 5.
K=4
X(k) = 7 ! Четвертому элементу массива присвоено значение 7.
35
Тема4. Работасмассивами
Массив может иметь нулевой размер, если при объявлении первый индекспревосходитпоследний.
При описании размер массива рекомендуется задавать в виде констант, что в дальнейшем даст возможность использовать циклы для обработки элементов:
Integer, parameter :: n=9
Real, dimension (1:n):: x,y
4.3. Одномерные массивы
Примером одномерного массива может служить шеренга солдат, которые упорядочены по росту; кроме того, у каждого солдата в шеренге есть свой порядковый номер в расчете. В математике примером одномерного массива может служить вектор Х = {x1, x2, ..., xn}. Здесь Х – имя массива; xі – компоненты (элементы) массива, і = 1, 2, …, п – индексы или номера элементов массива. Значение индексного множества одномерного массива равно 1.
Конструктор массива служит для его инициализации, т. е. присваиваниязначенийвмоментописания:
INTEGER:: a(7)=(/1,2,3,4,5,6,7/)
Схематично целочисленный массив А представлен на рис. 4.2.
1 |
5 |
2 |
3 |
4 |
8 |
7 |
а(1) |
а(2) |
а(3) |
а(4) |
а(5) |
а(6) |
а(7) |
Рис. 4.2. РасположениеэлементовмассиваАвпамятиЭВМ
Так как индексы массива следуют по порядку, то при работе с ними удобно использовать циклы, особенно цикл с параметром, где параметр цикла можно использовать в качестве обозначения индекса элемента массива.
Ввод/вывод одномерного массива
Ввод/вывод элементов одномерного массива можно осуществлять, как показано в табл. 4.1.
Полный массив – имя переменной (или именованная константа), которая является массивом. Появление полного массива в выполняе-
36
4.3. Одномерныемассивы
мом операторе специфицирует выполнение операции со всеми элементами массива.
Например:
Integer a(5) |
|
||
A=7 |
! всем элементам массива присваивается 7 |
||
A=a-2 ! всем элементам массива присваивается 5 |
|||
Таблица4.1. Способыввода/выводаэлементоводномерногомассива |
|||
|
|
|
|
Фрагмент программы |
Описание способа |
||
ввода/вывода массива |
|||
|
|
||
read *,a |
|
Ввод всех элементов массива с клавиату- |
|
|
|
ры (согласно его описанию) |
|
read*,(a(i),i=1,n) |
Ввод элементов массива с клавиатуры с но- |
||
|
|
мерами 1, …, n с неявным использова- |
|
|
|
нием циклического списка |
|
do i=1,n |
|
Ввод элементов массива с клавиатуры |
|
read*,a(i) |
с использованием циклической структу- |
||
end do |
|
ры |
|
do i=1,n |
|
Ввод элементов массива с использовани- |
|
а(i)=5*i**2-i |
ем циклической структуры по расчетной |
||
end do |
|
формуле |
|
a(1)=2 |
|
Ввод элементов массива с помощью опе- |
|
a(4)=6 |
|
ратора присваивания (наименее эффек- |
|
a(2)=-3 |
|
тивный способ) |
|
print *,a |
|
Вывод всех элементов массива (согласно |
|
|
|
его описанию) |
|
write(*,*),(a(i),i=1,n) |
Вывод элементов массива с номерами |
||
|
|
1 … n с неявным использованием цикли- |
|
|
|
ческого списка |
|
write(*,’(100(f5.2))’), |
Форматный вывод элементов массива |
||
(a(i),i=1,n) |
с номерами 1 … n с неявным использова- |
||
|
|
нием циклического списка n< = 100 |
|
1. do i=1,n |
Вывод значений элементов массива с но- |
||
print*,a(i) |
мерами 1 … n |
||
end do |
|
|
|
1. do i=1,n !. |
Форматный вывод элементов с указани- |
||
print ’(a,i2,a,f5.2)’, |
ем номера выводимого элемента и его |
||
’a(’,I,’)=’,a(i) |
значения |
||
end do |
|
|
37
Тема4. Работасмассивами
4.4. Примеры решения задач с использованием одномерных массивов
Рассмотрим использование одномерных массивов на примере программытабулированияфункции y = x наотрезке[–2; 2] сшагомh = 0,5:
Program tab
Integer, parameter :: k=100 Real, dimension(1:k):: x, y real h, a, b
integer i,n
Write(*,'(a,$)'),'Введите начало промежутка a=' Read(*,*),a
Write(*,'(a,$)'),'Введите конец промежутка b=' Read(*,*),b
Write(*,'(a,$)'),'Введите шаг h=' Read(*,*),h
X(1)=a
n= (b-a)/h+1 do i=1, n
If (x(i)>=0) then Y(i)=sqrt(x(i))
Write(*,'(a,i1,a,f5.2,a,i1,a,f4.2)'),'x(',I,')=',x(i),'
y(',I,')=',y(i) Else
Write(*,'(a,i1,a,f5.2,a)'),'x(',I,')=',x(i),' Y
не существует' X(i)=x(i)+h; Endif
enddo read*
End Program tab
38
4.4. Примеры решения задач с использованием одномерных массивов
Результат работы программы:
Введите начало промежутка a=-2 Введите начало промежутка b=2 Введите шаг h=0.5
X(1)=-2.00 Y не существует
X(2)=-1.50 Y не существует
X(3)=-1.00 Y не существует
X(4)=-0.50 Y не существует
X(5)= 0.00 y(5)=0.00 X(6)= 0.50 y(6)=0.71 X(7)= 1.00 y(7)=1.00 X(8)= 1.50 y(8)=1.22 X(9)= 2.00 y(9)=1.41
Часто решаемые задачи с массивами – нахождение суммы или произведения элементов массива. Особенностью таких расчетов является то, что вводятся специальные переменные:
•сумматор (в случае нахождения суммы элементов массива), где
инакапливается сумма, первоначально сумматор обнуляется:
Program summa_massiva
INTEGER:: a(7)=(/1,2,3,4,5,6,7/) Integer k, s
S=0 ! переменная накапливающая сумму
Do k=1,7 S=s+a(k)
Enddo
Print '(a,i2)', 'Vsego = ', s read*
End Program summa_massiva
Результат работы программы:
Vsego =28
• накопитель произведения (в случае нахождения произведения элементовмассива), первоначальноезначениекоторогопринимаетсяравным1:
39
Тема4. Работасмассивами
Program proizv_massiva
INTEGER:: a(7)=(/1,2,3,4,5,6,7/) Integer k, p
p=1 ! переменная накапливающая произведение
Do k=1,7 p=p*a(k) Enddo
Print '(a,i5)', 'Vsego = ', p read*
End Program proizv_massiva
Результат работы программы:
Vsego = 5040
Прирешениизадачвозникаетситуация, когданужновыполнитьдействия не со всеми элементами массива, а только с удовлетворяющими определенномуусловию.
Пусть требуется найти произведение элементов массива, кратных 5. Еслиодночислократнодругому, это значит, чтоостатокотделения первогочисланавтороеравен0. Например, 10 кратно5 илиmod(10, 5) =
= 0:
Program proizv_kratnost
INTEGER:: a(7)=(/1,10,3,4,5,6,15/) Integer k, p
p=1 ! переменная, накапливающая произведение
Do k=1,7
If (mod(a(k),5)==0) then
p=p*a(k) ! произведение выполняется, только если !условие истинно
endif Enddo
Print '(a,i5)', 'Vsego = ', p read*
End Program proizv_kratnost
Среди значений массива есть только три числа, удовлетворяющих этомуусловию: a(2) = 10, a(5) = 5, a(7) = 15, т. е. имеем10 × 5 × 15 = 750.
Результат работы программы:
Vsego = 750
40
4.4. Примеры решения задач с использованием одномерных массивов
Условия могут накладываться не только на значение элемента, но и на значение индекса.
Есть два массива целых чисел a и b размером 5. Сформировать массив С такого же размера, в котором элементы с четными индексами равны соответствующим элементам массива a, а нечетные – массива b (как показано на рис. 4.3).
а(1) |
а(2) |
а(3) |
а(4) |
а(5) |
↓ |
|
↓ |
|
↓ |
|
|
|
|
|
с(1) |
с(2) |
с(3) |
с(4) |
с(5) |
|
↑ |
|
↑ |
|
|
|
|
|
|
b(1) |
b(2) |
b(3) |
b(4) |
b(5) |
Рис. 4.3. УсловиеформированияэлементовмассиваС
Четным называется значение, кратное 2, т. е. mod(число, 2)= =0, и нечетным, если mod(число, 2)= =1.
Представим программную реализацию формирования массива С:
Program massivС
Integer, parameter :: k=5
INTEGER:: a(k)=(/1,2,3,4,5/), b(k)=(/6,7,8,9,10/) Integer c(k)
Integer I Do i=1,K
If (mod(I,2)==0) then C(i)=b(i)
Else C(i)=a(i) Endif Enddo
Print *, 'Elementi massiva C: ', c read*
End Program massivС
Результат работы программы:
Elementi massiva C 1 7 3 9 5
41