データをプログラムの中に書き込むのは見通しが悪いので、ファイルから読み込むことにします。
(ファイル入出力を勉強してからと考えていましたが、その前に面倒になりました)
強調されている部分は直接入力(半角)でいれます。QAは大文字でなければなりません。"."(ドット)も忘れずに入れます。これは後でプログラムをこのような形式を読むように設計するからです。問題は自分で考えてください。10問まで読み込めるように作ります。
#1 Q.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? 1.メソッド 2.インスタンス 3.コンスタンス A.1 #2 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)、そこから問題を読み込みます。ファイルからの読込も import java.io.* が必要です。
import java.io.*; public class Mondaishuu { // フィールド Toi[] toi = new Toi[10]; int mondaisu; int seikaict; int gotouct; //コンストラクタ public Mondaishuu( String fname ){ 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) { if (line.indexOf("#")==0){ ct++; toi[ct-1] = new Toi(); System.out.println(line +"-"+ (ct-1)); } else if (line.indexOf("Q.")==0){ toi[ct-1].question = line.substring(2); } else if (line.indexOf("1.")==0){ toi[ct-1].ans1 = line; } else if (line.indexOf("2.")==0){ toi[ct-1].ans2 = line; } else if (line.indexOf("3.")==0){ toi[ct-1].ans3 = line; } else if (line.indexOf("A.")==0){ toi[ct-1].seikai = Integer.parseInt(line.substring(2)); } } 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"); 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]キーが必要です。
U:\user\java> java Mondai #1-0 #2-1 読込終了。 ----- 問1 ----- クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは? 1.メソッド 2.インスタンス 3.コンスタンス 1 ○ 正解数1 誤答数0 ----- 問2 ----- 例外処理でtryとともに用いられるものは? 1.error 2.while 3.catch 3 ○ 正解数2 誤答数0 U:\user\java>
全問答えると終了します。途中で終わりたいときは [Ctrl] キーを押しながら、C を押してとめます。