【勉強日記】タッチタイピングを作ろう④【第11回】

プログラミング

はじめに

今回の記事は、実際にプログラムを作成する実践編になります。

これまで学習した部分を生かしながら、つまずきやすい部分を中心に複数回にわたって解説していきます。細かい文法というよりは、初歩的なプログラムを作成するうえでの考え方などを中心に取り扱っていきます。

もくじ

  • はじめに
  • 前回のおさらい プログラムの全体の流れ&作った関数(処理)を確認しよう
  • タッチタイピング1回分を作ろう
    • なぜ1回分で作るのか
  • 全体の処理を考えよう 
    • if __name__ == “__main__”を使ってみよう
    • 入力の結果で処理をコントロールしよう ~「条件」「ループ」の機能を生かそう!~
  • どうしてタッチタイピングが1回目と2回目以降で分かれているのか?
  • まとめ

前回のおさらい ~プログラム全体の流れ&作った関数を確認しよう~

前回の【第10回】タッチタイピングを作ろう③までは、タッチタイピングプログラム全体の流れと、その処理の一部である関数を作成しました。

作った関数(処理)

  • ランダムな文字列を表示する関数
  • 文字列を入力する関数
  • 文字列の一致率を計算する関数
  • (文字列を入力した時間を計算する処理)

今回は、これらを全体の流れに組み込んでいきます。

タッチタイピング1回分を作ろう

☆なぜ1回分で作るのか ・・・何度も繰り返すひとつのかたまりを作っておく

さっそく全体に関数を組み込んでいきたいところですが、まずは「一回分のタッチタイピング」としての関数を作ります。これは、前回作った計算などの処理を組み込んだ関数です。

全体図に沿ってそのまま配置していけばいいのではないか?と思いますが、今回のプログラムでは「タイピングを続けますか?:y/n」というように、「タイピング1回分」を何度も繰り返す機能が含まれています。よって、1回分のタイピングも関数にまとめておくと「何を繰り返すのか」が明確になってよりわかりやすいプログラムになります。

1回分のタイピングをこれまでの関数を用いて関数にしてみると以下になります。

def touch_typing_once(): #タッチタイピング
    
    '''
    ファイルを読み込んでランダムで一行返す
    一行が表示された後の時刻
    ユーザーの入力
    ユーザーが入力し終わったあとの時刻
    一致率を出す
    かかった時間の計算
    結果を表示
    '''
    random_line=random_line_loading() 
    start=time.time() 
    input_lines=user_input() 
    end=time.time() 
    rate=rate_of_concordance(input_lines,random_line) 
    final_time=round(end-start,1) 
    print(f"一致率は{rate}%です")
    print(f"入力にかかった時間は{final_time}秒です")

1行目を例にすると、random_line=random_line_loading()の形をとることで、前回までに作った関数を呼び出しています。

前回までに作った関数を、動かしたい順番に並べていくとタッチタイピング1回分の動作になります。これをひとまとめにして、def touch_typing_once():を「タッチタイピング1回分」の関数と定義します。

☆Print()内のfの文字は、変数を文字列の中でも変数として表示するために使用しています

全体の処理を考えよう

if __name__ == “__main__” を使ってみよう

1回分のタッチタイピング関数を作ったので、あとはそれを繰り返すか・終了するかなどの処理を外側に加えてプログラム全体を完成させていきます。コードが書いてあるファイルを実行するとプログラムを開始するようにしたいので、今回はif __name__ == “__main__” の記述をしていきます。

if __name__ == ‘__main__’は、ざっくり説明するとプログラムの書かれたファイルが直接実行されたときだけ~を条件にできるif文です。

たとえば、動かしたいプログラムすべてをdef main(): として定義しておき、if __name__ == ‘__main__’の下に main()として呼び出すようにすると、ファイル実行ボタンを押したときだけdef main():が呼び出され、プログラムをスタートさせることができます。

入力の結果で処理をコントロールしよう ~「条件」「ループ」の機能を生かそう!~

それではmainの中を書いていきましょう!

①まず、タッチタイピングでは別ファイルを読み込んで文字列をランダムに表示する処理があるため、ファイルが見つかった場合のみプログラムを開始できるものとします。

