見出し画像

【号外】システム開発の心得(探索アルゴリズム修正案)【高等学校情報1】Pythonプログラミング

◆◆はじめに◆◆

前回解説した、探索について、教員研修用教材(15章)に準拠した形で動画解説しましたが、一部改善した方が良いと思われる内容がありましたので、自身のシステム業界での体験も織り交ぜながら、動画解説追加しました。

◆◆動画解説◆◆



前回の内容


◆◆文字おこし◆◆

前回は線形探索と二分探索の流れ図を描いて、それをもとにPythonプログラミング行った。

ただ、このプログラムは少し微妙なところがあって
例えば、探索値を99にして実行してみよう。何も起こらないよね。

これじゃあ、上手く判定できたのかもわからないよね。

実際のシステム開発現場では、設計段階からありとあらゆるパターンを想定して設計や試験が行われる。

設計やプログラムの想定外の不具合をバグとか言ったりするけど、
システムが世の中に出た後にそのバグが発見された場合、場合によっては損害賠償なども発生したり、医療システムなどだったら人命にかかわることもあるかもしれない。
仮に起こる確率が100万分の一でも携帯電話の様にユーザー数が数千万人いたら、事象が頻発する。

これから、色々プログラミングの勉強をしていくと思うけど、
実際、世の中でその作られたアプリケーションを使うのは、生身の人間だってことは忘れないでほしい。
僕自身も、昔、これくらいでいいだろうという安易な気持ちで試験の一部を怠ったことで、世の中に出た後にそれが問題となって、多くの人に迷惑をかけて、何日も徹夜することになったこともある。
システム業界で長く開発している人は、石橋をたたいて渡るような慎重な人が多いけど、それも過去の失敗から来てたりもするんだ。

システムは人間の手で作るから必ず一定の確立で不具合が起こる。
システム開発は要件定義、各種設計、プログラミングそして各工程に対応したテストを十分に行い、長い工程を経て世の中にリリースされる。
色んな人と綿密に打ち合わせながら一つの物をつくりあげていくから、コミュニケーションスキルも非常に大切になってくるんだ。

世の中に出た後も、システムを常に監視してくれる役割の人がいて、万が一不具合が発見されても、被害を最小限に抑えるように体制がくまれている。

この動画は、大学入学共通テストの情報科目で高得点を取るためということもあるけど、
システム業界に長年いないと話せない内容も織り交ぜながら、みんなの役に立つ動画にしていく予定だよ。

=========

長くなったけど、探索値が見つからなかった時のパターンが無いから、まずは流れ図を修正していこう。

通常関数は値を返却して、その返却された値に対してどうふるまうかは呼び出し元が決めるんだ。

前回は、関数の中で見つかりましたと添字を表示したけど、関数からは、探索値の存在有無と、対象の添字を返却するようにしよう。

探索値は存在するか否かの2択だから、True Falseで表せる、Boolean型を使おう

Boolean型の変数名は〇〇フラグって名付ける場合が多い。
〇〇の部分を満たせばTrue 真、違えばFalse 偽となる。
 例えば、イケメンフラグっていう名前だったら、
「イケメン」というのを満たせば、Trueで真 違えば、Falseとなる。

今回はsonzai_flagという変数名にしよう。

画像2

flagは日本語で「旗」という意味があるんだ
システム業界では、flagを立てるという言葉が多く使われるんだけど、
条件を満たす場合、True(真)を設定することをいう

はじめに、sonzai_flagにFalseを入れておく。
この状態はフラグが降りている状態

そして探索値が見つかった場合に、Trueを格納する。
この状態で旗が立つイメージなんだ

そして、ループを抜けた後に
sonzai_flagがTrueつまり旗が立っていたら「見つかりました」と一緒に添え字を表示
sonzai_flagがFalseつまり旗が降りたままだったらなら 見つかりませんでしたという文言を表示するようにしよう


じゃあ、Pythonのプログラムを修正しよう。

# 二分探索で受渡されたリスト内の要素と探索値を比較する。
# 関数名:binsearch
# 引数1:a(比較対象のリスト)引数2:p(探索値)
# 戻り値:なし ※関数内で結果を表示
def binsearch(a, p):
   i = 0  # 下限添字
   j = len(a) - 1  # 上限添字
   sonzai_flag = False
   while i <= j:
       m = int((i+j)/2)  # 中央添字(小数点以下切り捨て)
       if a[m] == p:
           # print("見つかりました。添え字:", m)
           sonzai_flag = True
           break
       else:
           if a[m] > p:
               j = m - 1
           else:
               i = m + 1
   return sonzai_flag, m

a = [25, 33, 43, 51, 66, 71, 88]
p = 88  # 探索値
result = binsearch(a, p) # タプル型(複数のデータ型を格納できる)

if result[0]:
   print("見つかりました。添字:", result[1])
else:
   print("見つかりませんでした。")

まず、sonzai_flag変数に初期値のFalseを代入する。
そして、探索値が見つかった場合に 見つかりましたって表示していたけど、このタイミングでは表示しないので、コメントアウトする。
その代わりにsonza_flag にTrueを格納する

そして、ループを抜けた後に 返却値としてsonzai_flg と 探索値が存在する場所を示す添字を返却する。
複数の値を返却したい場合は、カンマ区切りで記述する。

戻り値があるから、それをresultという変数で受け取る。
返却値は複数の値を保持できるタプル型で返却される。

resultの中のデータの取り出し方はリスト型と同じ。
resultの添字1はsonzai_flagの値 TrueかFalseが入っているので
if 文で result[0]と記述する。
Trueの場合は、探索値が見つかったということだから
インデントして、見つかりました。の後に resultの添字1に入っている、探索値が存在する場所を示す添字を表示する。

それ以外は、探索値が見つからなかったってことだから
見つかりませんでしたと表示する。

じゃあ、存在しない探索値99で実行してみよう。
ちゃんと見つかりませんでしたと表示されたね。

存在する 探索値88でも試そう。
見つかりました。添字6と表示されたね。

システム開発時は、設計段階から色んなパターンを想定して将来の想定外を早い段階で防ぐようにしよう。

===

【フラグについての参考サイト】
https://wa3.i-3-i.info/word1602.htmll





この記事が気に入ったらサポートをしてみませんか?