3

数値を期待する read ステートメントがあります。非常に単純なコード例です。

program test
integer var
read(*,*) var
end

問題は、気が散っているため、通常は文字列 (つまり、yes ) を入力することです。コードが完全に停止するのを防ぎ、代わりに「入力した値が正しくありません」タイプのエラー メッセージを表示するにはどうすればよいですか。再試行しますか?

私は次のようなことを考えています:

    program test
    integer var
10  read(*,*) var
    if (var.not.a.number) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end

そのvar.not.a.number条件はどのようになりますか? 私はgfortranUbuntuでコンパイルするために使用します。


編集:ありがとうございました!HPM の 3 番目のオプションが最も単純だったので、最終的に実装することになりました。

    program test
    integer var,iostat,ios
10  read(*,*,iostat=ios) var
    if (ios.ne.0) then
      write(*,*)'You've entered an incorrect value. Try again'
      goto 10
    endif
    end

User7391すべてのコードを書く努力をしてくれた人に特に感謝します!

4

3 に答える 3

5

list-directed inputを使用しています。*ステートメントの 2 番目は、read(*,*)基本的に、コンパイラ/ランタイム システムに、integer. 入力を間違える自由を自分に与えたい場合は、(少なくとも) 3 つの選択肢があります。

  1. @ User7391の答えがすでに言っているように、入力を文字変数に読み込んで自分で解析することができます。その親切なユーザーは、あなたのためにコードを書くことさえ申し出てくれました!
  2. read コマンドをread(*,*,err=1234)where 1234is the label of your error-handling statement(s) のようなものに変更できます。このアプローチは現在ではかなり時代遅れと見なされており、嫌われる可能性があります。
  3. 読み取りコマンドを、ステートメントによって報告された (i/o ステータス フラグ)をキャッチする整数変数のようread(*,*,iostat=ios)なものに変更できます。次に、エラー処理の行を記述します。これは最新のアプローチであると考えられています。iosiostatreadif (iostat/=0) ...
于 2012-08-27T16:32:45.403 に答える
3

おそらく、値を文字変数に読み込み、それに応じてその文字変数を処理することができます。

数値のみが含まれている場合は、var に格納します。それ以外の場合は、エラーを報告してループ バックします。

文字が数値のみかどうかを確認するには、次のコード例を検討してください。

PROGRAM test
CHARACTER(len=100) :: input
LOGICAL :: is_numeric, success
INTEGER :: var

DO 
READ(*,*) :: input
IF (is_numeric(input)) THEN
  READ(input,*) var
  success = .TRUE.
ELSE
  WRITE(*,*) 'ERROR: Input is not numeric.'
END IF

IF (success) THEN
  break
END IF

END DO

END PROGRAM test


LOGICAL FUNCTION is_numeric(string)
  IMPLICIT NONE
  CHARACTER(len=*), INTENT(IN) :: string
  LOGICAL :: is_numeric
  INTEGER :: var
  INTEGER :: error_val
  READ(string,*,IOSTAT=error_val) x ! This line converts string to an integer
                            ! If there was an error, the error_val variable is
                            ! non-zero

  is_numeric = error_val==0

END FUNCTION is_numeric

サンプル コードの作成についてサポートが必要な場合はお知らせください。

文字を整数に変換できる必要があります。これは、内部の読み取り/書き込みステートメントで可能です。

于 2012-08-27T16:26:38.320 に答える
3

古い FORTRAN を使用する:

90 continue
read (*, *, err=90) number

これは、エラーをテストしてエラー メッセージを出力する、より複雑にすることができます。

于 2012-08-27T16:32:19.170 に答える