// CalculationPractice -- 計算問題
import java.io.*; // 入出力関係のクラス
public class CalculationPractice {
  static int noProblems = 10; // 出題数 (number of problems) デフォルト
  static int maxValue = 99; // 答えの最大値  デフォルト
  static int maxNo2 = 10; // 答えの最大値  デフォルト
  int correctAnswers = 0; // 正解の数を記憶
  int wrongAnswers = 0; // 間違いの数を記憶
  
  public static void main (String args[]) {
    try {
      // 引数の処理  ☆☆switch文を使っている
      switch (args.length) { // 引数の個数は配列の大きさでわかる
      case 3: // 引数が3つある時,ここからbreakまでを実行
	maxNo2 = Integer.parseInt(args[2]); // 第2項の最大値
      case 2: // 引数が2つか3つある時ここに到達
	maxValue  = Integer.parseInt(args[1]);  // 答えの最大値
      case 1: // 引数が1-3個の時ここに到達
	noProblems = Integer.parseInt(args[0]);  // 問題数
	break; // 引数が1-3個の時はここでswitchを抜け,tryも抜ける
      case 0: // 引数がない場合
	break; // 何もしないで抜ける
      default: // 引数が4つ以上ある時
        throw new Exception();//引数の指定が変。例外を投げる
      }
    }
    catch (Exception e) { // 入力や整数への変換で例外が発生
      System.err.println("使用法: java CalculationPractice 問題数 答え最大値 第2項最大値");
      System.exit(1); // 使用法を表示して終了
    }
    // 全体を制御するオブジェクトを作る
    CalculationPractice controller = new CalculationPractice();
    controller.run(); // メソッドrun()実行
  }

  void run() {
    System.out.print("---------- けいさんれんしゅう " + 
                      noProblems + "だい ----------\n");
    // プログラム生成(program generator)オブジェクトの生成
    ProblemGenerator pg =
	new ProblemGenerator(noProblems, maxValue, maxNo2);
    AnswerReader ar = new AnswerReader(); // 答えを読み込むオブジェクト
    for (int i=0; i<noProblems; i++) {
      String problem = pg.generate(); // 問題を生成
      boolean result;  // 正解か間違いか。true--正解
      boolean scored = false; // 採点したかまだか
      do { // 正解になるまで繰り返し
	String problemString = (i+1) + ".  " + problem + " = ";
	if (i<9) problemString = " " + problemString; // 桁をそろえる
	System.out.print(problemString); // 問題を表示
	int answer = ar.read(problemString);  // 解答を読み込む
	result = pg.checkAnswer(answer);  // 答え合わせ
	if (! scored) { // まだ採点してなかったら
	  if (result) correctAnswers++;  // 正解
          else wrongAnswers++;  // 間違い
	  scored = true; // もう採点しおわったことを覚える
	}
	if (! result) System.out.print("X\n");  // 不正解のとき
      }
      while (! result); // resultがtrue(正解)になると抜ける 
    }
    printRecord(correctAnswers, wrongAnswers); // 成績を表示
  }

  // 成績を表示するメソッド
  static void printRecord(int correct, int wrong) {
    PrintStream out = System.out;
    out.println("---------- せいせき ----------");
    out.println("   せいかい " + correct + "もん" +
                "   まちがい " + wrong + "もん");
  }
}