Название: Квантовая механика - Учеб. пособие. (Краснопевцев Е. А.)

Жанр: Информатика

Просмотров: 1190


2. задачи на одномерные массивы и примеры их выполнения в языке fortran

 

2.1. Заменить элементы вектора с, для которого аi = сi, на полусумму максимального и минимального положительных элементов вектора а.

Program M11

real:: a(5) = (/10.5,-1.,5.,0.5,6./), c(5) = (/1.,4.,5.,13.,6./)

where(a==c) c=(maxval(a,mask = a>0) +minval(a,mask=a>0))/2

print *,c

print*,a

end

2.2. Распечатать наибольшее число подряд расположенных положительных элементов вектора а. Затем заменить эти элементы на последний положительный элемент вектора.

Program M12

integer:: a(10) = (/1,-2,4,7,8,9,3,-4,6,-1/)

Npo l= 0; In = 0; Ik = 0; I = 1 ! Npol – число положительных

                                               элементов в последовательности

do while (I < = size(a))

  do while (a(i)< = 0.and.i < = size(a))

     i = i+1

  enddo

  k = 0  !  k –  текущее значение числа положительных эле-

                       ментов в последовательности

  do while (a(i) > = 0.and.i < = size(a))

     i = i+1; k = k+1

  enddo

            if(k>Npol) then

   Npol = k !  поиск максимального числа в последователь-

                      ности

  In =i-k  ! индекс начального элемента последовательности

  Ik = i-1  ! индекс конечного элемента последовательности

  endif

enddo

print *,a(In:Ik)  ! печать найденной последовательности из мак-

                            симального числа  а > 0

do i=1,size(a)

  if(a(i)>0) m=i  ! поиск индекса последнего положительного

                             элемента

enddo

a(In:Ik)=a(m)  !  присваивание элементам найденной  последо-

                           вательности значения последнего положитель-

                           тельного элемента

print *,a

end

2.3. Поменять местами два наибольших элемента вектора а; затем равные нулю элементы вектора заменить суммой его отрицательных элементов.

Program M13

integer:: a(6) = (/0,0,5,-6,7,-2/),i1(1),i2(1),t

i1 = maxloc(a) !  поиск индекса максимального элемента

                            вектора

i2=maxloc(a,mask=a<maxval(a))  !  поиск индекса второго

                                                   максимального элемента вектора

 ! обмен местами двух максимальных

 элементов вектора

 
t=a(i1(1))

a(i1(1))=a(i2(1))

a(i2(1))=t

print *,a

where(a==0) a=sum(a,mask = a < 0) ! замена нулевых элементов

                                                                суммой отрицательных

                                                                элементов

print *,a

end

 

2.4. Добавить четные положительные элементы вектора а в динамический вектор с, после чего заменить в нем нечетные элементы на сумму элементов вектора а, абсолютная величина которых больше пяти.

Program M14

integer:: a(6)=(/6,-8,7,1,12,10/), k, l=0

integer, allocatable:: c(:) ! объявление динамического массива с

k=count(mas = a > 0.and.mod(a,2)==0)  !  поиск количества чет-

                                    ных положительных элементов вектора а

allocate(c(k)) !        выделение вектору с реальной памяти

 

Заполнение вектора с четными  положительными элементами вектора а

 
do i=1,size(a)

  If(a(i)>0.and.mod(a(i),2)==0) then

  l=l+1

  c(l)=a(i)

  endif

enddo

print *,c

where(mod(a,2)/=0) a=sum(a, mask=abs(a)>5)  ! Замена нечетных

элементов суммой элементов, абсолютная величина которых > 5

 
print *,a

end

 

2.5. Составить логический массив-маску для нечетных отрицательных элементов вектора b. Распечатать его.

Program M15

integer:: b(8) = (/-11,6,-8,-9,4,2,-3,10/)

logical mask(8)

mask = b < 0.and.mod(b,2)/ = 0

print *,mask

end

2.6. Задать массив вещественных чисел с(-5:5). Подсчитать количество чисел в этом массиве, целая часть которых равна 5.

Program M16

real:: c(-5:5) = (/5.8,-5.2,9.1,1.3,8.3,5.1,5.,1.5,2.7,11.,10.5/)

k = count(mask = aint(c) ==5)

print *,k

end

2.7. Дан массив комплексных чисел с(-3:3). Найти сумму чисел, мнимая и реальная части которых равны друг другу.

Program M17

complex::

 c(-3:3) = (/(0.5,0.5),(1.,2.),(4.,4.),(7.,9.),(3.,3.),(1.,7.),(3.,9.)/), s = 0

do i = -3, 3

   if(real(c(i)) == aimag(c(i)))  s = s+c(i)

enddo

print *,s

end