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

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

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


3. примеры задач и их программное решение в языке фортран

 

3.1. Рассчитать перепад температуры DJ в пазовой изоляции электрической машины при изменении теплового потока Q от

100 Вт до 500 Вт с постоянным приращением по 50 Вт для двух типов изоляции с коэффициентами теплопроводности  и . Толщина изоляции . Поверхность охлаждения . Перепад определять по формуле DJ =

= .

а) цикл с “параметром”                              б) цикл “пока”

program P5_1

real:: L1=0.2, L2=0.1, s=20., biz=0.5e-3

Q=100

do while (Q<=500)

  DT1=Q*biz/(L1*s)

  Dt2=Q*biz/(L2*s)

  print *,'Q=',Q,' DT1=',DT1,

' DT2=',DT2

  Q=Q+50

enddo

end

 
 

program P5_1

real:: L1=0.2, L2=0.1, s=20.,

 biz=0.5e-3

do Q=100,500,50

  DT1=Q*biz/(L1*s)

  Dt2=Q*biz/(L2*s)

  print *,'Q=',Q,' DT1=',DT1,

' DT2=',DT2

enddo

end

 

3.2. Дано действительное число а. Найти среди чисел  первое, большее а. Применим бесконечный цикл.

Program P5_2

real:: a=10, s=1, i=2

do

  s=s+1./i

  if(s>a) exit

  i=i+1

enddo                                                              

Print *,'pervoe chislo > a =',s                        

end

                                            

3.3. Дана символьная строка. Получить все символы, расположенные между первым и вторым двоеточием.

 

а) цикл с “параметром”                         б) цикл “пока”

program P5_3

character(25):: st='Ivanov:Pavel:Ivanovich'

i=1

do while (i<=len_trim(st))

  if(st(i:i)==':') then

    k=i

    exit

  endif

  i=i+1

enddo

i=k+1

do while(i<len_trim(st))

  if(st(i:i)==':') then

    l=i

   exit

  endif

  i=i+1

enddo

print *,st((k+1):(l-1))

end

 
 

program P5_3

character(25):: st ='Ivanov: &

Pavel:Ivanovich'

do i=1,len_trim(st)

  if(st(i:i)==':') then

    k=i

   exit

  endif

enddo

do i=k+1, len_trim(st)

  if(st(i:i)==':') then

  l=i

  exit

  endif

enddo

print *,st((k+1):(l-1))

end

 

3.4. Вычислить значение функции как сумму членов ряда с точностью .

Функция: . Ее ряд:

… + . Значение суммы ряда и значение cos(x) должны совпасть. Использовать бесконечный цикл.

Вычисление провести для двух случаев: а)  

б)

 

а)                                                                    б)

program P5_4

real:: E=1.E-6,t

do x=0.5,5,0.5

  y=1; f=1; i=1

  do

    f=f*(2*i)*(2*i-1)

    t=(-1)**i*x**(2*i)/f

    if(abs(t)<E) exit     y=y+t

    i=i+1

   enddo

print *,'cos(x)=',cos(x),' y =',y

enddo

end

 
 

program P5_4 

    real:: E=1.E-6, y=1, x=6.5 &

,f=1,i=1,t

    do

      f=f*(2*i)*(2*i-1)

      t=(-1)**i*x**(2*i)/f

      if(abs(t)<E) exit

      y=y+t

      i=i+1

    enddo

   print *,'cos(x)=',cos(x),'  y=',y

   end

 

3.5. Пусть Найти первый член хk, для которого .

 

а) бесконечный цикл                                   б) цикл “пока”

 

program P5_5

real:: x0=1, xk=0.2, E=1.e-5, &

 i = 1

do while (abs(xk-x0)>E)

    x0 = xk

    xk = (2-x0**3)/5

    i = i+1

enddo

print *, 'x0 =', x0, '  xk =',xk

end

 
program P5_5

real:: x0=1, xk=0.2, E=1.e-5, i=1

do

  if(abs(xk-x0)<E) then

    print *, 'x0 =', x0, '  xk =',xk

    exit

  else

    x0 = xk

    xk = (2-x0**3)/5

  endif

i = i+1

enddo

end

 

5. Задания к лабораторной работе № 5

 

Варианты заданий

1

1.1. Рассчитать зависимость давления H на выходе из вентилятора при изменении количества воздуха V, продуваемого через электрическую машину с аэродинамическим сопротивлением . Диапазон изменения . Шаг при расчете

1.2. Пусть . Найти первый член , для которого .

1.3. Дано натуральное число n. Вычислить:

1.4. Вычислить значение функции как сумму членов ряда с точностью . Функция: . Ee ряд:

.

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = 0,5, затем для x = 0,2¸0,6 с шагом hx = 0,2.

 

