PROGRAM ASSIG4SOL

 

IMPLICIT NONE 

INTEGER :: N, Z

CHARACTER :: Flag

DO

            PRINT *, "Enter a positive integer (N), greater than or equal to 7:"

            READ *, N

            PRINT *, "Sum7= ", REC_FUN_SUM7(N), " (RECURSIVE FUNCTION)"

            PRINT *, "Sum7= ", FUN_SUM7(N), " (nonrecursive FUNCTION)"

            CALL REC_SUB_SUM7(N,Z)

            PRINT *, "Sum7= ", Z, " (RECURSIVE SUBROUTINE)"

            CALL SUB_SUM7(N,Z)

            PRINT *, "Sum7= ", Z, " (nonrecursive SUBROUTINE)"

            PRINT *, 'Continue? If not, press "n" or "N"; else press any other key.'

            READ *, Flag

            IF ((Flag=="n") .OR. (Flag=="N")) THEN

                        EXIT

            END IF

END DO

CONTAINS

            FUNCTION FUN_SUM7(N)

                        INTEGER, INTENT(IN) :: N

                        INTEGER :: FUN_SUM7, I

                        FUN_SUM7=0

                        DO I=1, N

                                    IF (MOD(I,7)==0) THEN

                                                FUN_SUM7=FUN_SUM7+I

                                    END IF

                        END DO

            END FUNCTION FUN_SUM7

 

            RECURSIVE FUNCTION REC_FUN_SUM7(N) RESULT (MySum7)

                        INTEGER, INTENT(IN) :: N

                        INTEGER :: MySum7

                        IF (N==7) THEN

                                    MySum7=7

                        ELSE

                                    IF (MOD(N,7)==0) THEN

                                                MySum7=N+REC_FUN_SUM7(N-7)

                                    ELSE

                                                MySum7=REC_FUN_SUM7(N-1)

                                    END IF

                        END IF

            END FUNCTION REC_FUN_SUM7

 

            SUBROUTINE SUB_SUM7(N, MySum7)

                        INTEGER, INTENT(IN) :: N

                        INTEGER, INTENT(OUT) :: MySum7

                        INTEGER :: I

                        MySum7=0

                        DO I=1, N

                                    IF (MOD(I,7)==0) THEN

                                                MySum7=MySum7+I

                                    END IF

                        END DO

            END SUBROUTINE SUB_SUM7

 

            RECURSIVE SUBROUTINE REC_SUB_SUM7(N, MySum7)

                        INTEGER, INTENT(IN) :: N

                        INTEGER, INTENT(OUT) :: MySum7

                        IF (N==7) THEN

                                    MySum7=7

                        ELSE

                                    IF (MOD(N,7)==0) THEN

                                                CALL REC_SUB_SUM7(N-7, MySum7)

                                                MySum7=N+MySum7

                                    ELSE

                                                CALL REC_SUB_SUM7(N-1, MySum7)

                                    END IF

                        END IF

            END SUBROUTINE REC_SUB_SUM7

 

END PROGRAM ASSIG4SOL