データをプログラムの中に書き込むのは見通しが悪いので、ファイルから読み込むことにします。
強調されている部分は直接入力(半角)でいれます。QAは大文字でなければなりません。"."(ドット)も忘れずに入れます。これは後でプログラムをこのような形式を読むように設計するからです。問題は自分で考えてください。10問まで読み込めるように作ります。
Q.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? 1.メソッド 2.インスタンス 3.コンスタンス A.1 Q.例外処理でtryとともに用いられるものは? 1.error 2.while 3.catch A.3
Q.が行頭にある行は問題、1.2.3.が行頭にあるのは選択肢、A.が行頭にあるのは正解の番号を表しています。これ以外の文字で始まる行は無視されます。
すべての問いは問題文と、3つの選択肢からなります。これにどれが正解かの情報を加えて「問い」のクラスとします。これはコンパイルだけします。実行できません。
public class Toi { String question; String ans1; String ans2; String ans3; int seikai; }
この Toi というクラスを使って Mondaishuu というクラスを作ります。
ここではコンストラクタが大活躍。new するときにファイルを指定して(fname)、そこから問題を読み込みます。問題数も指定する(toimax)ようにしていまが,実際の問題数よりも多く指定しても問題ありません。少なく指定するとそれを越える問題は読み込まれません。
import java.io.*; public class Mondaishuu { // フィールド Toi[] toi; int mondaisu; int seikaict; int gotouct; //コンストラクタ public Mondaishuu( String fname, int toimax ){ toi = new Toi[toimax]; seikaict=0; gotouct =0; int ct =0; try { FileReader in = new FileReader(fname); BufferedReader inb = new BufferedReader(in); String line; while ((line = inb.readLine()) != null && ct < toimax){ if (line.indexOf("Q.")==0){ toi[ct] = new Toi(); toi[ct].question = line.substring(2); System.out.println("-"+ (ct)); } else if (line.indexOf("1.")==0){ toi[ct].ans1 = line; } else if (line.indexOf("2.")==0){ toi[ct].ans2 = line; } else if (line.indexOf("3.")==0){ toi[ct].ans3 = line; } else if (line.indexOf("A.")==0){ toi[ct].seikai = Integer.parseInt(line.substring(2)); ct++; } } System.out.println("読込終了。"); inb.close(); in.close(); } catch (IOException e) { System.out.println( fname + " がないのでは?" ); System.out.println( e); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("読込中に例外が発生。" ); System.out.println( e); } mondaisu=ct; } //メソッド public String check( int n, int ans ){ if (toi[n].seikai == ans ){ seikaict++; return "○"; } else{ gotouct++; return "×"; } } }
ファイル読込の詳細は今回は省略。
例外処理はこのように複数にできます。System.out.println( e) でjavaが用意した一般的なメッセージが出ます。本当は目的に合わせていろいろな処理をします。誰が使うかわからないプログラムだと本体よりも例外処理が複雑になるものです。今回はプログラム開発中に起こりそうな例外に合わせてメッセージを出すだけで簡単に済ませています。
メソッドは問題番号と解答を受け取って正答数や誤答数をカウントしたあと○×を返します。
import java.io.*; public class Mondai { public static void main( String[] args ) { Mondaishuu m1 = new Mondaishuu("mondai.txt",10 ); int i; char c; for (int n=0;n<m1.mondaisu;n++){ System.out.println("\n" + "----- 問" + (n+1) + " -----"); System.out.println(m1.toi[n].question); System.out.println(" " + m1.toi[n].ans1); System.out.println(" " + m1.toi[n].ans2); System.out.println(" " + m1.toi[n].ans3); try{ i = System.in.read(); c = (char)i; System.out.print (m1.check(n,Character.digit(c,10)) ); System.out.print (" 正解数" + m1.seikaict); System.out.println(" 誤答数" + m1.gotouct); while (System.in.available() > 0){ i = System.in.read();} } catch(IOException e){ System.err.println( "入力エラーです。" ); } } } }
実行するとこのようになります。強調しているところは、自分が入力する答えです。[Enter]キーが必要です。
$ java Mondai -0 -1 読込終了。 ----- 問1 ----- クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? 1.メソッド 2.インスタンス 3.コンスタンス 1 ○ 正解数1 誤答数0 ----- 問2 ----- 例外処理でtryとともに用いられるものは? 1.error 2.while 3.catch 3 ○ 正解数2 誤答数0 $
全問答えると終了します。途中で終わりたいときは [Ctrl] キーを押しながら、C を押してとめます。
上記に習って次の4つのファイルをつくり、( )の操作をしなさい
実行すると質問されますから、1~3のうちで入力して答えなさい。
mondai.txt に自分で考えた問題を書き加え実行してみなさい。問題を変えてもプログラムはコンパイルし直す必要はありません。