fortran 作业10

作业10 <br/>

question2
PROGRAM A10Q2
    IMPLICIT NONE
    INTEGER::n,i,j, prime, check
    INTEGER, DIMENSION(:), ALLOCATABLE :: items
    INTEGER, DIMENSION(:), ALLOCATABLE ::  nozItems        
      
    DO 
      PRINT *,''
      PRINT *,'Enter a number for finding the prime: '
      READ *,n;
      ALLOCATE (items(n),nozItems(n)); 
      DO i=2,n
        items(i)=i
      END DO

      prime= 2
    DO WHILE (prime<=n**0.5)
      DO i=prime+1,n
        IF (MOD(items(i),prime)==0) THEN
            items(i)=0
        END IF
      END DO
      prime = prime + 1
        DO WHILE (items(prime)==0 .AND. prime <n**0.5) 
        prime = prime + 1
        END DO       
    END DO 
 
    j=1
  DO i=2,n
  IF (items(i)/=0) THEN
    nozItems(j)=items(i)
    j=j+1
  END IF  
  END DO  

      write(6,1) (nozItems(i),i=1,j-1)
  1	format(3x,10i7/)    
    
        DEALLOCATE (items,nozItems); 
END DO
END PROGRAM A10Q2

fortran 作业9

A9Q1

PROGRAM A9Q1
IMPLICIT NONE
CHARACTER(len =300):: string
INTEGER :: m, n

DO 
        PRINT *, "ENTER INTEGER NUMBER (N):"
        READ *, n
        
        PRINT *, "ENTER MAXIMUM NUMBER OF CHARACTER (M): "
        READ *, m

        IF (( m .EQ. 0) .and. (n .EQ. 0)) STOP
        string = " "
        PRINT *,"Result: ", Convert(n, string, m)
        PRINT *,"String format: ", string
END DO
CONTAINS


INTEGER FUNCTION Convert(n, t, m)
CHARACTER(len=300), INTENT(INOUT) :: t
INTEGER, INTENT(INOUT) :: m, n
CHARACTER(200) :: buffer
INTEGER :: i, pos !- keeps the position 
REAL :: r

r = n * 1.0 
IF (r .NE. 0) THEN
         !- finding the number of digits of n
        r = LOG(r) / LOG(10.0)
        convert = FLOOR(r)+1
        !- writing the integer n into a seies of characters
        write(buffer,"(I15)") n
         
        IF (m .GE. convert) THEN 
                DO i = 1,Convert
                        read (buffer, *) t(i:i) 
                        pos = INDEX(buffer, t(i:i))
                        buffer(pos : pos)=" "
                END DO
        ELSE
                DO i = 1, m
                        t(i:i)="*"
                END DO       
                Convert = m
        END IF
    ELSE
            t = "0"
            Convert = m
    END IF
END FUNCTION

END PROGRAM
A9Q2
program A9Q2

    IMPLICIT NONE
    
    ! DECLARING VARIABLES
    INTEGER, DIMENSION(:,:), ALLOCATABLE :: A
    INTEGER :: i, j
    INTEGER :: size, check, m, k, totalSum, result
 
    DO
        PRINT *, "ENTER SIZE OF THE MATRIX (OR 0 to EXIT PROGRAM):"
        READ *, size
        IF (size .eq. 0 .or. size .eq. 0) STOP
        IF (size .lt. 0 .or. size .lt. 0) THEN
            PRINT *, "NEGATIVE NUMBER OF ELEMENTS"
        ELSE

            ALLOCATE(A(size, size))
            PRINT *, "Enter values in matrix: "
            READ *, (A(i,1:size), i=1,size)
 
            PRINT *, "Testing Matrix is: "
            totalSum = 0
            DO i = 1,size
                PRINT "(5X,15I5)", A(i,1:size)
            END DO
            
            PRINT *, "ENTER THE STARTING AND ENDING PATH : "
            READ *, m, k

            result = ShortestPath(A, size, m, k)
        
            DEALLOCATE(A)
        END IF
    END DO


CONTAINS

! Shortest path function will find the value
! and find the sequence of shortest path
INTEGER FUNCTION ShortestPath (A,n,m,k)
    INTEGER, DIMENSION(n,n), INTENT(IN) :: A
    INTEGER, DIMENSION(n) :: B
    INTEGER, DIMENSION(n) :: C
    INTEGER, INTENT(IN) :: n, m, k
    INTEGER :: i, j, o, temp

    ! GET THE TOTAL SUM OF A
    totalSum = 0
    DO i = 1, size
        DO j = 1, size
            totalSum = totalSum + A(i, j)
        END DO
    END DO

    ! INTILIZE B[1] = 0
    B(1) = 0
    DO i = 2, size
        B(i) = totalSum + 1
    END DO


    DO o = 1, SIZE
        DO i = 2, size
            DO j = 1, SIZE
                IF (A(i, j) .NE. 0) THEN
                    ! GET THE MINIMUM VALUE OF AFTER ADDING A every row
                    ! with B array value
                    ! and update the B array value depending on their
                    ! minimum value
                    IF (j .EQ. 1) THEN
                        B(i) = min(A(i, j) + B(j), A(i, j+1) + B(j+1)) 
                    ELSE 
                        B(i) = min(B(i), A(i, j) + B(j))     
                    END IF
                END IF
            END DO
        END DO
    END DO



    ! USE FOR GETTING THE ARRAY INDEX
    DO i = 1, size
        C(i) = i
    END DO

    ! ORDER THE ARRAY AND GET THEIR 
    DO i = 1, size
        DO j = i + 1, size
            IF (B(C(j)) < B(C(i))) THEN
                temp = C(i)
                C(i) = C(j)
                C(j) = temp
            END IF
        END DO
    END DO

    PRINT *,"Shortest Path value", B(k)
    PRINT *,"Shortest Path from m to k is: ", C
    ShortestPath = B(k)

END FUNCTION ShortestPath
    


end program A9Q2