2

2.1. Цилиндр объема имеет высоту h. Определить радиус основания цилиндра для значения h, равных 0,5; 1; 1,5; …; 5.

2.2. Дано действительное число x. Вычислить

.

2.3. Дана строка символов, подсчитать, сколько раз среди данных символов встречается символ “+” и символ “0”.

2.4. Вычислить значение функции как сумму членов ряда с точностью  Функция: . Ee ряд:

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x =, затем для x = 0¸ с шагом hx = .

 

Продолжение таблицы

 

Варианты заданий

3

3.1. Рассчитать зависимость мощности, потребляемой электродвигателем из сети , механической мощности , КПД  от силы тока I. Диапазон изменения тока . Шаг при расчете  Напряжение сети . Сопротивление якорной цепи

3.2. Дано натуральное число n. Вычислить

.

3.3. Дана символьная строка. Получить первый номер символа, для которого два подряд идущих символа совпадают с буквой “а”.

3.4. Вычислить значение функции как сумму членов ряда с точностью  Функция: . Ee ряд:

.

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = 0,5, затем для x = 0,2¸0,6 с шагом hx = 0,2.

4

4.1. Рассчитать ток I, протекающий через сопротивление R, при изменении приложенного напряжения U от 120 до 240 В с шагом 20 В для двух значений сопротивлений R = 18 Ом и R = 30 Ом.

4.2. Дано натуральное число n. Вычислить .

4.3. Дана символьная строка. Исключить из нее три подряд идущих символа “a”.

4.4. Вычислить значение функции как сумму членов ряда с точностью  Функция:  Ee ряд:

.

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = 2, затем для x =3¸9 с шагом hx = 3.

Продолжение таблицы

Варианты заданий

5

5.1. Материальная точка совершает гармонические колебания с частотой  Амплитуда колебаний  Начальная фаза = p/12. Опре-делить и напечатать величину смещения в момент времени t = 1, 3, 5,…, 29. Величина смещения определяется уравнением ,

где .

5.2. Дано натуральное n, действительное x. Вычислить:

.

5.3. Преобразовать символьную строку, заменяя всякое вхождение слова “yes” на слово “no”.

5.4. Вычислить значение функции как сумму членов ряда с точностью . Функция: . Ee ряд:

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = , затем для x =¸ с шагом hx = .

6

6.1. Рассчитать магнитную индукцию В, создаваемую током  протекающим по бесконечно длинному прямолинейному проводу. Радиус поперечного сечения провода  Удельная магнитная проницаемость: воздуха  материала провода – . Магнитная индукция: внутри проводника ; вне проводника . Диапазон изменения  Шаг при расчете:

6.2. Дано натуральное число n. Вычислить:

.

6.3. Пусть  . Дано действительное e > 0. Найти первый член  для которого выполнено .

6.4. Вычислить значение функции как сумму членов ряда с точностью . Функция:  Ee ряд:

.

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = 3, затем для  x = 4¸8 с шагом hx = 2.

Продолжение таблицы

Варианты заданий

7

7.1. Найти площадь фигуры, ограниченной линиями

 как сумму элементарных прямоугольников, разбив интер-вал значений x на 10 частей.

7.2. Даны действительные числа a, b, натуральное число n (b > a). Получить

7.3. Дано натуральное число n, действительные числа a, b (a ¹ b). Получить .

7.4. Вычислить значение функции как сумму членов ряда с точностью . Функция: . Ee ряд:

.

Результат суммы сравнить с результатом библиотечной функции. Расчет провести для одного x = 2,5, затем для x = 3¸5 с шагом hx = 0,5.

 

8

8.1. Рассчитать приближенно кинетическую энергию стержня длиной 1,5 м и массой 3,3 кг, который вращается с угловой скоростью w = 0,25 рад/сек вокруг радиальной оси, проходящей через один из его концов. Для расчета разбить стержень на 50 равных отрезков.

8.2. Дано натуральное число n. Вычислить:

8.3. Вычислить значение функции  для значений

8.4. Дано действительное число а. Вычислить сумму ряда с точностью  Ряд: . Расчет провести для а = 4, затем для а = 5¸10,  шаг ha = 2.

 

Окончание таблицы

Варианты заданий

9

9.1. Рассчитать силы взаимодействия двух электрических зарядов в зависимости от расстояния между ними    

9.2. Найти сумму первых n членов ряда

.

9.3. В символьной строке исключить из последовательности символов группы символов, расположенных между скобками (, +). Сами скобки тоже должны быть исключены.

9.4. Вычислить .

10

10.1. Рассчитать ток I, протекающий через сопротивление R, изме-няющееся от 18 до 30 Ом с шагом 4 Ом для двух значений приложенного напряжения U = 120 В и U = 270 В.