def main():
 
  if os.path.exists("typing_text.txt"): #読み込むファイルが存在する場合

 else: #ファイルが存在しない場合
     print("ファイルがありません")

このように、別ファイルの有無やエラーの有無でプログラムを続行するか終了するかを決める場合が多いので、最初に確認のための条件分岐を書きました。

タイピングを開始する

ファイルがあった場合、タイピングを開始するので、タイピング一回分の関数を呼び出します。

def main():
 
  if os.path.exists("typing_text.txt"): #読み込むファイルが存在する場合

   touch_typing_once() #1回目の処理

 else: #ファイルが存在しない場合
     print("ファイルがありません")

条件によってループを決める

ここからループの要素を入れていきます。1回目のタイピングのあと「もう一度行いますか?」と入力画面が表示されるようにして、それからの処理を分岐させます。

入力が

  • ⅰ yの場合・・・もう一度タイピングをする
  • ⅱ nの場合・・・「お疲れ様でした!」を表示してプログラム全体を終了させる。
  • ⅲ それ以外の場合・・・「もう一度行いますか?」が繰り返される

一定の条件を満たしたらループを抜けたりする場合はwhile文を使います(ブログ第6回参照)。

今回は「もう一度行いますか?」での入力が条件分岐になるので、「もう一度行いますか?」がwhile文のカギになります。よって、while内にこの一文を書きます。

また、ⅲの場合「もう一度行いますか?」に戻ってくる必要があるので、これはwhile文の先頭にあるほうがよいでしょう

def main():
 
  if os.path.exists("typing_text.txt"): #読み込むファイルが存在する場合

    touch_typing_once() #1回目の処理

    while True: #2回目以降の処理

      answer=input("もう一度行いますか? y/n :") #もう一度行うかの質問
   ~ここに条件分岐を書いていく~

 else: #ファイルが存在しない場合
     print("ファイルがありません")

入力による分岐を書いていく

まず、入力がyの場合は、タッチタイピングを行って、ふたたび「もう一度行いますか?」に戻ります。

Continueというのは、それ以下の処理を飛ばしてループの先頭(answer=input(“もう一度行いますか? y/n :”))に戻る処理です。

つぎに、入力がnの場合です。

特になにもせず終了するので、break文でループを終了させてプログラムを終了します。

最後にnでもyでもない文字を入力した場合です。この場合はループ先頭に戻って「もう一度行いますか?」が表示されるようにcontinueにします。

def main():
 
  if os.path.exists("typing_text.txt"): #読み込むファイルが存在する場合

    touch_typing_once() #1回目の処理

    while True: #2回目以降の処理

      answer=input("もう一度行いますか? y/n :") #もう一度行うかの質問

      if answer =="y": #yの場合タッチタイピングを行って次のループ先頭に戻る
        touch_typing_once() 
        continue

      elif answer =="n": #nの場合ループを抜けて終了
        print("お疲れ様でした!")
        break
    
      elif answer !="n"and"y": #nでもyでもない場合ループ先頭に戻る
        continue

  else: #ファイルが存在しない場合
     print("ファイルがありません")

以上でメインプログラム(プログラム全体)の記述が完了しました。

最後に呼び出しの処理を書いて記述は完了です。

if __name__ =="__main__":
    main() 

なぜ1回目のタイピングと2回目以降のタイピングが分かれて書かれている?

なぜ1回目と2回目以降をわざわざ分けて書いているのか疑問に思うかもしれません。

ループなら、1回目もまとめてループに入れられそうな感じがします。

今回は、while文でループする条件が「もう一度行いますか?」での入力によって決まります。1回目のタッチタイピングは条件にかかわらず必ず行われるのでループの外にあります。もしここで1回目のタッチタイピングの記述がない場合、「もう一度行いますか?」からプログラムが開始することになってしまいます。

まとめ

部品として作った関数を全体に組み込んでいくさいには、まずプログラム全体のなかで繰り返す処理のひとかたまりを作成していきます。

今回はタッチタイピング一回分の処理を関数として作成し、その後メインプログラムの分岐やループを書いていきます。特につまづきやすいのは、while文の記述です。どこかループの範囲なのか、何が条件なのかを確認しておくことが重要になります。

次回は完成したプログラムを動かしていきます。

ここまで読んでくださってありがとうございました!

コメント

タイトルとURLをコピーしました