fortran 作业8

作业8

Question 1
PROGRAM GREATESTCOMMONDIVISOR
! -----------------------------------------------------------------------------
! this a program which read a pair of integer numbers and uses GCD(a,b) to find
! the greatest common divisor for each pair until a pair of zeros is entered
! indicate the end of data
! -----------------------------------------------------------------------------
    IMPLICIT NONE
 
    ! Declaring variables
    INTEGER :: b, result
    INTEGER, DIMENSION(:), ALLOCATABLE :: A
    INTEGER :: i, j, k, size, check
 
    DO
        ! read two positive number
        PRINT *, "ENTER ARRAY SIZE: (O TO STOP THE PROGRAM)"
        READ *, size
        
        IF(size .eq. 0) THEN
            PRINT *, "PROGRAM EXIT"
            EXIT
        ELSE IF(size .lt. 0) THEN
            PRINT *, "ARRAY INDEX NEVER BE NEGATIVE."
        ELSE
            ALLOCATE(A(size), STAT=check)
                PRINT *, "ENTER ARRAY VALUES: "
                READ *, A

                result = A(1)
                DO i = 2, size
                    result = GCD2(A(i), result)
                END DO

                PRINT *, result;
            DEALLOCATE(A)
        END IF
    END DO
 
    
CONTAINS


INTEGER RECURSIVE FUNCTION GCD2(m, n) RESULT(res)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: m, n
    ! temp will used for swaping value
    if (m == 0) THEN
        res = n
    ELSE
        res = gcd2(MOD(n,m), m)
    END IF

END FUNCTION GCD2



END PROGRAM GREATESTCOMMONDIVISOR
question2
PROGRAM CyclicGraphs1
!---------------------------------------------------------------------------
! Directed graph is entered as adjacency lists (using a char variable) and
! represented as an adjacency matrix to find the shortest cycle for a node
!---------------------------------------------------------------------------
    IMPLICIT NONE
    CHARACTER(80) :: X
    INTEGER, DIMENSION(:,:), ALLOCATABLE :: A
    INTEGER :: i,j,k,m,n,check, count
    LOGICAL :: connected

    connected = .false.
    
    DO
        PRINT *, "enter n (or 0 to stop):"
        READ *, n
        IF (n .eq. 0) STOP
        IF (n .lt. 0) THEN
            PRINT *, "incorrect value of n"
        ELSE
            ALLOCATE (A(n,n),STAT=check)
            IF (check .ne. 0) THEN
                PRINT *, "unsuccessful ALLOCATE"
            ELSE
                A = 0
                PRINT *, "enter the graph, node after node:"
                DO i = 1,n
                    READ "(A)", X
                    READ (X,*) j
                    m = INDEX(X,':')
                    DO WHILE (m .gt. 0)
                        X(m:m) = ' '
                        READ (X(m:),*) j
                        A(i,j) = 1
                        m = INDEX(X, ',')
                    END DO
                END DO
            END IF

            ! print the adjacent matrix
            PRINT *, "the adjacency matrix is: "
            DO i = 1,n
                PRINT "(5X,15I5)", A(i,1:n)
            END DO

            ! call the logical function Conn
            connected = CONN(A, n)
            IF (connected) THEN
                PRINT *, "This graph is strongly connected."
            ELSE
                PRINT *, "This graph is not strongly connected."
            END IF
        
        END IF
    END DO

CONTAINS 

LOGICAL FUNCTION CONN(A,n)
    INTEGER, DIMENSION(n, n), INTENT(IN) :: A
    INTEGER, INTENT(IN) :: n
    INTEGER :: i, j, k, count
    LOGICAL :: strong


    strong = .false.
    DO i = 1, n
        count = 0
        ! check every column for single node and looking for 1
        DO j = 1, n
            IF (A(i, j) == 1) THEN
                count = count + 1
            END IF
        END DO
    
        ! check every row for single node and looking for 1
        DO k = 1, n
            IF (A(k, i) == 1) THEN
                count = count + 1
            END IF
        END DO 

        ! if the counting value is size - 1 then we will sure that
        ! it can travarse every nodes
        IF (count == n - 1) THEN
            strong = .true.
        END IF
    END DO

    CONN = strong

END FUNCTION CONN

END PROGRAM CyclicGraphs1

fortran 作业7

question1
  !------------------------------------------------------------------------
! The fortran subroutine CSRorCSC(R,C,V, n, nz) which converts
! the CSR representation of a sparse matrix to its CSC representation
!-------------------------------------------------------------------------
! Also a program which enters a sparse matrix (in the COO format) and 
! creates its CSR Representation, invokes the CSRorCSC Subroutine and 
! output the result.
!-------------------------------------------------------------------------

PROGRAM A7Q1
    
IMPLICIT NONE
! DECLARE VARIABLES
INTEGER, DIMENSION(:,:), ALLOCATABLE :: A
INTEGER, DIMENSION(3) :: B
INTEGER :: i, j, size, m, n, check, k, rowIndex, loop, columnIndex, temp
INTEGER :: zero, nonzero
! R, C, V
INTEGER, DIMENSION(:), ALLOCATABLE :: D
INTEGER, DIMENSION(:), ALLOCATABLE :: R
INTEGER, DIMENSION(:), ALLOCATABLE :: C
INTEGER, DIMENSION(:), ALLOCATABLE :: V
INTEGER, DIMENSION(:), ALLOCATABLE :: R1
INTEGER, DIMENSION(:), ALLOCATABLE :: C1
INTEGER, DIMENSION(:), ALLOCATABLE :: V1



