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