10.2. Пусть

                         

Получить

10.3. Дано натуральное число n. Вычислить

.

10.4. Вычислить значение функции  до тех пор пока

Сначала принять x = 1,5, затем x = 2¸6 c шагом hx = 0,5.

 

 

 

Массивы

 

Массив – это именованный набор из конечного числа объектов одного типа. Массив обеспечивает доступ к некоторому множеству данных при помощи одного имени. Также имя массива используется для обеспечения доступа к элементу или группе элементов (сечению) массива.

Массивы могут быть статическими и динамическими. Под статические массивы на этапе компиляции выделяется заданный объем памяти, которая занимается массивом во все время существования программы. Память под динамические массивы выделяется в процессе работы программы и при необходимости может быть изменена или освобождена.

Массив характеризуется числом измерений (их может быть до семи), которое называется рангом. Число элементов всего массива называется его размером. Число элементов массива вдоль каждого измерения называется протяженностью (экстентом) массива вдоль измерения. Ранг и протяженность массива вдоль каждого измерения определяют форму массива.

Каждое измерение массива может быть задано нижней и верхней границами, которые разделяются двоеточием. Если нижняя границами равна единице, то она, как правило, не указывается. Протяженность массива определяется по формуле:

Протяженность = Верхняя граница – нижняя граница + 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). Массивы а и с имеют одинаковую форму. Такие массивы называются согласованными.

 

Объявление массивов

 

Статические:

1. С помощью операторов описания типа

а) 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 как оператор.

3. Одновременное объявление массивов разной формы

          real, dimension(10):: a, b, b2(15), d(3,4) ! приоритет у явного описания формы.

 

Динамические:

1. С помощью атрибутов Pointer и Allocatable

      а) real, pointer:: a(:), c(:), d(:)  -! объявлены три одномерных массива-ссылки a, c, d;

      б) integer, allocatable:: b(:,:)  !  объявлен двумерный размещаемый массив b;

      в) real, allocatable, target:: t(:)  !  объявлен размещаемый массив адресат t.

2. С помощью оператора ALLOCATABLE

 integer, dimension(:,:):: b

              allocatable 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)  ! освобождение динамической памяти.

 

Инициализация массивов

 

Инициализацию массивов (задание начальных данных элементам массивов) можно осуществить несколькими способами.

Инициализация одномерных массивов:

1) в операторах описания типа 

integer a(10)/1,2,3,4,5,1,7,2,12,9/;

2) с помощью оператора data 

integer a(10)

data a/1,2,3,4,5,1,7,2,12,9/;

3) с помощью конструктора массива

integer:: a(10)=(/ 1,2,3,4,5,1,7,2,12,9/) ! в конструкторе массива пробел между слешем и скобкой не допускается;

4) в операторах присваивания

                     real b(5), a(5)

                     b=sin(t) ! всем элементам массива b будет присво-

                    ено значение функции sin(t)

                     a=2*(/3,3,4,4,6/)  ! все элементы массива a, задан-

                     ные с помощью конструктора массива, будут

                     удвоены;

5) использование в конструкторе массивов встроенных Do-циклов

       а)  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

Инициализация двумерных массивов:

1) с помощью оператора DATA

             integer b(2,3)

            data b/1,8,4,9,6,10/   ! значения вводятся по столбцам;

2) в операторах описания типа

           integer b(2,3) / 1,8,4,9,6,10 /  ! значения вводятся по столбцам;

3) с помощью функции RESHAPE

            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/).

Его элементы в памяти компьютера будут располагаться следующим образом:

а

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/

Такой массив можно представить в виде таблицы:

 

 

 

j

 

 

1

2

3

 

I

1

b(1,1)

b(1,2)

b(1,3)

2

b(2,1)

b(2,2)

b(2,3)

В памяти компьютера элементы этого массива будут располагаться в виде непрерывной последовательности по столбцам:

b

1.5

6.

7.1

-123.6

0

1.78

 

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. Индексный триплет задает последовательность индексов, в которой первый элемент равен его нижней границе, а каждый последующий больше (меньше) предыдущего на величину шага.

Примеры

Пусть объявлен одномерный массив:   real d(15.)

    Его возможные сечения:

а) 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.

2. Пусть объявлен двумерный массив:  integer b(3,6).

Примеры его возможных сечений:

а) b(2:3,2:6:2) – для такого объявления доступны следующие элементы массива: 

 

2

4

6

2

b(2,2)

b(2,4)

b(2,6)

3

b(3,2)

b(3,4)

b(3,6)

 

б) b(2, :) – обращение ко второй строке массива b;

в) b(:,6) – обращение к шестому столбцу массива b;

г) b(:,:) – обращение ко всем элементам массива b.

                       

Векторный индекс