! GET THE SPARSE MATRIX IN COO FORMAT
DO 
    PRINT *, "ENTER THE (SIZE OF MATRIX) m and n (OR 0 0 to END): "
    READ *, m ,n

    IF (m .eq. 0 .or. n .eq. 0) STOP
    IF (m .lt. 0 .or. n .lt. 0) THEN
        PRINT *, "NEGATIVE NUMBER OF ELEMENTS: "
        
    ELSE
        ! ALLOCATE THE ARRAY A
        ALLOCATE(A(m,n))
        PRINT "(1X, 'ENTER THE MATRIX VALUES OF A', I3, '*', I3, ' ELEMENTS:')", m, n
        READ *, ((A(i, j), i = 1, m), j = 1, n)


        ! DISPLAY USER INPUT (LATER WE WILL USE THE FORMATTING.)
        PRINT *, "COO FORMAT : "
        DO i = 1,m
            PRINT "(5X,15I5)", A(i,1:n)
        END DO



        
        ! CSRorCSC FORMAT
        size = 1
        DO i = 1, m
            DO j = i, n
                IF (A(i, j) /= 0) THEN
                    size = size + 1
                END IF
            END DO
        END DO

        PRINT *, size   ! 8 for demo sparse matrix

        ! ALLOCATING R, C, V
        ALLOCATE(D(m), STAT = check)
        ALLOCATE(R(size), STAT = check)
        ALLOCATE(C(size), STAT = check)
        ALLOCATE(V(size), STAT = check)


        ALLOCATE(C1(m), STAT = check)
        ALLOCATE(R1(size), STAT = check)
        ALLOCATE(V1(size), STAT = check)

        ! GETTING THE R,C,V FOR CSR
        k = 1
        rowIndex = 0
        nonzero = 0
        zero = 0
        DO i = 1, m
            DO j = 1, n
                IF (A(i, j) /= 0) THEN
                    R(k) = i
                    rowIndex = rowIndex + 1
                    C(k) = j
                    V(k) = A(i, j)
                    k = k + 1
                END IF
            END DO
            D(i) = rowIndex
        END DO


        PRINT *, "CSR FORMAT: "
        PRINT *, "R: ", D
        PRINT *, "C: ", C
        PRINT *, "V: ", V


        CALL CSRorCSC(R, C, V, size, nonzero);

    END IF
END DO

CONTAINS

  SUBROUTINE CSRorCSC (R,C,V,n,nz) 
    INTEGER, DIMENSION(n), INTENT(INOUT) :: R
    INTEGER, DIMENSION(n), INTENT(INOUT) :: C
    INTEGER, DIMENSION(n), INTENT(INOUT) :: V
    INTEGER, INTENT(IN) :: n, nz


    PRINT *, "CSC FORMAT: "
        !-------------------------------------------------
        columnIndex = 0
        k = 1
        DO i = 1, m
            DO j = 1, size
                IF(i .eq. C(j)) THEN
                    V1(k) = V(j)
                    columnIndex = columnIndex + 1
                    R1(k) = R(j)
                    k = k + 1
                END IF
            END DO

            C1(i) = columnIndex
        END DO

       
        PRINT *,"C: ", C1
        PRINT *,"R: ", R1
        PRINT *,"V: ", V1


        PRINT *, "CSR FORMAT: "
        !-------------------------------------------------

        rowIndex = 0
        k = 1
        DO i = 1, m
            DO j = 1, size
                IF(i .eq. R(j)) THEN
                    V(k) = V1(j)
                    rowIndex = rowIndex + 1
                    R(k) = R1(j)
                    k = k + 1
                END IF
            END DO

            D(i) = rowIndex
        END DO

        PRINT *,"R: ", D
        PRINT *,"C: ", C
        PRINT *,"V: ", V




  END SUBROUTINE CSRorCSC


END PROGRAM A7Q1
question2

PROGRAM A7Q2
        IMPLICIT NONE
        INTEGER, DIMENSION(:), ALLOCATABLE :: R1,C1,V1,R2,C2,V2,R3,C3,V3
        INTEGER ::n,nz1,nz2,n3,myresult
        n=-1
        nz1=-1
        nz2=-1
        n3=-1
        DO WHILE (n<1) !-- Keeps asking for positive array size
                PRINT *, "Enter the size of matrix n*n, n: "     
                READ *, n
        END DO

        DO WHILE ((nz1<1).or.(nz1.gt.(n*n))) !-- nz1 should be less than n*n
                PRINT *, "For matrix 1 enter the number of non-zero elements , nz1: "     
                READ *, nz1
        END DO 

       DO WHILE ((nz2<0).or.(nz2.gt.(n*n))) !-- nz1 should be less than n*n
                PRINT *, "For matrix 2 enter the number of non-zero elements , nz2: "     
                READ *, nz2
        END DO

        DO WHILE (n3<0) !-- Keeps asking for positive array size
                PRINT *, "For matrix 3 enter your estimation, n3: "     
                READ *, n3
        END DO


        ALLOCATE(R1(n),R2(n),R3(n))
        ALLOCATE(C1(nz1),C2(nz2),C3(n3))
        ALLOCATE(V1(nz1),V2(nz2),V3(n3))

                !-Reading matrices
        PRINT *," ========== Enter matrices in CSR format ==========="
        PRINT *,"For matrix 1, enter row index: "
        READ *, R1
        PRINT *,"For matrix 1, enter column index: "
        READ *, C1
        PRINT *,"For matrix 1, enter value array: "
        READ *, V1
        PRINT *,"For matrix 2, enter row index: "
        READ *, R2
        PRINT *,"For matrix 2, enter column index: "
        READ *, C2
        PRINT *,"For matrix 2, enter value array: "
        READ *, V2



        PRINT *," ========== The result in CSR format ==========="
        myresult=SparseAdd(R1,C1,V1,R2,C2,V2,R3,C3,V3,n,nz1,nz2,n3)
        IF (myresult.gt.0) THEN
                PRINT *," The matrix C row index is:",R3
                PRINT *," The matrix C column index is:", C3(1:myresult)
                PRINT *," The matrix C value array is:", V3(1:myresult)
        ELSE IF(myresult.eq.0) THEN
                PRINT *," The matrix C has no none-zero element"
        ELSE
                PRINT *," The matrix C is too small for the result"
        END IF
        DEALLOCATE(R1,C1,V1,R2,C2,V2,R3,C3,V3)


