大化通信

大化物流開発合同会社の社員から技術発信をしていきます

成績ランク算出プログラムを設計・製造してみた(プログラム設計編)

はじめに

どうも、迷走星人と申します。 私は過去に社内のセミナーで発表した、成績ランク算出プログラムをテーマにプログラムの設計~試験の流れを何回かに分けて発表していこうと思います。 1回目はプログラム設計について発表していこうと思います。

要求内容

以下の要求に対応したプログラムの開発を進めていきます。

  • 学力試験(100点満点)の結果ファイルを読み込み、点数を元に成績ランクを求め、同じファイルに書き込む。
  • Windows10 or 11で動作、プログラムと入出力ファイルは同じフォルダ内に存在するものとする。

プログラム仕様書設計

要求内容の確認

まずはプログラムを開発する前に、要求内容の確認をしておきます。 ここで疑問に思ったことは要求者に確認を行い、自分と要求者の間で認識のずれが起きないようにします。 確認事項が複数ある時は、質問表(QAリスト)に記載し、まとめて回答してもらうようにします。 今回の場合、自分は以下の事項をQAリストに記載し、要求者から回答を頂いた、という体で話を進めていきます。

No. 確認内容 回答内容
1 試験成績は整数のみ、という認識で合っているか? 小数点第1位までの単位で実数も取ることとする。
(小数点第2位で四捨五入)
2 結果ファイル中の試験の成績と成績ランクの区切りは半角のカンマ「,」という認識で合っているか? 半角カンマ「,」で区切る。
3 試験成績が0~100点の範囲外の場合はどうするか? 成績ランク「E」と算出させる。
4 試験成績が書かれていない(空白のままの)結果ファイルを読み込んだ場合は? ファイルに成績ランクを追記しないようにする。

開発するプログラムの全体イメージ

要求者と要求内容の認識合わせが出来たら設計書作成の作業に入ります。 設計書作成時、自分が開発するプログラムの全体像が分かるように図に興しておきます。 ここでの図は簡素なもので構いません。 外部の人間が見える範囲で作成していきます。 今回はPlantUMLを使い、ユースケース図で下図の様に描きました。

プログラム概要任意のフォルダ結果ファイルプログラム④:算出ユーザー①:格納⑥:確認②:実行③:読取⑤:追記

プログラムの全体イメージが掴めたら、今回の自分の改造前後で何が変わるかを書き出してみます。 ここでまとめた内容を確認することが後の試験工程での試験方針になります。

変更前後 対応前後の振る舞いの内容
変更前 結果ファイルを読込み、点数を元に成績ランクを算出して
同じファイルに書き込まない
変更後 結果ファイルを読込み、点数を元に成績ランクを算出して
同じファイルに書き込める

開発するプログラムの運用の流れ

開発したプログラムでの運用の流れもこの段階でまとめておきます。
ユースケース図に書いた①~⑥に着目し、運用フローに興していきます。 この運用の流れは試験仕様書の設計時に参考にしていきます。

プログラム運用フロー①:結果ファイルをプログラムがあるフォルダに格納する②:プログラムを実行する第1引数:結果ファイル名③:結果ファイルから成績を読み取る④:成績ランクを算出する⑤:プログラムが算出した成績ランクを結果ファイルに追記する⑥:結果ファイルを確認するyes成績ランク追記成功?noyes成績ランク算出成功?noyesファイル読み取り成功?noyesプログラムと結果ファイルは同じ場所に設置?no

プログラムの仕様

運用の流れが見えてきたら、外から見た時のプログラムの仕様をまとめます。 ここでは「入力」、「出力」、「実装する機能」について、以下の仕様で設計していきます。

入力
  • 結果ファイル名
出力
  • 結果ファイル(成績ランク有)
実装する機能
ファイルの読み書き機能
  • 結果ファイルに書かれた点数を読込み、試験データ配列に格納する。
  • 点数及び成績ランクを格納した試験データ配列のデータを結果ファイルに書き込む。
成績ランク算出機能
  • 結果ファイルから取得した点数に応じた成績ランクを振り分ける。
  • 成績ランクの振り分け方は以下の通りに行う。

成績ランク算出フロー読み取った点数成績ランク:「A」成績ランク:「B」成績ランク:「C」成績ランク:「D」成績ランク:「E」90点以上100点以下 その他75点以上90点未満60点以上75点未満0点以上60点未満

機能詳細

各機能の入出力、処理内容が整理できたら、より詳細な箇所を詰めていきます。
アクティビティ図を使い、各機能の内部のロジック(論理)を整理していきます。

ファイルの読み書き機能
入力
  • 試験成績ファイル名
  • 動作モード[読込/書込]
出力
  • 試験データ配列[点数]
  • 戻り値
処理フロー

ファイル読み書き機能処理フロー図ファイル名がNULL?yes動作モードで分岐読込書込結果ファイルを開く行データ取得行データ分割配列にデータ格納(点数)yes分割成功?行データループnoファイルオープン失敗?yes結果ファイルを閉じる結果ファイルを開く配列データ取得結果ファイルにデータ(点数、ランク)書込配列データループnoファイルオープン失敗?yes結果ファイルを閉じる戻り値を返す

成績ランク算出機能
入力
  • 試験データ配列[点数]
出力
  • 試験データ配列[点数,成績ランク]
  • 戻り値
処理フロー

成績ランク算出機能処理フロー図配列がNULL?yes配列データ(点数)取得データの「型」で分岐整数 or 実数それ以外読み取った点数成績ランク:「A」成績ランク:「B」成績ランク:「C」成績ランク:「D」成績ランク:「E」配列データ格納配列データ格納(ランク:「E」)配列ループ戻り値を返す90点以上100点以下 その他75点以上90点未満60点以上75点未満0点以上60点未満

次回予告

ここまでプログラム設計について発表しました。 次回は以下のタイトルで続きを発表して行こうと思います。

  • 成績ランク算出プログラムを設計・製造してみた(プログラム実装編)