Это одномерный целочисленный массив, содержащий значения индексов. Векторный индекс в отличие от индексного триплета позволяет извлечь в сечении массива произвольное подмножество элементов массива.

Примеры

1. real a(10), b(5,5)

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 ! инициированы следующие элементы массива:

 

 

2

5

1

b(1,2)

b(1,5)

3

b(3,2)

b(3,5)

5

b(5,2)

b(5,5)

 

2. real a(3,6), b(5)  ! объявление массивов a и b

data a/5*3, 5*4,8*0/  !  инициализация массива a

b=a(2,(/1,3,4,5,6/))  ! векторный индекс задан в виде конструк-

                                 тора массива, в вектор b будут записаны

                                 элементы второй строки массива a из

                                 столбцов с номерами 1, 3, 4, 5, 6.

 

Маскирование присваивания

В FPS можно используя оператор или конструкцию WHERE, выполнить присваивание только тем элементам массива, значения которых удовлетворяют некоторым условиям.

Оператор WHERE имеет вид:

WHERE(логическое выражение-массив) присваивание массива

 

Пример: real:: a(5)=(/1.0,-1.0,1.0,-1.0,1.0/)

     where(a > 0)  a=sin(a) ! положительным элементам массива

      a будет присвоено значение sin(a).

Конструкция WHERE имеет вид:

а) WHERE(логическое выражение-массив)

         операторы присваивания массивов

      ENDWHERE

б) WHERE(логическое выражение-массив)

         операторы присваивания массивов

    ELSEWHERE

         операторы присваивания массивов

    ENDWHERE

 

Пример: integer:: a(10) = (/1,-1,1,-1,1,-1,1,-1,1,-1/)

         integer:: b(-2:7) = 0

         where (a>b)

         b = b+2

         elsewhere

         b = b-3;   a = a+b

        endwhere

        write (*,*) b ! на выходе будет массив 

              2 –3  2 –3  2 –3  2 –3  2 –3

        write (*,*) a ! на выходе будет массив

              1 –4  1 –4  1 –4  1 –4  1 –4

Вычисляется значение логического выражения. Результатом вычисления будет логический массив-маска, под управлением которого и выполняется выборочное присваивание массивов. В предыдущем примере в результате выполнения логического выражения a > b массив-маска имеет вид:

         T  F  T  F  T  F  T  F  T  F  (T – истина, F – ложь).

Значения присваиваются тем следующим после WHERE элементам массивов, для которых соответствующий им элемент логического массива-маски равен .TRUE. Если значение элемента массива-маски равно .FALSE. и если есть ELSEWHERE, то будет выполнено присваивание следующих после ELSEWHERE элементов массивов, соответствующих по порядку следования элементу массива-маски. Массивы в WHERE должны иметь одинаковую форму.

 

Встроенные функции для работы с массивами

 

Справочные функции

1. SIZE(array[,dim]) – возвращает стандартное целое, равное размеру массива array, или, при наличии параметра dim, – число элементов вдоль заданного измерения dim.

Пример: real d(-5:0, 0:3)

          integer r, c

          r = size(d)  !  возвращает размер массива d, равный 24

          c = size(d, dim = 2) ! возвращает число элементов по вто-

         рому измерению массива d, равное 4.

2. SHAPE(source) – возвращает одномерный массив стандартного целого типа содержащий форму массива или скаляра source.

Пример: integer vec(2), array(3:10,-1:3)

         vec = shape(array)

         write(*,*) vec  !  возвращает форму массива array в виде

         одномерного массива, элементы которого равны 8 5.

 

Вычисления в массиве

1. PRODUCT(array[,dim][,mask]) – вычисляет произведение всех элементов целочисленного или вещественного массива вдоль необязательного измерения dim. Перемножаемые элементы могут отбираться необязательной маской mask.

Примеры: a) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/

                p = product(a, mask = a > 0)

                print *, p  !  будет найдено произведение положи-

                           тельных элементов массива а, равное 30;

             б) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-

                15/, p(5)

                p = product(a, dim = 1)

                print *, p  !  будут найдены произведения элементов

                            массива  а по столбцам в виде одномерного

                            массива p, элементы которого равны

                            6  150 -504  -1320  -2730.

2. All(mask,[,dim]) – возвращает .TRUE., если все элементы логического массива-маски mask вдоль заданного измерения dim истинны, или .FALSE. – в противном случае.

Пример. Если все элементы массива > 0, то найти их произведение.

        real:: a(3,5)/ 1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/, p

        if(all(mask=a>0)) then

           p = product(array=a)

          print *, p  ! 

       else

         print *, ‘Не все элементы массива >0’

        endif

3. SUM(array,[,dim][,mask]) – вычисляет сумму всех элементов целочисленного и