CONTAINS
        !-- the main function
        INTEGER FUNCTION SparseAdd(R1,C1,V1,R2,C2,V2,R3,C3,V3,n,nz1,nz2,n3)
        INTEGER, DIMENSION(:), INTENT(INOUT)::R3,C3,V3
        INTEGER, DIMENSION(:), INTENT(INOUT)::R1,C1,V1,R2,C2,V2
        INTEGER, DIMENSION(n,n)::BigC3 !-- a n*n matrix which stores the whole matrix C
        INTEGER, DIMENSION(nz1)::RCOO1 !-- Row index for matrix 1 in COO format
        INTEGER, DIMENSION(nz2)::RCOO2 !-- Row index for matrix 2 in COO format
        INTEGER, DIMENSION(n3)::RCOO3 !-- Row index for matrix 3 in COO format
        INTEGER, INTENT(IN):: n,nz1,nz2,n3
        INTEGER :: i,j,k
        SparseAdd=0
        R3=0
        C3=0
        V3=0

        !-- Converting CSR format to COO to add them
        CALL CSRtoCOO(RCOO1,R1,n,nz1)
        CALL CSRtoCOO(RCOO2,R2,n,nz2) 
        BigC3=0
        !-- Adding two matrices to make BigC3 which is a 2D matrix
        DO i=1, nz1
                        BigC3(RCOO1(i),C1(i))=BigC3(RCOO1(i),C1(i))+ V1(i)
        END DO
        DO i=1, nz2
                        BigC3(RCOO2(i),C2(i))=BigC3(RCOO2(i),C2(i))+ V2(i)
        END DO

        !-- Checking to see if none-zero elements of BigC3 exceeds n3 or not
        DO i=1,n
                Do j=1,n
                        IF (BigC3(i,j).ne.0) SparseAdd=SparseAdd+1               
                END DO
        END DO

        IF (SparseAdd.le.n3) THEN       
                !- Making CSR out of BigC3        
                !-- Forming R
                DO i=1,n
                        IF(i.ne.1) R3(i)=R3(i-1)
                        Do j=1,n
                                IF (BigC3(i,j).ne.0) R3(i)=R3(i)+1
                        END DO
                END DO
                
                !-- Creating C3
                k=0
                DO i=1,n
                        DO j=1,n
                                IF (BigC3(i,j).ne.0) THEN 
                                        k=k+1
                                        C3(k)=j
                                END IF
                        END DO
                END DO           
                
                !-- Producing V3
                k=0
                DO i=1,n
                        DO j=1,n
                                IF (BigC3(i,j).ne.0) THEN 
                                        k=k+1
                                        V3(k)=BigC3(i,j)
                                END IF
                        END DO
                END DO                                
        ELSE
                SparseAdd=-1
        END IF     
        
        
        END FUNCTION SparseAdd
        !-------------------------------------------------------
        !-- helper subroutine to convert CSR to COO
        SUBROUTINE CSRtoCOO(RowCOO,RowCSR,n,nz) 
        INTEGER, DIMENSION(:), INTENT(INOUT) :: RowCOO,RowCSR
        INTEGER, INTENT(IN):: n ,nz
        INTEGER ::  i, j, b
        DO j=1,n
                IF (j==1) THEN
                        b=1
                ELSE
                        b=RowCSR(j-1)+1
                END IF
                DO i = b, RowCSR(j)
                        RowCOO(i)=j
                END DO       
        END DO
        END SUBROUTINE CSRtoCOO

END PROGRAM A7Q2

fortran 作业7

作业6

Question1
  !------------------------------------------------------------------------
! The fortran subroutine CSRorCSC(R,C,V, n, nz) which converts
! the CSR representation of a sparse matrix to its CSC representation
!-------------------------------------------------------------------------
! Also a program which enters a sparse matrix (in the COO format) and 
! creates its CSR Representation, invokes the CSRorCSC Subroutine and 
! output the result.
!-------------------------------------------------------------------------

PROGRAM A7Q1
    
    IMPLICIT NONE
    ! DECLARE VARIABLES
    INTEGER, DIMENSION(:,:), ALLOCATABLE :: A
    INTEGER, DIMENSION(3) :: B
    INTEGER :: i, j, size, m, n, check, k, rowIndex
    ! R, C, V
    INTEGER, DIMENSION(:), ALLOCATABLE :: DUMMY
    INTEGER, DIMENSION(:), ALLOCATABLE :: R
    INTEGER, DIMENSION(:), ALLOCATABLE :: C
    INTEGER, DIMENSION(:), ALLOCATABLE :: V
    

    
    ! GET THE SPARSE MATRIX IN COO FORMAT
    DO 
        PRINT *, "ENTER THE (SIZE OF MATRIX) m and n (OR 0 0 to END): "
        READ *, m ,n

        IF (m .eq. 0 .or. n .eq. 0) STOP
        IF (m .lt. 0 .or. n .lt. 0) THEN
            PRINT *, "NEGATIVE NUMBER OF ELEMENTS: "
            
        ELSE
            ! ALLOCATE THE ARRAY A
            ALLOCATE(A(m,n))
            PRINT "(1X, 'ENTER THE MATRIX VALUES OF A', I3, '*', I3, ' ELEMENTS:')", m, n
            READ *, ((A(i, j), i = 1, m), j = 1, n)


            ! DISPLAY USER INPUT (LATER WE WILL USE THE FORMATTING.)
            PRINT *, "COO FORMAT : "
            DO i = 1,m
                PRINT "(5X,15I5)", A(i,1:n)
            END DO



            
            ! CSRorCSC FORMAT
            size = 1
            DO i = 1, m
                DO j = i, n
                    IF (A(i, j) /= 0) THEN
                        size = size + 1
                    END IF
                END DO
            END DO

            PRINT *, size   ! 8 for demo sparse matrix

            ! ALLOCATING R, C, V
            ALLOCATE(DUMMY(size), STAT = check)
            ALLOCATE(R(m), STAT = check)
            ALLOCATE(C(size), STAT = check)
            ALLOCATE(V(size), STAT = check)

            ! GETTING THE R,C,V FOR CSR
            k = 1
            rowIndex = 0
            DO i = 1, m
                DO j = 1, n
                    IF (A(i, j) /= 0) THEN
                        DUMMY(k) = i
                        rowIndex = rowIndex + 1
                        C(k) = j
                        V(k) = A(i, j)
                        k = k + 1
                    END IF
                END DO
                R(i) = rowIndex
            END DO


            PRINT *, "CSR FORMAT: "
            PRINT *, "R: ", DUMMY
            PRINT *, "R: ", R
            PRINT *, "C: ", C
            PRINT *, "V: ", V



        END IF
    END DO


