4.4 Примеры решения задач с использованием одномерных массивов
Рассмотрим использование одномерных массивов на примере программы табулирования функции на отрезке [-2; 2] с шагом =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
Результат работы программы:
Введите начало промежутка 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.
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
При решении задач возникает ситуация, когда нужно произвести действия не со всеми элементами массива, а только с удовлетворяющими определенному условию.
Пусть требуется найти произведение элементов массива кратных пяти.
Если одно число кратно другому, э то значит что остаток от деления первого числа на второе равен 0. Например 10 кратно пяти или 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. Т.е. имеем 10515=750
Результат работы программы:
Vsego = 750
Условия могут накладываться не только на значения элемента, но и на значение индекса.
Есть два массива целых чисел a и b размером 5. Сформировать массив С такого же размера, в котором элементы с четными индексами равны соответствующим элементам массива A, а нечетные массива В. (как показано на рис. 4.3).
Рис. 4.3. Условие формирования элементов массива С
Четным называется значение кратное двум. То есть 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
Часто в решения задач сводятся к поиску наименьшего/наибольшего элемента в одномерном массиве.
Решаются такие задачи так же с помощью задания вспомогательной переменной. Делается предположение, что первый элемент массива является и максимальным и/или минимальным и его значение присваивается специально отведенным для этого переменным smax (для максимального элемента) и smin (для минимального элемента). Далее в цикле smin и smix сравниваются с текущим элементом. Если обнаруживается, что текущий элемент больше smax, то smax присваивается значение этого элемента. Если обнаруживается, что текущий элемент меньше smin, то smin присваивается значение этого элемента. Таким образом, после перебора всех элементов массива в переменных smin и smax окажутся искомые значения.
Program max_min
integer, parameter :: n=10
integer s(n)
integer :: i, smax, smin
s = (/10, 20, -19, 30, 2, 12, 14, 80, 90 100/)
write(*, “(100(i4))”), (s(i), i=1,n)
smax = s(1)
smin=s(1)
do i=1,n
if (s(i)<smin) smin=s(i)
if (s(i)<smax) smax=s(i)
enddo
write(*,100), “Maximum…”, smax
write(*,100), “Minimum…”, smin
100 format(a,i4)
end
Результат работы программы:
10 20 -19 30 2 12 14 80 90 100
Maximum… 100
Minimum… -19