Я на начальном уровне в Фортране.Недавно я попытался разработать простую программу для расчета перестановок и комбинаций.У него будет «меню», чтобы пользователь мог выбрать опцию для продолжения ...
!/*-------MAIN PROGRAM STARTS-------*/
!PURPOSE: TO CALCULATE COMBINATIONS AND PERMUTATIONS
PROGRAM COMBINATION_PERMUTATION
IMPLICIT NONE
!DECLARATION OF VARIABLES
REAL N, K, FACT, COMBINATION, PERMUTATION
INTEGER CHOICE
!CHOICE MENU
CALL MENU
!USER INPUT OF CHOICE
READ(*,*) CHOICE
!EXECUTION OF CODE BASED ON USER'S CHOICE
SELECT CASE(CHOICE)
CASE(1)
!CALLS SUBROUTINE FOR COMBINATION
CALL COMBINATION_CALC (N, K, FACT, COMBINATION)
CASE(2)
!CALLS SUBROUTINE FOR PERMUTATION
CALL PERMUTATION_CALC (N, K, FACT, PERMUTATION)
CASE(3)
!EXITS THE PROGRAM
STOP
CASE DEFAULT
!INVALID CHOICE LEADS TO MENU BACK
WRITE(*,*) 'INVALID CHOICE! PLEASE CHOOSE AN OPTION TO CONTINUE'
CALL MENU
END SELECT
END PROGRAM COMBINATION_PERMUTATION
!/*-------MAIN PROGRAM ENDS-------*/
!/*-------SUB PROGRAMS START-------*/
!FUNCTION FOR FACTORIAL
FUNCTION FACT(N)
IMPLICIT NONE
REAL FACT, N
INTEGER P, I
P=1
DO I=1, N
P=P*I
END DO
FACT=P
RETURN
END FUNCTION
!SUBROUTINE FOR MENU
SUBROUTINE MENU
IMPLICIT NONE
WRITE(*,*) ' CHOOSE AN OPTION TO CONTINUE.. '
WRITE(*,*) ' 1. COMBINATION '
WRITE(*,*) ' 2. PERMUTATION '
WRITE(*,*) ' 3. EXIT PROGRAM '
RETURN
END SUBROUTINE MENU
!SUBROUTINE FOR COMBINATION
SUBROUTINE COMBINATION_CALC (N, K, FACT, COMBINATION)
IMPLICIT NONE
REAL N, K, FACT, COMBINATION
WRITE(*,*) ' WHAT IS THE VALUE OF N? '
READ(*,*) N
2 WRITE(*,*) ' WHAT IS THE VALUE OF K? '
READ(*,*) K
IF (K<0) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
GO TO 2
ELSE IF (K>N)THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
GO TO 2
ELSE
END IF
COMBINATION=FACT(N)/(FACT(N-K)*FACT(N))
WRITE(*,*) ' HENCE, THERE ARE ', COMBINATION, ' WAYS TO ARRANGE. '
CALL MENU
RETURN
END SUBROUTINE COMBINATION_CALC
!SUBROUTINE FOR PERMUTATION
SUBROUTINE PERMUTATION_CALC (N, K, FACT, PERMUTATION)
IMPLICIT NONE
REAL N, K, FACT, PERMUTATION
WRITE(*,*) ' WHAT IS THE VALUE OF N? '
READ(*,*) N
3 WRITE(*,*) ' WHAT IS THE VALUE OF K? '
READ(*,*) K
IF (K<0) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
GO TO 3
ELSE IF (K>N) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
GO TO 3
ELSE
END IF
PERMUTATION=FACT(N)/FACT(N-K)
WRITE(*,*) ' HENCE THERE ARE', PERMUTATION,' WAYS TO ARRANGE. '
CALL MENU
RETURN
END SUBROUTINE PERMUTATION_CALC
!/*-------SUB PROGRAMS END-------*/
И я получаю ошибку во время выполнения всякий раз, когда я ввожу ввод 1 или 2, чтобы выбрать случай для продолжения....
Ошибка отображается во всплывающем окне следующим образом: -
RUN TIME ERROR
Попытка вызова подпрограммы с аргументом номер трикак реальное (kind = 1), когда требуется процедура.
COMBINATION_CALC- в файле комбинацииpermutation.for в строке 62 [+0068] main- в файле комбинацииpermutation.for в строке 23 [+ 00e2]
Насколько я знаю, аргумент номер три в COMBINATION_CALC - это "FACT", который является функцией для вычисления факториала.Я не могу понять ошибку.Пожалуйста, ведите меня.Заранее спасибо ..
ОБНОВЛЕНИЕ
Я исправил ОШИБКУ ВРЕМЕНИ, используя исправление, данное yosukesabai ... Моя программа завершена..но, INTEGER OVERFLOW это новая проблема для меня.Я изменил объявление REAL на INTEGER (KIND = 4) .. Когда значение N и значение K больше 12 ... итоговый ответ для комбинации и перестановки будет большим ... Могу ли я узнать, как это исправить?
Вот новый код для моей программы ...
!/*-------MAIN PROGRAM STARTS-------*/
!PURPOSE: TO CALCULATE COMBINATIONS AND PERMUTATIONS
!CREATED BY: RETHNARAJ RAMBABU
!DATE: 28/10/2011
PROGRAM COMBINATION_PERMUTATION
IMPLICIT NONE
!DECLARATION OF VARIABLES
INTEGER CHOICE, N, K
INTEGER(KIND=4) COMBINATION, PERMUTATION
INTEGER, external :: FACT
!CHOICE MENU
1 WRITE(*,*) ' CHOOSE AN OPTION TO CONTINUE.. '
WRITE(*,*) ' 1. COMBINATION '
WRITE(*,*) ' 2. PERMUTATION '
WRITE(*,*) ' 3. EXIT PROGRAM '
!USER INPUT OF CHOICE
READ(*,*) CHOICE
!EXECUTION OF CODE BASED ON USER'S CHOICE
SELECT CASE(CHOICE)
CASE(1)
!CALLS SUBROUTINE FOR COMBINATION
CALL COMBINATION_CALC (N, K, FACT, COMBINATION)
GO TO 1
CASE(2)
!CALLS SUBROUTINE FOR PERMUTATION
CALL PERMUTATION_CALC (N, K, FACT, PERMUTATION)
GO TO 1
CASE(3)
!EXITS THE PROGRAM
STOP
CASE DEFAULT
!INVALID CHOICE LEADS TO MENU BACK
WRITE(*,*) 'INVALID CHOICE! PLEASE CHOOSE AN OPTION TO CONTINUE'
GO TO 1
END SELECT
END PROGRAM COMBINATION_PERMUTATION
!/*-------MAIN PROGRAM ENDS-------*/
!/*-------SUB PROGRAMS START-------*/
!FUNCTION FOR FACTORIAL
FUNCTION FACT(N)
IMPLICIT NONE
INTEGER N, P, I, FACT
P=1
DO I=1, N
P=P*I
END DO
FACT=P
RETURN
END FUNCTION
!SUBROUTINE FOR COMBINATION
SUBROUTINE COMBINATION_CALC (N, K, FACT, COMBINATION)
IMPLICIT NONE
INTEGER N, K, FACT
INTEGER(KIND=4) COMBINATION
WRITE(*,*) ' WHAT IS THE VALUE OF N? '
READ(*,*) N
2 WRITE(*,*) ' WHAT IS THE VALUE OF K? '
READ(*,*) K
IF (K<0) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
GO TO 2
ELSE IF (K>N)THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
GO TO 2
ELSE
END IF
COMBINATION=FACT(N)/(FACT(N-K)*FACT(K))
WRITE(*,*) ' HENCE, THERE ARE ', COMBINATION, ' WAYS TO ARRANGE. '
RETURN
END SUBROUTINE COMBINATION_CALC
!SUBROUTINE FOR PERMUTATION
SUBROUTINE PERMUTATION_CALC (N, K, FACT, PERMUTATION)
IMPLICIT NONE
INTEGER N, K, FACT
INTEGER(KIND=4)PERMUTATION
WRITE(*,*) ' WHAT IS THE VALUE OF N? '
READ(*,*) N
3 WRITE(*,*) ' WHAT IS THE VALUE OF K? '
READ(*,*) K
IF (K<0) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
GO TO 3
ELSE IF (K>N) THEN
WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
GO TO 3
ELSE
END IF
PERMUTATION=FACT(N)/FACT(N-K)
WRITE(*,*) ' HENCE THERE ARE', PERMUTATION,' WAYS TO ARRANGE. '
RETURN
END SUBROUTINE PERMUTATION_CALC
!/*-------SUB PROGRAMS END-------*/