END PROGRAM A7Q1

fortran 作业6

question1
PROGRAM A6Q2
!-------------------------------------------------
! finding order depending on the array index
!-------------------------------------------------

IMPLICIT NONE
INTEGER, DIMENSION(:), ALLOCATABLE :: A
INTEGER :: n, check, result

PRINT *, "ENTER THE ARRAY SIZE (n) : "
READ *, n



DO 
    IF (n .EQ. 0) EXIT
    IF (n .LT. 0) THEN
        PRINT *, "ARRAY CANNOT BE NEGATIVE"

    ELSE
        ALLOCATE(A(n), STAT=check)
        
        PRINT *, "ENTER ARRAY ELEMENTS : "
        READ *, A

        result = FindOrder(A, n)
        PRINT *, "Order depending on Array index: ", A 
        
        DEALLOCATE(A)
    END IF
END DO 

CONTAINS

INTEGER FUNCTION FindOrder(A, n)
    INTEGER, DIMENSION(:), INTENT(INOUT) :: A
    INTEGER, INTENT(IN) :: n
    INTEGER, DIMENSION(n) :: temp
    INTEGER :: i,j

    DO i = 1, n
        ! here we check temp array have any value at index i
        ! if the index of i greater than index of i great that temp index item
        ! we move the item to next index
        IF ((temp(A(i)) .gt. 0) .and. (i .gt. temp(A(i))) )  THEN   
            !PRINT *, "checking"
            temp(A(i) + 1) = i
        ELSE 
            temp(A(i)) = i
        END IF
    END DO

    A = temp

END FUNCTION FindOrder

END PROGRAM A6Q2
question2
! -----------------------------------------------------
!   FINDING THE NEXT PERMUTATION.
!------------------------------------------------------
PROGRAM A6Q2
    IMPLICIT NONE
    INTEGER, DIMENSION(:), ALLOCATABLE :: A
    INTEGER :: n, check

    PRINT *, "ENTER THE ARRAY SIZE (n) : "
    READ *, n

    DO 
    IF (n .EQ. 0) EXIT
    IF (n .LT. 0) THEN
        PRINT *, "ARRAY CANNOT BE NEGATIVE"

    ELSE
        ALLOCATE(A(n), STAT=check)
        
        PRINT *, "ENTER ARRAY ELEMENTS : "
        READ *, A

        PRINT *, "PERMUTATION SEQUENCE :" 
        CALL NextPerm(A,n)
        
        
        DEALLOCATE(A)
    END IF
END DO 
    
    


CONTAINS
    SUBROUTINE NextPerm(A, n)
        INTEGER, INTENT(IN) :: A(:)
        INTEGER, INTENT(IN) :: n
        INTEGER             :: i, j, l, reminder
        INTEGER             :: idx(size(A,1)), stride(size(A,1))

        l = size(A,1)
        !PRINT *, l
        stride(1) = 1
        DO i = 2, l
            stride(i) = stride(i-1)*l
        END DO ! i

        DO i = 0,l ** l-1
            reminder = i
            DO  j=l,1,-1
                idx(j) = reminder / stride(j)
                reminder = reminder - idx(j) * stride(j)
            END DO ! j
            PRINT *, A(idx + 1)
        END DO ! i
    END SUBROUTINE

END PROGRAM A6Q2
    
    

fortran Assignment5

Assignment5

Question2
PROGRAM A5Q2
    IMPLICIT NONE
    
    ! DECLARING VARIABLES
    INTEGER, DIMENSION(:,:), ALLOCATABLE :: As
    INTEGER, DIMENSION(3):: B
    INTEGER :: i, n, j, k, temp, counter, rounder, result

    DO
    
        PRINT *, "ENTER m and n (OR 0 0 to END):"
        READ *, n
        IF (n .eq. 0 .or. n .eq. 0) STOP
        IF (n .lt. 0 .or. n .lt. 0) THEN
            PRINT *, "NEGATIVE NUMBER OF ELEMENTS"
        ELSE IF(n .gt. 15 .or. n .gt. 15) THEN
            PRINT *, "TO LARGE ARRAY. "
        ELSE

            ALLOCATE(As(n,n))
            PRINT *, "Enter the array values"
            READ *, (As(i,1:n), i=1,n)

            ! INITIALIZE VALUE
            temp = 1
            rounder = 1
            result = BLOCKS(As, n, B)

        END IF
    END DO

CONTAINS

    ! BLOCK FUNCTION WILL FIND THE DIAGONAL BLOCKS
    ! FROM M*N MATRIX
    INTEGER FUNCTION BLOCKS(A, n, B)
        INTEGER, DIMENSION(n, n), INTENT(IN) :: A
        INTEGER, INTENT(IN) :: n
        INTEGER, DIMENSION(3), INTENT(INOUT) :: B

        DO j = temp, n
        counter = 0
        DO k = temp, n
            if(A(j,k).ne.0) THEN
                counter = counter + 1
                CYCLE
            else
                EXIT
            END IF
        END DO
        if (counter .ne. 0) THEN
            B(rounder) = counter
            rounder = rounder + 1
        end if

        !print *, "counter", counter
        temp = k

        !print *, "temp", temp

        IF(temp.eq.n) EXIT
        END DO

        PRINT *, B

    END FUNCTION BLOCKS


