はじめに
今回の記事は、実際にプログラムを作成する実践編になります。
これまで学習した部分を生かしながら、つまずきやすい部分(実際に筆者がつまずいた部分)を中心に複数回にわたって解説していきます。細かい文法というよりは、初歩的なプログラムを作成するうえでの考え方などを中心に取り扱っていきます。
もくじ
- はじめに
- 前回のおさらい プログラムの作成が完了!
- デバッグって何? 作ったプログラムが動くか確認しよう
- 一行ずつプログラムを動かして変数の値をチェック
- 起点をつくる「ブレークポイント」
- 変数を登録すると中身が見れる「ウォッチ式」
- 実際にデバッグをやってみよう! visual studioだと簡単にできる
- デバッグのタイミング・・・小さい範囲から行おう
- まとめ
前回のおさらい プログラムの作成が完了!
前回の【第11回】タッチタイピングを作ろう④で、プログラムの作成が完了しました。
import random
import os
import difflib
import time
#開始
#ファイルの一行をランダムで読み込む(ファイルがなかった場合エラー)
#一行を表示させる(時間計測開始点)
#ユーザーが入力する
#処理をする(時間計測終了点)(一致率計算・タイピング時間を計算)
#結果を出力する
#もう一度タイピングを行うか尋ねる
#yならタッチタイピングを繰り返す
#nならタッチタイピングを終了してお疲れ様表示
#yとn以外ならもう一度尋ねる
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}秒です")
def random_line_loading(): #1行をランダムで読み込む関数
f=open("typing_text.txt","r")
datalist=f.readlines()
random_line=random.choice(datalist) #ランダムで1行選ばれる
print(random_line)
f.close
return random_line #1行を返す
def user_input(): #ユーザーの入力項目を返す関数
input_lines=input("同じ文字を入力してください : ")
return input_lines
def rate_of_concordance(input_lines,random_line): #一致率を計算する関数
precise_rate = difflib.SequenceMatcher(None, input_lines, random_line).ratio()
rate=round(precise_rate,1)*100
return rate
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回行った場合の変数を確認する
今回はタッチタイピング1回分の変数の値を確認していきます。
①ブレークポイントを打つ
まずは起点となるブレークポイントを打ちます。今回はmain()を呼び出すとすべてのプログラムが実行されていくので、その直前のIf~の横に打ちます。
※この赤丸以降の行を1行ずつ動かしていく
②「実行とデバッグ」をクリックしたあと、ウォッチ式に見たい変数を追加する
つぎに、「デバッグと実行」をクリックし、値を見たい変数を「ウォッチ式」に追加していきます。変数を右クリックして「ウォッチに追加」を選択します。
虫アイコンをクリック→実行とデバッグをクリック
※この時点ではエラーで値が見れませんが問題ありません
③ステップオーバーを行う
現在ブレークポイントを打ったif~の行にいるので、ここから一行進めるためにステップオーバーをします。これでmain()の行に移りました。
↑ステップオーバーのアイコンを押すと一行下へ移動する
※この状態でもう一度ステップオーバーしてしまうと、main()が実行されてしまい詳細の変数などが見れなくなります
④ステップインを行う・・・関数に入っていく
このままステップオーバーでmain()を実行しても詳細がわからないので、タッチタイピングの関数に入っていきます。main()の行でステップインをします。
↑ステップインのアイコンを押すと…
def main():と定義した関数に入り、一行目に移りました。
⑤ステップオーバーしていく・・・ウォッチ式に登録した変数の値が見れている!
もう一行ステップオーバーしてtouch_typing_once()の行へ進めたら、ここでもステップインを行ってタイピングの関数に入っていきます。
タイピング関数に入ったら、そのままステップオーバーを進めていきます。値を見たい変数のある行を超えると、ウォッチ式で確認することができました!これで値の確認は完了です。
random_lineの変数のある行を超える(実行する)と…
random_lineに値が入っているのを確認!
⑥そのままステップオーバーするとmain関数にもどる
そのままステップオーバーしていくとタイピング関数の処理が完了し、main関数に戻りました。一回分のタイピングの確認はこれで完了です。
まとめ
プログラムが完成したら、正しく動くかどうかチェックする必要があります。
プログラムを一行ずつ動かして、変数の値などを確認していく作業をデバッグといいます。
デバッグにはまず、確認したいプログラムの部分の起点の部分にブレークポイントを打ちます。その後、ウォッチ式に見たい変数を登録しておき、一行ずつステップオーバー・ステップインなどの操作を行います。デバッグ作業は小さい単位から行っておくと不具合を見つけやすいです。
次回は完成したプログラムの振り返りをしていきます。 ここまで読んでくださってありがとうございました!
コメント