2016-11-18 7 views
-2
PROGRAM maxmin 

IMPLICIT NONE 


INTEGER :: openStatus, ioStatus  
INTEGER :: counter, counter2, counter3     
INTEGER :: numberOfInts    
INTEGER :: int_val, max_int, min_int      

OPEN (UNIT=12, FILE="INT.DAT", STATUS="OLD", ACTION="READWRITE", IOSTAT=openStatus) 

IF (openStatus > 0) THEN 
    WRITE (*, '(1X, A)') "Can't open file" 
    STOP 
END IF 

WRITE (*, '(1X, A)') "How many integers do you want to read?" 
READ (*, '(I6)') numberOfInts 

DO counter = 1, numberOfInts 

    READ (12, '(1X, I5)', IOSTAT = ioStatus) int_val 

    IF (ioStatus < 0) THEN 
    WRITE (*, '(1X, A)') "End of file" 
    EXIT 
    END IF 

END DO 

DO counter2 = 1, numberOfInts, 1 

    If (counter2 == 1) Then 
     max_int = int_val 
    END IF 
    If (int_val > max_int) Then 
     max_int = int_val 
    END IF 

END DO 

DO counter3 = 1, numberOfInts, 1 

    If (counter3 == 1) Then 
     min_int = int_val 
    END IF 
    If (int_val < min_int) Then 
     min_int = int_val 
    END IF 

END DO 

WRITE (*, '(1X, A)', ADVANCE = "NO") "The max is:" 
WRITE (*, '(1X, I4)') max_int 

WRITE (*, '(1X, A)', ADVANCE = "NO") "The min is:" 
WRITE (*, '(11X, I4)') min_int 

CLOSE (12) 

END PROGRAM maxmin 

Text FileКак найти максимальное и минимальное значение из текстового файла в Fortran

Из изображения выше, когда я печати макс и мин значения, они всегда печатать последний номер в этом текстовом файле, который равен 7. Я не понимаю, как решить проблему.

Я знаю, что весь код верен, но что минимальная часть кода определенно не является. Я так растерялся.

+0

«сниппет» недостаточно, чтобы увидеть, что происходит. Как устанавливается 'int_val'? являются 'a, b' объявленным целым числом? Что именно вы сообщаете? – agentp

+0

@agentp Позвольте мне сделать быструю программу, которая поможет – Master

+0

@agentp Я просто разместил код. Теперь вы сможете помочь. – Master

ответ

1

Что это

DO counter = 1, numberOfInts 

    READ (12, '(1X, I5)', IOSTAT = ioStatus) int_val 

    IF (ioStatus < 0) THEN 
    WRITE (*, '(1X, A)') "End of file" 
    EXIT 
    END IF 

END DO 

делает то, что он неоднократно читает один номер, то он читает другой номер и перезаписывает предыдущее значение и так далее. В конце int_val содержит последнее значение, так как все предыдущие значения были перезаписаны более поздними.

Поэтому, когда вы пришли сюда

DO counter2 = 1, numberOfInts, 1 

    If (counter2 == 1) Then 
     max_int = int_val 
    END IF 
    If (int_val > max_int) Then 
     max_int = int_val 
    END IF 

END DO 

int_val только последний номер, который был прочитан и что будет минимальным и максимальным.

Вы должны либо хранить значения в массиве или делать все в одном цикле:

max_int = -(huge(max_int)-1)  !make initial max_int very small 
min_int = huge(max_int)   !make initial min_int very big 

DO counter = 1, numberOfInts 

    READ (12, '(1X, I5)', IOSTAT = ioStatus) int_val 

    IF (ioStatus < 0) THEN 
    WRITE (*, '(1X, A)') "End of file" 
    EXIT 
    END IF 

    If (int_val > max_int) Then 
     max_int = int_val 
    END IF 

    If (int_val < min_int) Then 
     min_int = int_val 
    END IF 
END DO 
0

Другой способ использовать встроенные функции (MAXVAL, MAXLOC, MINVAL, MINLOC), а также поставить все, что вам значения в массив или вектор.

PROGRAM maxmin 
IMPLICIT NONE 

INTEGER     :: openStatus, ioStatus  
INTEGER     :: counter!, counter2, counter3     
INTEGER, PARAMETER  :: MaxIn = 1000000    
INTEGER, DIMENSION(MaxIn) :: int_val     
INTEGER     :: numberOfInts    
INTEGER     :: max_int, min_int      

OPEN (UNIT=12, FILE="INT.DAT", STATUS="OLD", ACTION="READWRITE", IOSTAT=openStatus) 

IF (openStatus > 0) THEN 
    WRITE (*, '(1X, A)') "Can't open file" 
    STOP 
END IF 

WRITE (*, '(1X, A)') "How many integers do you want to read?" 
READ (*, '(I6)') numberOfInts 

!Test array size.... 
IF(numberOfInts > MaxIn) THEN 
    WRITE (*, '(1X,A,I9,A,I7)') "Requested " , numberOfInts," However Array size=",MaxIn 
    STOP 
ENDIF 

DO counter = 1, numberOfInts 

    READ (12, '(1X, I5)', IOSTAT = ioStatus) int_val(Counter) 

    IF (ioStatus < 0) THEN 
    WRITE (*, '(1X, A)') "End of file" 
    EXIT 
    END IF 

END DO 

min_int = MINVAL(int_val(1:numberOfInts)) 
max_int = MAXVAL(int_val(1:numberOfInts)) 

WRITE (*, '(1X, A)', ADVANCE = "NO") "The max is:" 
WRITE (*, '(1X, I4)') max_int 

WRITE (*, '(1X, A)', ADVANCE = "NO") "The min is:" 
WRITE (*, '(11X, I4)') min_int 

CLOSE (12) 

END PROGRAM maxmin