令和4年サンプル問題問4について
めいさん
(No.1)
基本情報技術者試験 令和4年サンプル問題の問4について、for文で1ずつ増やされるiとjの動きが分からない部分があります。
この問題の関数でやりたいことは
{3,0,0,0,0}
{0,2,2,0,0}
{0,0,0,1,3}
{0,0,0,2,0}
{0,0,0,0,1}
という整数型配列の配列(matrix)から0以外の数字を拾い、sparse[1]に拾った数字の行の要素番号、sparse[2]に拾った数字の列の要素番号、sparse[3]に拾った数字そのものを追加して最後に出力するものだと理解しています。
記述されているプログラムにしたがって、for文でiを1から5まで(matrixの行数)、同じくfor文でjを1から5まで(matrixの列数)まで増やしながらトレースしていたのですが、matrix[2][3]の2を拾う時の動きやmatrix[3][5]を拾った後に[4][4]で2を拾う動きが理解できません。
i←1
j←1
Matrix[1][1]≠0Ture
sparse[1]{1,}
sparse[2]{1,}
sparse[3]{3,}
i←2
j←2
Matrix[2][2]≠0Ture
sparse[1]{1,2}
sparse[2]{1,2}
sparse[3]{3,2}
ここまではわかるのですが
このあと
i←3
j←3
Matrix[3][3]≠0Falese
になってしまい
i←2
j←3
というように正解の道筋で処理する理由とやり方が分かりません。
また、同じような理由で、matrix[3][5]を通過した後にmatrix[4][4]を処理するにはj←5だったものをあとからj←4にしなければいけないようにしか見えず、しかしプログラム中に数字を減らす処理があるように見えないように思い、どうしたら解けるのか分からなくなっています。
この問題を解説している動画やサイトを色々閲覧して見たのですが、問題の全てをトレースしているものはなく、どうしたらこのような動きになるのか分からなくなってしまいました。
独学のため的はずれな理解をしている部分があるかもしれません。教えていただけると幸いです。
この問題の関数でやりたいことは
{3,0,0,0,0}
{0,2,2,0,0}
{0,0,0,1,3}
{0,0,0,2,0}
{0,0,0,0,1}
という整数型配列の配列(matrix)から0以外の数字を拾い、sparse[1]に拾った数字の行の要素番号、sparse[2]に拾った数字の列の要素番号、sparse[3]に拾った数字そのものを追加して最後に出力するものだと理解しています。
記述されているプログラムにしたがって、for文でiを1から5まで(matrixの行数)、同じくfor文でjを1から5まで(matrixの列数)まで増やしながらトレースしていたのですが、matrix[2][3]の2を拾う時の動きやmatrix[3][5]を拾った後に[4][4]で2を拾う動きが理解できません。
i←1
j←1
Matrix[1][1]≠0Ture
sparse[1]{1,}
sparse[2]{1,}
sparse[3]{3,}
i←2
j←2
Matrix[2][2]≠0Ture
sparse[1]{1,2}
sparse[2]{1,2}
sparse[3]{3,2}
ここまではわかるのですが
このあと
i←3
j←3
Matrix[3][3]≠0Falese
になってしまい
i←2
j←3
というように正解の道筋で処理する理由とやり方が分かりません。
また、同じような理由で、matrix[3][5]を通過した後にmatrix[4][4]を処理するにはj←5だったものをあとからj←4にしなければいけないようにしか見えず、しかしプログラム中に数字を減らす処理があるように見えないように思い、どうしたら解けるのか分からなくなっています。
この問題を解説している動画やサイトを色々閲覧して見たのですが、問題の全てをトレースしているものはなく、どうしたらこのような動きになるのか分からなくなってしまいました。
独学のため的はずれな理解をしている部分があるかもしれません。教えていただけると幸いです。
2024.03.13 01:03
のびーさん
(No.2)
こんばんは!
"for文でiを1から5まで(matrixの行数)、同じくfor文でjを1から5まで(matrixの列数)まで増やしながらトレース"
↑の所で勘違いされているかもしれないので、確認させてください。
ここではiのfor文の中に、jのfor文が入れ子になっている構造です。
そのため、トレースの仕方はiを固定した状態でj←1~5までループする下記の様な形になります。
① i←1、j←1
② i←1、j←2
③ i←1、j←3
…
そして、i←1、j←5の次にiを2に繰り上げて、i←2の状態でj←1~5までループ
① i←2、j←1
② i←2、j←2
③ i←2、j←3
…
これをi←5、j←5まで、繰り返します。
また、while文ではなく、for文ですのでfalseを拾ってもループは抜けないですね。
動きとしてはfalseを拾ったらsparseに何も入れずにループを続行し、trueの時にはsparseに要素の情報を書き込みループを続行、これをi、jそれぞれ5になるまで25回ループします。
"for文でiを1から5まで(matrixの行数)、同じくfor文でjを1から5まで(matrixの列数)まで増やしながらトレース"
↑の所で勘違いされているかもしれないので、確認させてください。
ここではiのfor文の中に、jのfor文が入れ子になっている構造です。
そのため、トレースの仕方はiを固定した状態でj←1~5までループする下記の様な形になります。
① i←1、j←1
② i←1、j←2
③ i←1、j←3
…
そして、i←1、j←5の次にiを2に繰り上げて、i←2の状態でj←1~5までループ
① i←2、j←1
② i←2、j←2
③ i←2、j←3
…
これをi←5、j←5まで、繰り返します。
また、while文ではなく、for文ですのでfalseを拾ってもループは抜けないですね。
動きとしてはfalseを拾ったらsparseに何も入れずにループを続行し、trueの時にはsparseに要素の情報を書き込みループを続行、これをi、jそれぞれ5になるまで25回ループします。
2024.03.13 03:30
のびーさん
(No.3)
分かりにくかったら、申し訳ないです…
2024.03.13 03:31
めいさん
(No.4)
のびー様、回答ありがとうございます。
仰る通りiとjのfor文が入れ子になっていることを認識できていないまま問題を解いておりました。
また、falseを拾った場合にはsparseに何も入れないでfor文を実行していい(行き詰まらない)ことも認識できていませんでした。
説明していただいたことに留意してもう一度問題をトレースしてみたところ無事に解くことが出来ました。
誠にありがとうございました。
確認なのですが、このプログラムが入れ子構造になっていることが確認できる部分はiのfor文よりもjのfor文が字下げされているという部分でしょうか?それとも字下げされていなくても入れ子構造になっている場合もあるのでしょうか。
ほかの問題を解く場合も、字下げされている部分があれば入れ子構造になっていると考えていいのか知りたいです。
仰る通りiとjのfor文が入れ子になっていることを認識できていないまま問題を解いておりました。
また、falseを拾った場合にはsparseに何も入れないでfor文を実行していい(行き詰まらない)ことも認識できていませんでした。
説明していただいたことに留意してもう一度問題をトレースしてみたところ無事に解くことが出来ました。
誠にありがとうございました。
確認なのですが、このプログラムが入れ子構造になっていることが確認できる部分はiのfor文よりもjのfor文が字下げされているという部分でしょうか?それとも字下げされていなくても入れ子構造になっている場合もあるのでしょうか。
ほかの問題を解く場合も、字下げされている部分があれば入れ子構造になっていると考えていいのか知りたいです。
2024.03.13 06:16
jjon-comさん
★FE ゴールドマイスター
(No.5)
2022年4月25日公開 科目Bサンプル 問4
https://www.fe-siken.com/kakomon/sample20220425/b4.html
擬似言語プログラムの文法としては,字下げは必要なく,
① for
② for
③ if
③ endif
② endfor
① endfor
forで始まり endforで終わる形式で囲われている①の内側が1つの固まり
(つまり①のforループは,②の固まりを繰り返す)
forで始まり endforで終わる形式で囲われている②の内側が1つの固まり,
(つまり②のforループは,③の固まりを繰り返す)
ifで始まり endif で終わる形式で囲われている③の内側が1つの固まり,
です。
ただ,出題者が
見やすさのための字下げを意図的に採用しないとは考えにくいので,
という基本原則はある,と言えるように思います。
https://www.fe-siken.com/kakomon/sample20220425/b4.html
擬似言語プログラムの文法としては,字下げは必要なく,
① for
② for
③ if
③ endif
② endfor
① endfor
forで始まり endforで終わる形式で囲われている①の内側が1つの固まり
(つまり①のforループは,②の固まりを繰り返す)
forで始まり endforで終わる形式で囲われている②の内側が1つの固まり,
(つまり②のforループは,③の固まりを繰り返す)
ifで始まり endif で終わる形式で囲われている③の内側が1つの固まり,
です。
ただ,出題者が
見やすさのための字下げを意図的に採用しないとは考えにくいので,
> 字下げされている部分があれば入れ子構造になっていると考えていい
という基本原則はある,と言えるように思います。
2024.03.13 10:54
めいさん
(No.6)
jjon-com様、回答ありがとうございます。
番号とかたまりの繰り返しという表現が非常にわかりやすく助かりました。
また、見やすさのために字下げと入れ子構造が関連づけられている場合が多いことも認識出来ました。
誠にありがとうございました。
番号とかたまりの繰り返しという表現が非常にわかりやすく助かりました。
また、見やすさのために字下げと入れ子構造が関連づけられている場合が多いことも認識出来ました。
誠にありがとうございました。
2024.03.13 19:12
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告