END PROGRAM A5Q2
assignment5
  PROGRAM A5Q1
!--------------------------------------------------------------------------
!   Merge two array into and overlapping each other
!   Depending on array range
!--------------------------------------------------------------------------

    IMPLICIT NONE
    ! DECLARING VARIABLES
    INTEGER, DIMENSION(:), ALLOCATABLE :: X
    INTEGER, DIMENSION(:), ALLOCATABLE :: Y

    INTEGER :: i, j, k, ArraySize, check, result

    DO 
        ! get the array size from the user
        PRINT *, "ENTER THE NUMBER OF ELEMENTS IN ARRAY (OR 0 TO CLOSE.)"
        READ *, ArraySize

        ! 0 FOR CLOSE
        ! LESS THAN 0 FOR WARNING
        IF (ArraySize .EQ. 0) EXIT
        IF (ArraySize .LT. 0) THEN
            PRINT *, "NEGAIVE NUMBER OF ELEMENTS"
        ELSE
            ! ALLOCATING ARRAY OF X AND Y
            ALLOCATE(X(ArraySize), STAT=check)
            ALLOCATE(Y(ArraySize), STAT=check)

            IF (check .NE. 0) THEN
                PRINT "(1X, 'enter the values of X ', I3, ' elements: ')", ArraySize
                READ *, X

                PRINT "(1X, 'Enter the values of Y ', I3, ' elements: ')", ArraySize
                READ *, Y
            
                PRINT "(1X, 'DATA OF X: ', 15I5)", X
                PRINT "(1X, 'DATA OF Y: ', 15I5)", Y
                
                result = MergeOverlap(X, Y, ArraySize)


                ! DEALLOCATING ARRAY
                DEALLOCATE(X, Y)
            END IF 
        END IF
    END DO


CONTAINS

INTEGER FUNCTION MergeOverlap(X, Y, n)
    INTEGER, DIMENSION (:), INTENT(INOUT) :: X
    INTEGER, DIMENSION (:), INTENT(INOUT) :: Y
    INTEGER, INTENT(IN) :: n
    INTEGER :: i, j, k, xk, yk, tempx, tempy, num

    ! CHECK THE CONDITION
    num = SIZE(X)
    DO i = 1, num - 1
        DO j = i + 1, num 
            ! xi ≤ xj ∧ xj ≤ yi ∨ xj ≤ xi ∧ xi ≤ yj
            IF ( (X(i) .LE. X(j)) .AND. (X(j) .LE. Y(i)) .OR. (X(j) .LE. X(i)) .AND. (X(i) .LE. Y(j))) THEN 
                ! get the first item of xi, xj and yi, yj
                IF(i == 1) THEN
                    xk = Min( X(i), X(j))
                    yk = Max( Y(i), Y(j))
                ELSE
                    xk = Min( xk, X(j))
                    yk = Max( yk, Y(j))
                END IF
            END IF
        END DO
    END DO

    PRINT *, "Overlapping", xk, yk
    
END FUNCTION MergeOverlap

END PROGRAM A5Q1

fortran 作业4

作业4问题:1

question2
  PROGRAM assignment4Question2

    IMPLICIT NONE
    INTEGER, DIMENSION (:, :), ALLOCATABLE :: Ad
    INTEGER, DIMENSION (15, 15) :: As
    INTEGER :: i, j, m, n, check
    INTEGER :: result

    DO
        PRINT *, "ENTER m and n (OR 0 0 to END):"
        READ *, m, n


        IF (m .eq. 0 .or. n .eq. 0) STOP
        IF (m .lt. 0 .or. n .lt. 0) THEN
            PRINT *, "NEGATIVE NUMBER OF ELEMENTS"
        ELSE IF(m .gt. 15 .or. n .gt. 15) THEN
            PRINT *, "TO LARGE ARRAY. "
        ELSE
            PRINT "(1X, 'ENTER THE VALUES A', I3, '*', I3, ' ELEMENTS:')", m, n
            READ *, ((As(i, j), i = 1, m), j = 1, n)

            result = COUNTBLOB(As, m, n)
            PRINT *, "NUMBER OF BLOBS :", result
        END IF
    END DO

CONTAINS


