• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ソフトウェアの仕様書作成について(C言語))

ソフトウェアの仕様書作成について

このQ&Aのポイント
  • ソフトウェアの仕様書作成について(C言語)
  • 電車の時刻表を画面に表示するプログラムについて、詳細仕様を検討して作成しなさい。ユーザが現在時刻と到着したい希望時刻を入力すると、乗れそうな列車の候補を提示する。
  • 関数の形式は「int train_time(int present_h, int present_m, int arrival_h, int arrival_m, const int time_table[][])」であり、時刻表の電車の時間、分を読み込み、現在の時間と到着したい希望時間と比較して、乗れそうな列車の発車時刻と到着時刻を表示する。

質問者が選んだベストアンサー

  • ベストアンサー
  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.2

仕様の記述はよくがんばっていると思います。 質問に書かれている仕様の範囲で気になるところと言えば、例えば ・「0以上24以下」というのは0も24も含むので例外時の処理に書いてある「24以上の時間」と矛盾する。23以下、24未満とするべき。また、型として(unsigned intでなく)intを選んでいるので負の値についても取り扱いを記述すべき。 ・文字列やNULLを受け取れる引数はないように見えるが、例外時の処理についてそれらの記述があるのが不思議。そういうケースがないのなら混乱の元になるので記述すべきでない。 ・time_table[<列車番号>][<0:時、1:分>]なのだと思うが、これだけだとこのテーブルに載っている時刻は「発車時刻」なのか「到着時刻」なのかわからない。わからないので「現在時刻以降に発車し、到着時刻以前に到着する」の判断の仕方もわからない。 ・該当する列車の時刻表示の表示形式がわからない。実装者の一存で構わないのか。 ・出力の値として-1を返すケース(の一部)は例外時処理として書かれているが、0以上の値はどういうときに返せばいいのか、0以外のことがあるのか、などが出力の規則がわからない。 というあたりが致命的に不足していると思いました。その他細かいところだと ・present_h, present_mなどと変数を分ける代わりに、struct { int h; int m; } time_s;のような構造体を定義しておき、struct time_s present;とする方が見通しがよくなる。 とかあります。 (余談)…ところで、個人的にはこの設問があまりよくないと思いました。前後の文脈でわかるのかもしれないので断定はできませんが、どこからどこまでの仕様をどのレベルで書けばよいのかがわかりません。私なら出題者にくってかかるかも。 詳細、という言葉だけからするとこうした関数レベルやその中身のアルゴリズムなどを記述すべきなようにも思えますし、それならばこんな漠然とした要求だけではなくて概要仕様のようなものが提示されてしかるべきだと思います。とすると、この漠然とした要求からプログラム概要の仕様をなるべく細かく考えろという設問にもとれます。 後者の意味の設問だとするならば、C言語がどうとかではなくて言語によらずプログラム全体の仕様を入出力のインタフェースを中心に記述するのがよいと思いました。 ユーザのUIはGUIなのかCUIなのかコマンドライン引数なのか、時刻は文字列で入力するのか数値か、時刻表データはファイルかデータベースか、書式はどうなっているか、出力形式はどういうフォーマットか、「いくつか」表示するとはいくつにするのか固定数か選択できるようにするのか、該当する列車が見つからないときにはどうするのか、入力の誤り(到着時刻の方が出発時刻より早い場合など)はどうするのか、などです。 それらから、データ構造をどうするか、プログラム全体の構造(処理の流れ)はどうするか、などと考えていって、機能分割やインタフェース定義から関数仕様へと落とし込み、最終的には引数やアルゴリズムなどの記述へと至ります。(やり方の一例ですが。) あんな設問ちょっとでこれを全部かけ、と言われたらちょっと嫌ですよね。 仕事ならやりますけど、課題としてはどうかなぁという感じです。 ちなみに、仕事なら時刻表データのメンテナンスはどうするとか、こんなUIになるが大丈夫かというのをクライアントと確認したり、スケジュールはどうだとか、仕様に関連した色々な話に広がったりします。さすがにそんな設問ではあり得ませんけど参考まで。

revia
質問者

お礼

厳しくかつ丁寧に指摘・説明していただいてありがとうございました。大変感謝しております。 仕様書って作るのは思ってたよりも難しいですね。社会人として出て行くまでにできるだけ力をつけてけるようにがんばります。

その他の回答 (1)

回答No.1

フリーのプログラマーです。 自分が仕様書を受け取ったプログラマーになったつもりで第三者的に(客観的に)チェックするようにしています。 自分がこの仕様書を受け取ったつもりで気づいた点を書いてみます。 ・関数の処理内容も記述したほうがよい。つまり「今から乗れそうな列車の候補」をどのようなロジックで解決するか、についてです。 ・最終的な出力内容「今から乗れそうな列車の候補」がどのように出力されるか不明。printfでだらだら出るのか、別のファイルorデータベースに格納されるか分かりません。 ・エラーコードはエラー種別に応じて変えたほうがよい ・入出力の例などを書くとよい。(文章力をカバーできる!) ・1時60分という入力はOKなのかな?とか日替わり(翌日にまたがった答え)を考慮するの? 言いたい放題言わせてもらいましたが、これだけ書ければ戦力にはなるかなと正直思いました。

revia
質問者

お礼

解答ありがとうございます。 仕様書というのはプログラマーの方が迷わないようにしなければならない、ということですが、ずいぶん迷わせてしまったようで、まだまだ改変すべきところがあるみたいですね。 これを参考に自分でも考えてがんばってみたいと思います。

関連するQ&A