2017-12-09 4 views
0

여러 옵션 (검색 기록, 기록 추가, 기록 삭제, 기록 수정)이있는 메뉴가있는 프로그램이 있습니다. 내가하려는 것은 자동 채우기 기능입니다.Fortran에서 READ 문 변수를 미리 채우는 방법은 무엇입니까?

예 : 레코드 번호가 검색 옵션에 입력되었지만 데이터베이스를 검색 한 후에 해당 레코드를 찾을 수 없습니다. 그런 다음 다른 레코드 번호를 검색하거나 방금 입력 한 변수로 새 레코드를 추가하는 옵션이 프롬프트됩니다. 추가를 선택하면 프로그램이 add 서브 루틴을 호출하고 이미 read 문에 사용자가 검색 한 서브 루틴의 레코드로 자동 채우기를 원합니다.

내 코드는 다음과 같습니다 (검색 서브 루틴은 master.db에서 레코드 번호를 검색하기 위해 검색 기능을 사용하며 디스플레이 서브 루틴은 화면의 결과를 형식화 된 배열로 인쇄합니다) 검색 및 디스플레이 사용 정의 레코드의 문자와 정수 변수)와 마스터 모듈 : 추가 서브 루틴

SUBROUTINE search 
IMPLICIT NONE 
CHARACTER::readRecord*10, changeOpt*1 
INTEGER::recNum, search 

OPEN(20, FILE="master.db", FORM="FORMATTED", ACCESS="DIRECT", RECL=100) 
DO 
    CALL SYSTEM ("clear") 
    WRITE(*,"(2/,20X,A25)")"* * * Search Record * * *" 
    WRITE(*,100,ADVANCE="NO")"Please enter a record number or Q to exit:" 
100 FORMAT(1/,20X,A42,1X) 
    READ(*,200)readRecord 
200 FORMAT(A10) 

    IF(readSSN=="Q" .OR. readSSN=="q")RETURN 
    recNum=search(readRecord) 

    IF (recNum==0)THEN 
    CALL SYSTEM("clear") 
    WRITE(*,"(2/,20X,A26)")"* * * Display Record * * *" 
    WRITE(*,300,ADVANCE="NO")"Record ", readRecord," not found. ","Would you like to add a new record (Y/N)?" 
300 FORMAT(1/,20X,A7,A10,A12,1/,20X,A41,1X) 
    READ*,changeOpt 
    IF(changeOpt=="Y" .OR. changeOpt=="y") CALL add 
    CYCLE 
    ELSE 
    CALL display 
    WRITE(*,400,ADVANCE="NO")"Press ENTER to continue:" 
400 FORMAT(1/,20X,A24,1X) 
    READ*, 
    END IF 
END DO 
CLOSE(20) 
END SUBROUTINE search 

모든 업

recNum=search(readRecord) 

에 검색 루틴과 동일하다. 내가 원하는 것은 그것을 어떻게 든 일시적으로 검색 서브 루틴에

READ(*,200)readRecord 

에 입력 한 정보를 받아 저장하는 방법이며, 추가 서브 루틴 호출되면 다음, 자동으로

READ(*,200)readRecord 

에 입력 add 서브 루틴에서 사용자가 추가하려는 레코드 x 호를 다시 입력하지 않아도됩니다.

하는 방법입니다

나는이 달성 될 수 있다고 생각하지만 것 내가 구문을 모르는 :

! WRITE readRecord to some specific place in master.mod 
! CALL add 

! Once in add: 
! At READ(*,200)readRecord, search police.mod to check if it 
! has a readRecord already written in it. 
! If it does, autofill READ(*,200)readRecord with the readRecord 
! from police.mod. 
! Then delete readRecord from police.mod (so that if you go directly 
! into the add subroutine later, it doesn't autofill a record from a 
! previous search). 
! If there is no readRecord in police.mod then just prompt for user 
! to enter readRecord like in the search subroutine. 

어떤 제안을 크게 감상 할 수있다.

+0

자동 채우기를 검색 할 때 대개 일부 논리에 따라 자동으로 채우기를 의미하므로 * 자동 채우기 *를 * 사전 채우기 *로 변경하는 것이 좋습니다. 예를 들어 Tab 키를 누르면 디렉토리의 기존 파일 이름에 따라 입력 된 파일 이름의 일부가 자동 채워집니다. –

+0

몇 가지 의견.1) 질문을 설명하기 위해 좀 더 간단한 예제를 개발해야합니다. (실제로 데이터베이스와 관련이 있습니까? 정확하게는/틀린 것입니까?) 2) 분명히 특정 터미널 환경 (linux/xterm?)에 자신을 잠근 것입니다. 그것이 무엇이든 당신은 질문에 넣어야합니다. – agentp

답변

0

당신이 명확하게 말하지는 않지만, "READ 변수 자동 채우기" 문자열이 프롬프트의 화면에 미리 채워져 있고 사용자가이를 편집하거나 Enter 키를 누르기를 원한다고 가정합니다.

read 문을 사용하는 Fortran에서는 불가능합니다. 이 명령문은 이런 식으로 작동하지 않으며 그러한 옵션도 없습니다.

특정 라이브러리에서 비슷한 결과를 얻을 수 있습니다. 대개 C로 작성됩니다. read 문을 사용할 수 없으며 대개 C로 작성됩니다. 예를 들어 readlinencurses 라이브러리. 당신이 표준 포트란에서 할 수있는 것은 사용자가 빈 문자열을 입력하고 그 일이 있다면 몇 가지 기본 이전 값을 사용하기로 결정 경우 경우 조건을 가지고 확인하는 것입니다 pre-fill stdin in C

관련 참조하십시오.