INTEGER FUNCTION COUNTBLOB(A, m, n)
    INTEGER, DIMENSION (m, n) :: A
    INTEGER, INTENT(IN) :: m, n
    INTEGER :: count, item


    ! check the first section
    IF (A(1,2) == 0 .or. A(2,1) == 0) THEN
        IF (A(1,1) /= 0) THEN
            count = count + 1;
        END IF
    END IF 

    IF (A(1,n-1)==0 .or. A(2,n)==0) THEN
        IF (A(1,n)/=0) THEN
            count=count+1;
        END IF
    END IF 
    
    IF (A(m-1,1)==0 .or. A(m,2)==0) THEN
        IF (A(m,1)/=0) THEN
            count=count+1;
        END IF
    END IF 
  
    IF (A(m,n-1)==0 .or. A(m-1,n)==0) THEN
        IF (A(m,n)/=0) THEN
            count=count+1;
        END IF
    END IF 
  
    ! CHECK SECTION 2
    DO  j = 2, n-1
        IF (A(1,j) /= 0) THEN
            IF (A(1,j-1) == 0) THEN
                item = item + 1;
            END IF
            IF (A(1,j+1)==0) THEN
                item = item + 1;
            END IF
            IF (A(2,j)==0) THEN
                item = item + 1;
            END IF
            IF (item == 2) THEN
                count = count + 1;
            END IF  
        END IF
        item = 0;
    END DO 
  
    DO  j = 2, n - 1
        IF (A(m,j) /= 0) THEN
            IF (A(m,j-1) == 0) THEN
                item = item + 1;
            END IF
            IF (A(m,j+1) == 0) THEN
                item = item + 1;
            END IF
            
            IF (A(m-1,j) == 0) THEN
                item = item + 1;
            END IF
            IF (item == 2) THEN
                count = count + 1;
            END IF  
        END IF
        item = 0;
    END DO 
    
    DO  i = 2, m - 1
        IF (A(i,1) /= 0) THEN
            IF (A(i-1,1) == 0) THEN
                item = item + 1;
            END IF
            IF (A(i + 1, 1) == 0) THEN
                item = item + 1;
            END IF
        
            IF (A(i,2) == 0) THEN
                item = item + 1;
            END IF
        
            IF (item == 2) THEN
                count=count+1;
            END IF  
        END IF
        item = 0;
    END DO 
  
    DO  i = 2, m - 1
        IF (A(i,n) /= 0) THEN
            IF (A(i-1,n) == 0) THEN
                item = item + 1;
            END IF
            
            IF (A(i+1,n)==0) THEN
                item = item + 1;
            END IF
            
            IF (A(i,n-1)==0) THEN
                item = item + 1;
            END IF
            
            IF (item == 2) THEN
                count = count + 1;
            END IF  
        END IF
        item = 0;
    END DO 
  
    ! CHECK SECTION 3
    DO  i = 2, m - 1
        DO  j = 2, n - 1
            IF (A(i,j) /= 0) THEN
                IF (A(i+1,j) == 0) THEN
                    item = item + 1;
                END IF
                IF (A(i-1,j) == 0) THEN
                    item = item + 1;
                END IF
            
                IF (A(i,j+1) == 0) THEN
                    item = item +1;
                END IF
            
                IF (A(i,j-1) == 0) THEN
                    item = item + 1;
                END IF
            
                IF (item == 3) THEN
                    count = count + 1;
                END IF     
            
                item = 0;
            END IF
        END DO 
    END DO 
  
    ! GETTING THE NUMBER OF BLOBs
    result = count/2;
    COUNTBLOB = result

END FUNCTION COUNTBLOB
END PROGRAM assignment4Question2
a4q1
PROGRAM ORDERING
!-------------------------------------------------------
! An example of Allocatable array and selection sort as 
! a subroutine (with an INOUT parameters)
!---------------------------------------------------------
    IMPLICIT NONE
    ! declaring variable
    INTEGER, DIMENSION(:), ALLOCATABLE :: Aone
    INTEGER :: k, check, result


    DO 
        PRINT *, "Enter the number of elements (OR 0 TO STOP):"
        READ *, k

        IF (k .eq. 0) STOP
        IF (k .lt. 0) THEN
            PRINT *, "negative number of elements"
        ELSE
            ! allocating array
            ALLOCATE(Aone(k), STAT = check)
            IF (check .ne. 0) THEN
                PRINT "(1X, 'enter the values of', I3,' elements: ')", k
                READ *, Aone
                PRINT "(1X, 'data:', 15I5)", Aone
                result = CountSeq(Aone, k)
                PRINT *, "RESULT:", result
                ! deallocating array
                DEALLOCATE(Aone)
            END IF
        END IF
    END DO


CONTAINS
    ! AN IMPLEMENTATION OF CountSeq
    INTEGER FUNCTION CountSeq(A, k)
        INTEGER, DIMENSION (:), INTENT (INOUT) :: A
        INTEGER, INTENT(IN) :: k
        INTEGER :: count = 0, currItem, nextItem, i, zero = 0
        CHARACTER*3 :: state

        ! CHECK EVERY ITEM IS 0 THEN CLOSE
        DO i = 1, k - 1
            IF (A(i) .eq. 0) THEN
                zero = zero + 1
            END IF
        END DO

        ! IF ALL ELEMENTS ARE 0 THEN CLOSE 
        IF (zero /= k) THEN
            DO i = 1, k - 1
                currItem = A(i)
                nextItem = A(i + 1)
                IF (A(i + 1) .eq. currItem) THEN
                    state = 'oke'

                ! if the previous item not equal to next time, greater than and the state is increasing
                ! it will change the state to increment and increment the weakly increasing
                ELSE IF (A(i + 1) .gt. A(i) .and. currItem .ne. nextItem .and. (state /= 'inc')) THEN 
                    count = count + 1
                    state = 'inc'

                ! if the previous item not equal to next time, less than and the state is increasing
                ! it will change the state to increment and increment the weakly decreasing
                ELSE IF(A(i + 1) .lt. A(i) .and. currItem .ne. nextItem .and. (state /= 'dec')) THEN
                    count = count + 1
                    state = 'dec'
                END IF

                ! set the final result
                CountSeq = count

            END DO

        ELSE
            PRINT *, "PROGRAM CLOSE"
        END IF

    END FUNCTION CountSeq
END PROGRAM ORDERING

fortran Assignment3

Assignment3

question2
!-----------------------------------------------------------------------------------------------------
! This Fortran program finds the root of a function f(x) = x^3 + 2x^2 + x + 1 using the Secant Method
! where limits is the number of iteration steps can be no-convergent when the initial value a and b
! are not so close.
! it will also display the number o iteration used for finding the solution. 
!-----------------------------------------------------------------------------------------------------

PROGRAM SECANTMETHOD
    IMPLICIT NONE
    
    ! Declare variables
    REAL*8 ::a, b, eps, result
    INTEGER :: iter = 0, limit
    

    DO
        ! getting the value of a, b, eps, limits
        PRINT *, "----------------------------------------------------------------------------"
        PRINT *, "Please enter the value of a, b, eps and limit with spaces/commas"
        READ *, a, b, eps, limit
        
        IF (a .eq. 0 .and. b .eq. 0) THEN
            PRINT *, "PROGRAM EXIT!!!"
            EXIT
        ELSE
            ! the secant method will the find the approximate root uses
            ! two intial values a and b which are "close" to the solution.
            result = SECANT(a, b, eps, iter, limit)
            PRINT *, "RESULT: ", result
        END IF
        
    END DO

