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

プログラミング

はじめに

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

もくじ

  • 概要 (はじめに)  
  • おさらい 今回は残り2つの処理書く
  • ランダムに表示された文字列と入力した文字列の一致率が表示される処理
  • 入力にかかった時間が表示される処理 作る関数を精査しよう
  • まとめ

おさらい

前回の【第9回】タッチタイピングを作ろう②では、プログラムの部品としての関数を1つ作成しました。今回は、主要な3つの処理のうち残り2つのプログラムを書いていきます。

  • ランダムに表示された文字列と入力した文字列の一致率が表示される処理
  • 入力にかかった時間が表示される

以上の処理について、前回説明した手順で考えていきます。

文字列の一致率が表示される処理

一致率を計算するとき、「ランダムに表示された文字列」と「入力した文字列」のデータが必要になります。ランダムに表示された文字列はrandom_lineという変数として前回定義しましたが、「入力した文字列」はまだ定義されていません。よって、まずこれを作ります。

Pythonには、組み込み関数という、定義しなくても使える関数があります。

このうちinput()は、入力されたデータを文字列として扱ってくれる関数です。

プログラミング練習でよく使うinput関数

input_line=input(“同じ文字列を入力してください :”)

上のように記述すると、キーボードで打ち込んだ値がinput_lineという変数として定義されます。例えば、abcと打ち込むと input_line==abcとなります。

これで比較する2つの変数を定義できました。

つぎに、関数の形を考えてみます。

求めたい一致率は、ランダムな文字列と入力した文字列によって変化するので、引数にこの2つをとると良さそうです。また、求めた一致率は表示するときを考えて戻り値にしてみます。

def rate_of_concordance(input_line,random_line): #一致率を計算する関数

    return rate

それでは実際に中身を書いていきます。一致率を求めるには、ランダムな文字列と入力した文字列をそれぞれ1文字ずつ分解して、対応するリストに格納し、1文字ずつ同じであるか確認していく形がとれそうです。

一致率を求める便利な関数がpythonにあれば利用したいところです。検索すると 

difflib.SequenceMatcher(None, input_line, random_line).ratio()

difflibというモジュールをインポートすると、一致率を求める関数が使用できることが分かりました。(モジュール、インポートについては前回ブログ参照)

このように、便利なモジュールを使用することでコードを短くすることができますが、プログラミングの力を鍛えたい方はぜひ地道な方法でチャレンジしてみてください。

———————————————————————————————–

def rate_of_concordance(input_line,random_line): #一致率を計算する関数

    precise_rate = difflib.SequenceMatcher(None, input_line, random_line).ratio() #文字列の一致率計算

    rate=round(precise_rate,1)*100 #一致率を小数点以下1桁に整えて%表示にする

    return rate

———————————————————————————————–

import difflib

difflib.SequesnceMatcher~は引数に比べたい値を入力すると一致率が出るという関数です。また、

rate=round(precise_rate,1)*100

の部分では、割合をパーセンテージにし、小数点1位まで丸める記述をしています。

以上で一致率を計算する関数の作成は完了になります。

入力にかかった時間が表示される処理 ~作る関数を再確認しよう~

つぎに、入力にかかった時間が表示される処理について考えていきます。

入力にかかった時間が表示される処理と聞くと、難しそうな関数のように思えます。

しかし、実際には、①ランダムな文字列が表示されたときの時刻から、②文字列の入力が完了した時刻を引き算すると、かかった時間が求められます。つまり、実質引き算のみでこの処理を行うことができます。

import time

timeというモジュールをインポートし、time.time()という関数を使うと現在時刻を求めることができます。

☆ここにランダムに文字列を表示する処理

    start=time.time()

    ☆ここに文字列を入力する処理

    end=time.time()

final_time=round(end-start,1)

このように、各処理のタイミングで現在時刻を変数にしておき、引き算をすることで差分としてかかった秒数を求めることができます。

プログラムを考える段階では難しそうな処理も、実際に書く準備をしていると簡単な処理で完了することがあります。今回は関数にする必要がなさそうなので、以上の記述で十分であると考えられます。

逆の場合も考えよう ~便利だと考えたら関数にしよう~

逆に、プログラムの構想段階では特に重要でなさそうだった処理も、関数にしておくと便利な場合があります。

今回のプログラムで記述した「文字列を入力する」処理は、何度も入力したり、プログラムの操作にかかわるものであるため、関数にしておくと便利かもしれません。

input_line=input(“同じ文字を入力してください : “)

これを以下のようにまとめておく

—————————————————————————-

def user_input(): #ユーザーの入力項目を返す関数

    input_line=input(“同じ文字を入力してください : “)

    return input_line

—————————————————————————-

このように、入力した文字列を戻り値として返す関数にしておくと、入力した値を扱うときに便利です。

まとめ

全体のプログラムを考える段階では難しそうであったり、逆に重要度の高くない処理も、準備段階で「意外と簡単かも?」「使う回数が多そうだから関数にしたい」と考えが変わる場合があります。その場合は、全体の流れを考えながら臨機応変に対応していくことも重要です。

次回以降は、作成した関数を実際のプログラムに組み込んでいく方法を解説していきます。

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

コメント

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