1

okay, in my program i open a .txt file with three columns. 1st column has integers, 2nd has a name (character string), and 3rd has real numbers. i have figured out how to search the integers and real numbers for the item the user enters (compare variables to the arrays storing the columns)...but when i try to search for a name entered by the user, in the character array, it never works. here is a all my code... i am looking for help in CASE(2)

~ n holds the number of lines in the file

PROGRAM database
IMPLICIT NONE

CHARACTER(30)::file, search
INTEGER::err, n, m, i, k, searchtype, recordnum
LOGICAL:: alive
REAL:: grade
REAL, ALLOCATABLE:: arrayr(:)
INTEGER, ALLOCATABLE:: arrayi(:)
CHARACTER(15), ALLOCATABLE:: arrayc(:)
CHARACTER(15)::name

101 FORMAT(A)

DO
    WRITE(*,101) "What is the filename?"
    READ(*,*) file

    INQUIRE(FILE=file, EXIST=alive)
    IF (alive.EQV..TRUE.) THEN
        WRITE(*,101) "The file exists"
        OPEN (UNIT=11, FILE=file, STATUS="OLD", ACTION="READ", IOSTAT=err)
        IF (err .NE. 0) THEN    
            WRITE(*,'(2A)')"There was an error opening ", file
            STOP
        END IF
        EXIT
    ELSE IF (alive.EQV..FALSE.) THEN        
        WRITE(*,'(2A)') "There is no file by the name of: ", file
        CYCLE
    END IF
END DO


n= 0
DO
    READ(11,*,IOSTAT=k)
    IF(k.EQ.-1) EXIT
    n=n+1
END DO
REWIND(11)
ALLOCATE(arrayi(n),arrayc(n),arrayr(n))


DO i=1,n,1
    READ(11,'(I4,A,F12.2)') arrayi(i), arrayc(i), arrayr(i)
END DO

outer: DO
    DO
        WRITE(*,101)"How would you like to search the file?"
        WRITE(*,101)"1) By record number"
        WRITE(*,101)"2) By name"
        WRITE(*,101)"3) By rating"
        READ(*,*) searchtype
        SELECT CASE (searchtype)
            CASE(1)
                WRITE(*,101) "Please enter the record number:"
                READ(*,*) recordnum
                m=0
                DO i=1,n,1
                    IF (arrayi(i).EQ.recordnum) THEN
                        WRITE(*,'(I4,A,F12.2)')arrayi(i),arrayc(i), arrayr(i)
                    ELSE IF (i==n) THEN
                        write(*,*)"Sorry dude. The name you entered     was not found. Search failed"
                    END IF
                END DO
                EXIT
            CASE(2)
                WRITE(*,101) "Please enter the name:"
                READ(*,*) name
                m=0
                DO i=1,n
                    IF (name.EQ.arrayc(i)) THEN
                        WRITE(*,'(I4,A,F12.2)')arrayi(i), arrayc(i), arrayr(i)
                    ELSE IF (i==n) THEN
                        write(*,*)"Sorry dude. The name you entered was not found. Search failed"
                    END IF
                END DO
                EXIT
            CASE(3)
                WRITE(*,101) "This will return all graders greater than your search term"
                WRITE(*,101) "Please enter the minimum grade:"
                READ(*,*) grade
                m=0
                DO i=1,n,1
                    IF (arrayr(i).GT.grade) THEN
                        WRITE(*,'(I4,A,F12.2)')arrayi(i), arrayc(i), arrayr(i)
                    ELSE IF (i==n) THEN
                        write(*,*)"Sorry dude. The name you entered was not found. Search failed"
                    END IF
                END DO
                EXIT
            CASE DEFAULT
                WRITE(*,101) "Invalid entry. Please enter 1, 2, or 3."
                CYCLE
        END SELECT
    END DO


    inner: DO
        WRITE(*,101)"Would you like to search again? (Y/N)"
        READ(*,*)search
            SELECT CASE (search)
                CASE("Y","y")
                    CYCLE outer
                CASE("N","n")
                    EXIT outer
                CASE DEFAULT
                    WRITE(*,101)"Invalid entry. please enter Y or N."
                    CYCLE inner
                END SELECT
    END DO inner
END DO outer


END PROGRAM database

everytime i select case(2) in the program and then enter a name I KNOW EXISTS in the character arrayc, it skips over the if clause where (name.EQ.arrayc) and returns that the name was not found. PLEASE HELP! i am very open to other ways of doing this. i dont understand why this is happening.

There is a screenshot on this link: http://tinypic.com/r/33tmmuc/6

4

1 に答える 1

1

----編集-ソリューション----

文字列を奇妙な形式で読み、スペースで始まります。比較のためにこれを使用してください:

if (name==adjustl(arrayc(i))) then

ハンドブックで何ができるかを確認してください。

大文字と古語の.EQを取り除くことを検討してください。演算子。

より適切な形式を使用し、それらのラベルを使用せずに、文字列変数または定数を使用します。何かとして

'(i4,2x,a15,F12.0)'

大丈夫かもしれません、数字の正しい値を確認してください。としてF12.2読み取ることに注意してください。1001.00

また、ループを間違って実装しました。あなたが答えを見つけた後、ちょうどそのexit場所にあるはずです。

----編集-ソリューション----

私のために働く:

CHARACTER(15), ALLOCATABLE:: arrayc(:)
CHARACTER(30)::name
INTEGER:: n

    allocate(arrayc(1))
    arrayc = (/"ok1","ok2"/)
    n=2
    write(*,*) arrayc(1)

    WRITE(*,*) "Please enter the name:"
    READ(*,*) name
    m=0
    DO i=1,n,1
        IF(name.EQ.arrayc(i)) THEN
            WRITE(*,'(A)') arrayc(i)
        ELSE IF (name.NE.arrayc(i)) THEN
            m=m+1
        END IF
    END DO
    IF (m.EQ.n) THEN
        WRITE(*,*)"Sorry dude. The name you entered was not found. Search failed"
    END IF
end

走る:

> ./a.out 
 ok1            
 Please enter the name:
ok1
ok1

正しいことを確認してくださいn。また、確実に文字配列を印刷してみてください。どちらが長すぎるかを比較しないように注意してnameください(変数は配列内の文字列の2倍の長さです)。ループの後でループインデックスの値を比較するというあなたの慣習は疑わしいです、その値は未定義です。

ループ構造を完全に書き直します。何か:

   ...
    WRITE(*,*) "Please enter the name:"
    READ(*,*) name

    do i=1,n
        if(name.EQ.arrayc(i)) then
            write(*,'(A)') arrayc(i)
            exit
        else if (i==n) then
            write(*,*)"Sorry dude. The name you entered was not found. Search failed"
        end if

    end do

end
于 2012-10-18T19:24:54.340 に答える