Умножение профильной несимметричной матрицы на вектор (Лабораторная работа № 3), страница 3

      open (15,File='E:\fortran\l3\rez.txt',status='old')

      do i=1,n,1

      rez(i)=i*(i+n-3)+1+n

      end do

      write(15,*)(rez(i),i=1,n,1)

      close(15)

      end

!------------------------------------------------------------------------------------------------------------

!подпрограмма вывода плотной матрицы по исходной профильной матрице

!параметры: ai,di,al,au-массивы исходных данных

!------------------------------------------------------------------------------------------------------------

subroutine writematrx(ai,di,al,au)

      common/m/ka,kia

      dimension Ai(kia)

      dimension di(kia-1)

      dimension Al(ka)

      dimension Au(ka)

      dimension x(100,100)

      open (17,File='E:\fortran\l3\outmatrix.txt',status='old')

      iz=0

      do i=1,kia-2,1

      k=ai(i+2)-ai(i+1)

      do j=1,i-k,1

      x(j,i)=0.0

      end do

      do j=i-k+1,i,1

      iz=iz+1

      x(j,i)=au(iz)

      end do

      do j=i+1,kia-2,1

      x(j,i)=0.0

      end do

      end do

      !print *,((x(i,j),i=1,kia-2,1),j=1,kia-2,1)

      l=0

      do i=1,kia-1,1

      k=ai(i+1)-ai(i)

      write(17,*)(0.0,j=1,i-k-1,1),(al(j),j=l+1,l+k,1),di(i),

     *(x(i,j),j=i,kia-2,1)

      l=l+k

      end do

      close(17)

      end

      program main

      parameter(ir=2000000)

      common/m/ka,kia

      dimension A(ir)

      open (10,File='E:\fortran\l3\in.txt',status='old')

      open (11,File='E:\fortran\l3\invec.txt',status='old')

      open (12,File='E:\fortran\l3\out.txt',status='old')

      open (13,File='E:\fortran\l3\inp.txt',access='direct',

     *recl=4,status='old')

      open (14,File='E:\fortran\l3\inpv.txt',access='direct',

     *recl=4,status='old')

      print *,'Enter the action: 1 - convertor; 2 - generator'

      read *,k                      !вызов генератора или конвертора

      if (k.eq.1)then

      call convertor(a)

      else

      print *,'vvedite n'

      read *,n

      call generator(n)

      print *,'generated'

      pause

      end if

      call vvod(A,is,ir)

      print *,is

      pause

      if(is.eq.0) stop          !если данные некорректны, остановка программы

      call mult(A(1),a(kia+1),a(2*kia),a(2*kia+ka),  !записьрезультатоввфайл

     *a(2*ka+2*kia),a(2*ka+3*kia-1))

      print *,'multed'

      call writematrx(A(1),a(kia+1),a(2*kia),a(2*kia+ka))

      if (k.eq.2)then

      call rezult(n,a(1))

      print *,'rezulted'

      pause

      end if

      write(12,*)(a(i),i=2*ka+3*kia-1,2*ka+4*kia-3,1)

      print *,'writed'

      pause

      close(10)

      close(11)

      close(13)

      close(14)

      close(12)

      end

6. Набор тестов

Исходные данные:n(размерность исходной матрицы), ia, a, id, kv(размерность вектора), vec

Результаты, назначение

4

1 2 3 4 5

1 1 1 1

1 1 1 1

5

1 2 3 4 5

Неверные данные; проверка на корректность данных (размерности вектора и матрицы не совпадают)

0

1 2 3 4 5

1 1 1 1

1 1 1 1

0

1 2 3 4 5

Неверные данные; проверка на корректность данных (размерности вектора и матрицы меньше 1)

108

1 2 3 4 5

1 1 1 1

1 1 1 1

108

1 2 3 4 5

Нехватка памяти, проверка (kia+kv<ir)

4

1 2 3 4 5

0 0 0 0

1 1 1 1

4

1 2 3 4

Rez={0,0,0,0}

Нуль – матрица, диагональная

4

1 2 3 4 5

1 1 1 1

1 1 1 1

4

1 2 3 4

Rez={1,2,3,4}

Единичная матрица, диагональная

4

1 3 5 8 12

11 12 22 23 31 32 33 41 42 0 44

1 1 3 4

4

1 2 3 4

Rez={35,113,194,301}

Профильная матрица с целыми числами; назначение: в профилях находится разное число элементов, большее единицы, диагональный элемент в профилях пробегает позиции от первой до последней, в профилях есть нули и элементы как до диагонального, так и после

5

1 4 8 10 14 17

1.3 0 6.9 5.46 21.908 0 1.1 33 4.87 54.9 7.8 6.098 4.76 3.2 0 5.33 

1 1 2 3 3

5

1.09 2.78 3.6 4.5432 1.09

Rez={26.2570000, 95.2465973, 109.2719955, 213.5948486, 17.3297005}    

Тест аналогичен предыдущему, но с вещественными числами