次へ: 8 最後に 上へ: AWK による簡単なタイプ練習ソフト 前へ: 6 その他の部分 (PDF ファイル: awk2.pdf)


7 ソースコード全体

以上をまとめたソースコード全体を紹介します。

  BEGIN{
      len=40
      # (1) 課題文を作成して画面に表示
      kadai=mkkadai(len)

      print "課題は [ ] 内の文字列です。それと同じ文字列を入力してください。"
      print "[ ] は入力しないでください。入力が終わったら改行キーを打ちます。"
      print ""
      printf "課題: [%s]\n",kadai
      printf "入力:  "

      # (2) 現在時刻を記憶 (入力開始時刻)
      time1=systime()
      time2=0
      Loops=1 # 何回目の入力か
  }
  {   ## ここはキーボードからの 1 行の入力が済んだ後に実行される
      # (3) 現在時刻を記憶 (入力終了時刻)
      time2=systime()
      # (4) 入力行と課題文とを比較
      N=check(kadai,$0)
      # (5) 違いがなければ終了し、
      #     違いがあればその結果を表示し、現在時刻を記憶 (入力開始時刻)
      if(N==0) exit
      else{
          printf "[%d] ミス = %d 個、時間 = %d 秒\n",Loops,N,time2-time1
          printf "課題: [%s]\n",kadai
          printf "入力:  "
          time1=systime()
          time2=0
          Loops++
      }
  }      
  END{
      # (6) 途中でやめた場合はそのような表示をする
      # (7) 正常終了した場合はそのような表示をする
      if(time2==0) print "途中であきらめましたね。次回また頑張ってください。"
      else{
          printf "おめでとうございます。正解です。\n"
          printf "回数 = %d 回、時間 = %d 秒\n",Loops,time2-time1
      }
  }

  function mkkadai(M,  j,x,N,a,s)
  {
      s=""
      srand()
      N=split("abcdefghijklmnopqrstuvwxyz      ",a,"")
      for(j=1;j<=M;j++){
          x=int(rand()*N)+1
          s = s a[x]
      }
      return s
  }

  function check(s1,s2,  h1,h2,N1,N2,N,L,j,diff)
  {
      N1=split(s1,h1,"")
      N2=split(s2,h2,"")
      if(N1<=N2){ N=N1; L=N2-N1 }
      else{ N=N2; L=N1-N2 }
      for(j=1;j<=N;j++) if(h1[j]!=h2[j]) diff++
      return diff+L
  }

上記のファイルを type.awk とでもして、

awk -f type.awk
とすれば実行されます。


次へ: 8 最後に 上へ: AWK による簡単なタイプ練習ソフト 前へ: 6 その他の部分
竹野茂治@新潟工科大学
2006年4月27日