次へ: 6 ソースコード全体 上へ: 5 チェック関数 前へ: 5.1 入力チェック関数 (PDF ファイル: awk3.pdf)


5.2 入力判定関数

次は、入力判定関数を作成します。 入力数字列の配列 $input[\;]$ と課題数字列の配列 $kadai[\;]$ を 比較するわけですが、 次のように考えればいいでしょう。
  1. $A=0$, $H=0$ とする (A は $A=B+H$ を意味する)。
  2. $kadai[1]$ と同じ数字があるかどうかを $input[\;]$ の中で探し、 それがあれば $A$ を一つ増やし、それが $input[1]$ ならば $H$ も一つ増やす。
  3. $kadai[2]$ と同じ数字があるかどうかを $input[\;]$ の中で探し、 それがあれば $A$ を一つ増やし、それが $input[2]$ ならば $H$ も一つ増やす。
  4. これを $N$ まで行なう。
  5. $B=A-H$ とする。

この、「$kadai[j]$ と同じ数字があるかどうかを...」 の部分は、 以下のようなコードで書けます。

  for(k=1;k<=N;k++)
    if(input[k]==kadai[j]){
        A++
        if(j==k) H++
        break
    }
一致するものがあれば $A$ をカウントし、 添字の $j$$k$ が等しい場合は場所も合っていることになるので、 その場合に $H$ をカウントしています。

なお、これは 1 から $N$ までの全ての $k$ に対して実行してもよいのですが、 すでに配列の値の数字は重複しないことが保障されているので、 もし一致した数字があればその後の $k$ に対しては実行する必要がありません。 よって、一致した場合に break 文で for 文を中断しています。 break 文は、for 文や while 文などのループから途中で抜けるための命令で、 break 文が呼び出されると、最も内側のループ一つから抜けだします。

あとは、これを全ての $j$ に行えばいいので、 結局次のような関数で判定ができます。

  # 一致したら 1, そうでなければ 0 を返す
  # B,H は大域変数としてそこに結果を代入する
  function judgeinput(N,input,kadai,	j,k,A)
  {
      H=0  # 数も場所も合っているものの個数
      A=0  # 数が合っている (H も含む) ものの個数
      for(j=1;j<=N;j++)
        for(k=1;k<=N;k++)
          if(input[k]==kadai[j]){
              A++
              if(j==k) H++
              break
          }
      B=A-H
      if(H>=N) return 1
      else return 0
  }


次へ: 6 ソースコード全体 上へ: 5 チェック関数 前へ: 5.1 入力チェック関数
竹野茂治@新潟工科大学
2006年6月8日