CONTAINS

    ! this secant function finds the approximate root uses two intial value of a and b
    ! and each itteration step an approximation x to the solution determine by the 
    ! secant line
    REAL*8 FUNCTION SECANT(a, b, eps, iter, limit)
        REAL*8 :: a, b, x
        INTEGER :: counter = 0
        REAL*8, INTENT (IN) :: eps
        INTEGER, INTENT(IN) :: limit, iter
    
        ! if the absoulate difference is less than eps # EXIT
        DO WHILE(abs(a - b) > eps)
            counter = counter + 1
            
            IF (limit .eq. counter) THEN
                PRINT *, "Result Not Found!! "
                PRINT *, "Number of tires: ", limit
                PRINT *, "Last Result is: "
                EXIT
            END IF

            IF ( f(b) .eq. f(a)) THEN
                b = b + 1
            END IF

            ! to find the x we have to draw a stright line betwen the a and b
            x = b - ((b - a) * f(b)) / (f(b) - f(a))
            a = b
            b = x
        END DO

        IF (iter .lt. limit) THEN
            PRINT *, "Number of tires: ", counter
        END IF

        SECANT = a
    END FUNCTION SECANT


    ! the testing function is f(x) = x^3 + 2x^2 + x + 1 
    REAL*8 FUNCTION f(x)
        REAL*8, INTENT(IN) :: x
        f = (x * x * x) - (2 * x * x) + x + 1
    END FUNCTION f


END PROGRAM SECANTMETHOD
question1
PROGRAM expFunction1

IMPLICIT NONE
REAL :: x, y, z
! declare the value of the 2
x = -2.0

PRINT *, x, exp(x)
DO WHILE (x .lt. 6.25)
    y = exp(x)
    z = myexp(x)
    PRINT "(1X, F7.3, 2F12.6, 2(1PE13.5))", x, y, z, y, z
    x = x + 0.5
END DO


CONTAINS
REAL FUNCTION myexp(x)
    REAL, INTENT(IN) :: x
    REAL :: approx, sum, sum_prev, counter
    approx = x
    counter = 1.0
    sum_prev = 0.0
    sum = x

    DO WHILE (sum .ne. sum_prev)
        sum_prev = sum
        counter = counter + 1.0 
        approx = -(approx * (x / counter))
        sum = sum + approx
    END DO

    myexp = sum
END FUNCTION myexp


END PROGRAM expFunction1

fortran 作业2

作业2 <br/>问题:1

assignment 2
PROGRAM SQRTofPositiveNumber
! -------------------------------------------------------------------------
! This program finds an apporximation of the square Root using mysqrt
! function. mysqrt function reads consecutive values a and prints a its 
! approximated square root utill a negative values of a is entered
! -------------------------------------------------------------------------
    IMPLICIT NONE

    ! Declare variable
    REAL :: start, close, step
    REAL :: temp, mysqrtx

    PRINT *, "Enter starting, ending, and number of steps: "
    READ (*, *) start, close, step
    temp = start
    DO 
        ! Stop when start value > end value
        IF ( temp > close) EXIT

        ! find the square root with mysqrt(temp)
        mysqrtx = mysqrt(temp)
        
        ! display the result
        PRINT *, mysqrtx
    
        ! move on the next value
        temp = temp + step
    END DO

CONTAINS


!-------------------------------------------------------------------
! mysqrt finds an apporximation of the square root. If the input
! the process continues until the difference b/w two consecutive
! values of x is sufficiently small
!-------------------------------------------------------------------
REAL FUNCTION mysqrt(value)
    IMPLICIT NONE
    
    ! Declare local variable
    REAL, INTENT(IN) :: value
    REAL :: X, Xi
    REAL, PARAMETER :: Tolerance = 0.00001

    ! input value is 0 return 0
    IF (value == 0.0) THEN
        mysqrt = 0.0
    ELSE 
        X = abs(value)
        DO  
            ! follow the equation 
            ! Xi + 1 = 0.5 (Xi + a/Xi)
            Xi = 0.5 * (X + value/X)
            IF (abs(X - Xi) < Tolerance) EXIT

            ! Swap the new item Xi
            X = Xi  
        END DO

        mysqrt = Xi
    END IF

END FUNCTION mysqrt

END PROGRAM SQRTofPositiveNumber
question_1
PROGRAM GREATESTCOMMONDIVISOR
! -----------------------------------------------------------------------------
! this a program which read a pair of integer numbers and uses GCD(a,b) to find
! the greatest common divisor for each pair until a pair of zeros is entered
! indicate the end of data
! -----------------------------------------------------------------------------
    IMPLICIT NONE

    ! Declaring variables
    INTEGER :: a, b, result

    DO
        ! read two positive number
        PRINT *, "Enter two(positive) integer number : "
        READ(*, *) a, b
        
        IF(a .eq. 0 .and. b .eq. 0) THEN
            PRINT *, "Program Exit"
            STOP
        ELSE IF(b .eq. 0) THEN
            ! when b = 0 then GCD(a, b) = a
            result = a
            PRINT *, "The greatest commoin divisor is : ", result
        ELSE
            ! GCD(a, b) will find the greatest common divisor
            result = GCD(a, b)
            PRINT *, "The greatest common divisor is: ", result
        END IF

    END DO

    
CONTAINS

! GCD(a,b) is a fortran function, which finds and returns the greatest 
! common divisor of a and b. 
INTEGER FUNCTION GCD(a, b)
    INTEGER :: a, b
    ! temp will be used for swap
    INTEGER :: temp, reminder

    
    ! will swaped if a < b
    IF (a < b) then
        temp = a
        a = b
        b = temp
    END IF


    DO 
        ! when a <= b, calculate the reminder
        ! if reminder is 0, the GCD = b
        reminder = MOD(a, b)
        IF (reminder == 0) EXIT
        a = b
        b = reminder
    END DO

    GCD = b
END FUNCTION GCD

END PROGRAM GREATESTCOMMONDIVISOR