Advertisement
Oppaceted

Первая часть 3 расчётки по ОиУ

May 26th, 2023
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. program main
  3.     use OiU3
  4.     implicit none
  5.     integer :: c(7,7), k, l, temp(7,7), summa
  6.     integer, parameter :: i = 10
  7.     summa = 0
  8.     do k = 1,7
  9.         do l = 1,7
  10.             if (k == l) then
  11.                 c(k,l) = 100000
  12.             else if ( mod( (i + 3*k + 5*l), 17) == 0 ) then
  13.                 c(k,l) = 17
  14.             else
  15.                 c(k,l) = mod( (i + 3*k + 5*l), 17)
  16.             end if
  17.         end do
  18.     end do
  19.     temp = c
  20.     write (0,fmt='(a,i2)') 'Road 1 to 2: ',c(1,2)
  21.     call write_matrix(c,7)
  22.     call transform(temp,7, summa)
  23.     call write_matrix(temp,7)
  24.     write (0,fmt = '(a,i3)') 'Then we choose better summa:', summa
  25. end program main
  26.  
  27. module OiU3
  28.     contains
  29.     !
  30.     subroutine numbers(n)
  31.         integer :: n, i
  32.         write (0,fmt = '(a4$)') '| \ '
  33.         do i = 1,n,1
  34.             write(0, fmt = '(a,i2,a$)') '|',i,':'
  35.         end do
  36.         write (0,fmt = '(a1)') '|'
  37.     end subroutine
  38.     !
  39.     subroutine cap(n)
  40.         integer :: n, i
  41.         do i =1,n
  42.             write (0,fmt = '(a$)') '+---'
  43.         end do
  44.         write (0,fmt = '(a)') '+'
  45.     end subroutine
  46.     !
  47.     subroutine write_array(array,n)
  48.         integer :: n, i
  49.         integer :: array(n)
  50.         write (0,*)
  51.         call cap(n+1)
  52.         call numbers(n)
  53.         call cap(n+1)
  54.         write (0,fmt = '(a$)') '| / '
  55.         do i = 1,n
  56.             write (0,fmt = '(a,i2,a$)') '|', array(i),' '
  57.         end do
  58.         write (0,fmt = '(a)') '|'
  59.         call cap(n+1)
  60.         write (0,*)
  61.     end subroutine
  62.     !
  63.     subroutine write_matrix(matrix, n)
  64.         integer :: n
  65.         integer :: matrix(n,n), k, l
  66.         !
  67.         write (0,*)
  68.         call cap(n+1)
  69.         call numbers(n)
  70.         do k = 1,n
  71.             call cap(n+1)
  72.             write (0, fmt='(a,i2,a$)') '|', k, ':'
  73.             do l = 1,n
  74.                 if ( matrix(k,l)>10000 ) then
  75.                     write (0, fmt = '(a$)') '|inf'
  76.                 else
  77.                     write (0,fmt='(a,i3$)') '|',matrix(k,l)
  78.                 end if
  79.             end do
  80.             write (0,fmt='(a)') '|'
  81.         end do
  82.         call cap(n+1)
  83.         write (0,*)
  84.     end subroutine
  85.     !
  86.     integer function minimum(array,n) result(res_index)
  87.         integer :: n, i
  88.         integer :: array(n)
  89.         res_index = 1
  90.         do i =1,n,1
  91.             if( array(i)<array(res_index) ) then
  92.                 res_index = i
  93.             end if
  94.         end do
  95.     end function
  96.     !
  97.     subroutine min_stroka(matrix,n,stroka_min)
  98.         integer :: n, i
  99.         integer :: matrix(n,n), stroka_min(n),temp_array(n)
  100.         do i =1,n
  101.             temp_array = matrix(i,:)
  102.             stroka_min(i) = matrix(i, minimum(temp_array,n))
  103.         end do
  104.     end subroutine
  105.     !
  106.     subroutine min_stolbec(matrix,n,stolbec_min)
  107.         integer :: n, i
  108.         integer :: matrix(n,n), stolbec_min(n),temp_array(n)
  109.         do i =1,n
  110.             temp_array = matrix(:,i)
  111.             stolbec_min(i) = matrix(minimum(temp_array,n), i)
  112.         end do
  113.     end subroutine
  114.     !
  115.     subroutine transform(matrix, n, summa)
  116.         integer :: n,i, summa_1, summa_2, summa
  117.         integer :: matrix(n,n), temp_matrix(n,n), stroka_min(n), stolbec_min(n)
  118.         ! 1 sequence of actions
  119.         temp_matrix = matrix
  120.         !
  121.         call min_stroka(temp_matrix,n,stroka_min)
  122.         write (0,fmt = '(a$)') 'Massiv strok: '
  123.         do i = 1,n
  124.             temp_matrix(i,:) = temp_matrix(i,:) - stroka_min(i)
  125.         end do
  126.         call write_array(stroka_min,n)
  127.         call min_stolbec(temp_matrix,n,stolbec_min)
  128.         do i = 1,n
  129.             temp_matrix(:,i) = temp_matrix(:,i) - stolbec_min(i)
  130.         end do
  131.         write (0,fmt = '(a$)') 'Massiv stolbcov: '
  132.         call write_array(stolbec_min,n)
  133.         call write_matrix(temp_matrix,n)
  134.         !
  135.         summa_1 = sum(stroka_min) + sum(stolbec_min)
  136.         ! 2 sequence of actions
  137.         temp_matrix = matrix
  138.         !
  139.         call min_stolbec(temp_matrix,n,stolbec_min)
  140.         do i = 1,n
  141.             temp_matrix(:,i) = temp_matrix(:,i) - stolbec_min(i)
  142.         end do
  143.         write (0,fmt = '(a$)') 'Massiv stolbcov: '
  144.         call write_array(stolbec_min,n)
  145.         call min_stroka(temp_matrix,n,stroka_min)
  146.         do i = 1,n
  147.             temp_matrix(i,:) = temp_matrix(i,:) - stroka_min(i)
  148.         end do
  149.         write (0,fmt = '(a$)') 'Massiv strok: '
  150.         call write_array(stroka_min,n)
  151.         call write_matrix(temp_matrix,n)
  152.         !
  153.         summa_2 = sum(stroka_min) + sum(stolbec_min)
  154.         !
  155.         write (0,fmt = '(a,i3)') 'Sum then stroki first then stolbcy:',summa_1
  156.         write (0,fmt = '(a,i3)') 'Sum then stolbcy first then stroki:',summa_2
  157.         if (summa_1>summa_2) then
  158.             summa = summa_1
  159.             !do i =1,n
  160.                 !temp_array = matrix(i,:)
  161.                 !stroka_min(i) = matrix(i, minimum(temp_array,n))
  162.             !end do
  163.             call min_stroka(matrix,n,stroka_min)
  164.             do i = 1,n
  165.                 matrix(i,:) = matrix(i,:) - stroka_min(i)
  166.             end do
  167.             call min_stolbec(matrix,n,stolbec_min)
  168.             do i = 1,n
  169.                 matrix(:,i) = matrix(:,i) - stolbec_min(i)
  170.             end do
  171.         else
  172.             summa = summa_2
  173.             call min_stolbec(matrix,n,stolbec_min)
  174.             do i = 1,n
  175.                 matrix(:,i) = matrix(:,i) - stolbec_min(i)
  176.             end do
  177.             call min_stroka(matrix,n,stroka_min)
  178.             do i = 1,n
  179.                 matrix(i,:) = matrix(i,:) - stroka_min(i)
  180.             end do
  181.         end if
  182.     end subroutine
  183. end module
  184.  
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement