平成29年春期午後問8  pRouteについて

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
FE勉強中さん  
(No.1)
https://www.fe-siken.com/kakomon/29_haru/pm08.html
1回目の繰り返しの後、pRouteの配列が全て0になるのが何故かわかりません。
要素番号0は距離0、要素番号4,5,6は地点0と隣接していないため距離-1であり、pRouteの値が更新されないのではないかと思いました。
とするとこれらの要素番号に格納されている0は初期値の0なのでしょうか。しかし、どこで初期値を格納しているのか分かりません。
そのため、要素番号0,4,5,6には何も格納されていない状態になってしまうのではないかと思うのですが、どこが間違っているのでしょうか。
2021.10.23 16:51
かなさん 
FE ブロンズマイスター
(No.2)
配列変数 pRoute は6行目から10行目のような初期化がされていません。変数を初期化しないと、予期しない値が変数に入ることになります。(言語によっては自動で0で初期化をしてくれる場合もありますが、基本情報の擬似言語にそうした仕様は明記されていなかったと思います)

しかし、この問題に限っては、配列変数 pRoute は初期化をする必要がありません。
配列変数 pRoute の値が12行目~39行目のループ処理中で参照されることはなく、配列変数への代入のみ行われます。また、地点0から他の地点への経路が一つ以上存在する関係上、「出発地から地点jまでの仮の最短距離」が必ず存在し、「地点jへの仮の最短経路における直前の経由地の地点番号」も必ず存在します。
これらのことから、12行目~39行目のループ処理中で配列変数 pRoute に必ず値が代入されます。そのため、初期化を行う必要がないのです。

>要素番号0,4,5,6には何も格納されていない状態になってしまうのではないかと思うのです
という疑問は実は正しく、12行目~39行目の1回目のループでは pRoute[4], pRoute[5], pRoute[6] には値が入りません。でもループが終わるまでに値が入るので(本プログラムに関して言えば)問題ないのです。


余談ですが、配列変数 sRoute も実は初期化をする必要のない変数でした。しかし、この配列変数を初期化しておかないと、一度も代入されていない変数が参照されることはないことから、選択肢cにsRouteを使うのだということがすぐにわかってしまいます。
2021.10.23 23:47
かなさん 
FE ブロンズマイスター
(No.3)
と思いましたが、なぜが設問2では
>ここで,配列 pRoute の全ての要素には初期値として0が格納されているものとする。
なんて書かれているのですね。IPA独自の擬似言語仕様では、宣言された配列には初期値として0が入る、という取り決めがあるのかもしれません。

どちらにせよ、本問では仮に初期値0が入らなくともプログラムは正常に動きます。が、プログラミング作法としては最悪の部類に入るので、真似はしない方がよいです。
2021.10.23 23:57
FE勉強中さん  
(No.4)
かな  さん
ご返信が遅れてしまい申し訳ございません。
分かりやすく解説してくださってありがとうございます!
「初期値として0を格納する」という記述を完全に見逃していました。ご指摘ありがとうございます。
また、ループ終了までに必ず値が入り、かつ参照もしない場合は初期化しなくても動作に問題はないのですね!
勉強になりました。ありがとうございました!
2021.10.27 22:56

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop