Advertisement
Guest User

Untitled

a guest
Jun 10th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program lab_1_2
  2.     use Environment
  3.  
  4.  
  5.     implicit none
  6.    
  7.     integer, parameter                 :: NAME_LEN = 15, DATE_LEN = 4,&
  8.                                           SERV_LEN = 3, REG_LEN = 1, SEX = 1
  9.     integer, parameter                 :: len = 6
  10.    
  11.     character(kind=CH_), allocatable   :: chName(:,:), Date(:,:),&
  12.                                           Serv(:,:), Reg(:,:), Gen(:,:)
  13.     character(kind=CH_), allocatable  :: s(:), p(:), yes(:)
  14.     allocate(s(1), p(1), yes(3))
  15.     s = "S"
  16.     p = "P"
  17.     yes = "yes"
  18.     allocate(chname(len, Name_len), Date(len, Date_len),&
  19.              serv(len, serv_len), reg(len, reg_len), gen(len, sex))
  20.  
  21.     call Read_list(input, chname, date, serv, reg, gen)
  22.      
  23.     call Write_list(output, chname, date, serv, reg, gen,&
  24.                      "list before", "rewind", len)
  25.     call Sort_list (chname, date, serv, reg, gen)
  26.  
  27.     contains
  28.        subroutine Read_list(input, chname, date, serv, reg, gen)
  29.          character(*) input
  30.          character(kind=CH_), allocatable   :: chName(:,:), Date(:,:),&
  31.                                           Serv(:,:), Reg(:,:), Gen(:,:)
  32.          intent(in) input
  33.          intent(inout) chname, date, serv, reg, gen
  34.  
  35.          integer in, IO, i
  36.          character(:), allocatable :: format
  37.          
  38.          open( file = input, encoding=E_, newunit=in)
  39.             format = "(15A, 4A, 1X, 3A, 1X, 1A1, 1X, 1A1)"  
  40.             read(in, format) (chName(i,:), Date(i,:), Serv(i,:), Reg(i,:), Gen(i,:), i=1, 6)
  41.          close(in)
  42.         end subroutine Read_list
  43.  
  44.         subroutine Write_list ( output, chname, date, serv, reg, gen, comment, pos, len)
  45.             character(*)      output, comment, pos
  46.             character(kind=CH_)   :: chName(:,:), Date(:,:),&
  47.                                      Serv(:,:), Reg(:,:), Gen(:,:)
  48.             intent(in) output, comment, pos
  49.             integer, intent(in)  :: len
  50.             intent(inout) chname, date, serv, reg, gen
  51.             integer        :: out, i , io
  52.             character(:), allocatable :: format
  53.             open(file=output, encoding=E_, position=pos, newunit=out)
  54.                write(out, '(/a)') comment
  55.                format = "(15A, 4A, 1X, 3A, 1X, 1A1, 1X, 1A1)"  
  56.                do i=1, len
  57.                   write(out, format) chName(i,:), Date(i,:), Serv(i,:),&
  58.  
  59.                                          Reg(i,:), Gen(i,:)
  60.                end do
  61.             close(out)
  62.          end subroutine Write_list
  63.  
  64.  
  65.          subroutine Sort_list(chname, date, serv, reg, gen)
  66.             character(kind=CH_) chname(:,:), date(:,:), serv(:,:),&
  67.                                  reg(:,:), gen(:,:)
  68.             character(kind=CH_), allocatable  :: cpname(:,:), cpdate(:,:),&
  69.                                                  cpserv(:,:), cpreg(:,:),&
  70.                                                  cpgen(:,:), tmp(:)
  71.             logical, allocatable              :: mask(:)
  72.  
  73.             integer              i, j, amount
  74.             integer, parameter   :: INDEXES(*) = [(i, i = 1, len)]
  75.             integer, allocatable :: pos(:)
  76.            
  77.             mask =   ( (reg(:, 1) .eq. s(1)) .and. (serv(:, 1) .eq. yes(1)))
  78.             amount = count(mask)
  79.             pos = pack(INDEXES, mask)
  80.             allocate(cpname(amount, 15), cpdate(amount, 4),&
  81.                      cpserv(amount, 3), cpreg(amount, 1), cpgen(amount, 1))
  82.                  
  83.             do concurrent (i = 1:amount)
  84.            
  85.                cpname(i, :) = chname(pos(i), :)
  86.                cpdate(i, :) = date(pos(i), :)
  87.                cpserv(i, :) = serv(pos(i), :)
  88.                cpreg(i, :) = reg(pos(i), :)
  89.                cpgen(i, :) = gen(pos(i), :)
  90.  
  91.             end do
  92.    
  93.             do i = amount, 2, -1
  94.             do j = 1, i-1
  95.                if(GT(cpname(j, :),cpname(j+1, :))) then
  96.                   tmp = cpname(j+1, :)
  97.                   cpname(j+1, :) = cpname(j, :)
  98.                   cpname(j, :) = tmp
  99.  
  100.                   tmp =  cpdate(j+1, :)
  101.                   cpdate(j+1, :) = cpdate(j, :)
  102.                   cpdate(j, :) = tmp
  103.  
  104.                   tmp =  cpserv(j+1, :)
  105.                   cpserv(j+1, :) = cpserv(j, :)
  106.                   cpserv(j, :) = tmp
  107.                  
  108.                   tmp =  cpreg(j+1, :)
  109.                   cpreg(j+1, :) = cpreg(j, :)
  110.                   cpreg(j, :) = tmp
  111.  
  112.                   tmp =  cpgen(j+1, :)
  113.                   cpgen(j+1, :) = cpgen(j, :)
  114.                   cpgen(j, :) = tmp
  115.  
  116.                end if
  117.             end do
  118.             end do
  119.             mask =   ( (reg(:, 1) .eq. p(1)) .and. (serv(:, 1) .eq. yes(1)))
  120.             amount = count(mask)
  121.             pos = pack(INDEXES, mask)
  122.                  
  123.             do concurrent (i = 1:amount)
  124.            
  125.                cpname(i, :) = chname(pos(i), :)
  126.                cpdate(i, :) = date(pos(i), :)
  127.                cpserv(i, :) = serv(pos(i), :)
  128.                cpreg(i, :) = reg(pos(i), :)
  129.                cpgen(i, :) = gen(pos(i), :)
  130.  
  131.             end do
  132.    
  133.             do i = amount, 2, -1
  134.             do j = 1, i-1
  135.                if(GT(cpname(j, :),cpname(j+1, :))) then
  136.                   tmp = cpname(j+1, :)
  137.                   cpname(j+1, :) = cpname(j, :)
  138.                   cpname(j, :) = tmp
  139.  
  140.                   tmp =  cpdate(j+1, :)
  141.                   cpdate(j+1, :) = cpdate(j, :)
  142.                   cpdate(j, :) = tmp
  143.  
  144.                   tmp =  cpserv(j+1, :)
  145.                   cpserv(j+1, :) = cpserv(j, :)
  146.                   cpserv(j, :) = tmp
  147.                  
  148.                   tmp =  cpreg(j+1, :)
  149.                   cpreg(j+1, :) = cpreg(j, :)
  150.                   cpreg(j, :) = tmp
  151.  
  152.                   tmp =  cpgen(j+1, :)
  153.                   cpgen(j+1, :) = cpgen(j, :)
  154.                   cpgen(j, :) = tmp
  155.  
  156.                end if
  157.             end do
  158.             end do
  159.            
  160.             call Write_list(output, cpname, cpdate, cpserv, cpreg, cpgen,&
  161.                      "First sort", "append", amount)
  162.             call Write_list(output, cpname, cpdate, cpserv, cpreg, cpgen,&
  163.                      "second sort", "append", amount)
  164.            
  165.  
  166.          end subroutine
  167.       pure logical function GT(arr1, arr2)
  168.           character(kind=CH_), intent(in) :: arr1(:), arr2(:)
  169.  
  170.           integer :: i
  171.  
  172.           do i = 1, Min(Size(arr1), Size(arr2)) - 1
  173.              if (arr1(i) /= arr2(i)) &
  174.              exit
  175.           end do
  176.           GT = arr1(i) > arr2(i)  
  177.       end function GT
  178. end program lab_1_2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement