アルゴリズムとデータ構造に問題について

D.sさん  
(No.1)
こんにちは。やっと勉強がひと段落し、ようやく本サイトの過去問であったり、教科書に書いてある過去問を解き始められました。アルゴリズム分野へようやく到達できたのですが、全く理解が追い付かないので教えていただきたいです。まず、問題を下記に書いて、その下に質問を書きたいと思います。
〔理解できない問題〕
 手続printArrayは、配列integerArrayの要素を並び替えて出力する。手続printArrayを呼び出した時の出力はどれか。ここで、配列の要素番号は1から始まる。
2024.11.05 20:13
D.sさん  
(No.2)
〔問題〕
 手続printArrayは、配列integerArrayの要素を並び替えて出力する。手続printArrayを呼び出した時の出力はどれか。ここで、配列の要素番号は1から始まる。
2024.11.05 20:14
D.sさん  
(No.3)
〔プログラム〕
〇printArray()
 整数型:n,m
 整数型の配列:integerArray←{2,4,1,3}
 for(nを1から(integerArrayの要素数ー1)まで1ずつ増やす)
  for(mを1から(integerArrayの要素数ーn)まで1ずつ増やす)
   if(integerArray〚m〛>integerArray〚m+1〛)
    (integerArray〚m〛>integerArray〚m+1〛)の値を入れ替える
   endif
    endfor
    endfor
   integerArrayの全ての要素を先頭から順にコンマ区切りで出力する
   
2024.11.05 20:21
D.sさん  
(No.4)
《選択肢》
a 1,2,3,4
b 1,3,2,4
c 3,1,4,2
d 4,3,2,1
2024.11.05 20:22
D.sさん  
(No.5)
以上が問題内容及び問題に対しての回答選択肢です。解答自体は[a]になってました。
説明文も読んでみたのですが、初めてなので全く分かりませんでした。
《質問》
《1》解答には「変数nを1~3(=integerArrayの要素数-1)まで1ずつ増やしながら、変数mを1~(integerArrayの要素数ーn)まで1ずつ増やして」とあります。まず、何で、ここで変数nを1~3までって確定するのでしょうか。変数mを1~〃まで1ずつ増やしての部分も自信があるほど理解出来てません。
《2》こういう問題を解ける様にするには、どういった勉強の仕方をすれば解決出来ますか。
2024.11.05 20:30
オリザさん 
IP ブロンズマイスター
(No.6)
まずこの問題を解くには、integerArray〚m〛がintegerArrayの左からm番目の数字を意味するのだということを把握しないといけません。なぜそうなるのかと問われると難しいのですが、疑似言語とはそんなもんだと思ってください。
integerArrayは4桁なので、mの取りうる値は1,2または3です。m+1という桁数が出てきていますので、これが4以内、すなわちm+1≦4 となってないといけません。

if(integerArray〚m〛>integerArray〚m+1〛)
↑もし、integerArrayのm番目の数字がm+1番目の数字より大きければ

(integerArray〚m〛>integerArray〚m+1〛)の値を入れ替える
↑左右の順番を入れ替える

最初はn=1の条件下でこれをやります。n=1すなわちmは1,2,3です。
つまり左から1番目と2番目、2番目と3番目、3番目と4番目を比較して、左側が大きければ左右を入れ替えます。
この時点で、4は一番右に行くはずです。(やってみてください)
次に、n=2の条件下でこれをやります。n=2すなわちmは1か2です。
つまり左から1番目と2番目、2番目と3番目を比較して、左側が大きければ左右を入れ替えます。
この時点で、3が右から2番目に行くはずです。
最後に、n=3の条件下でこれをやります。n=3、すなわちm=1です。
つまり左から1番目と2番目を比較して、左側が大きければ左右をいれかえます。

これで処理は終わり。ものっすごくまどろっこしい書き方がされてますが、
やってることはバブルソートです。
バブルソートをまだ勉強していなければ、言葉を調べてみてください。
2024.11.05 20:51
オリザさん 
IP ブロンズマイスター
(No.7)
この問題は実際に自分が受験したとき出てきた問題なのですが、自分は上記のように丁寧には解かず、以下に気付いた時点で思考をショートカットしました。
・見た感じ、隣り合った数字を比べては入れ替える、これを繰り返している
・ということは、これはバブルソートである
と気づいたので、結論は1,2,3,4か4,3,2,1のどちらかしかない。

もう一度プログラム文を見てみると、
 if(integerArray〚m〛>integerArray〚m+1〛)
    (integerArray〚m〛>integerArray〚m+1〛)の値を入れ替える
となっていて、大きい数字が右に右に移るようになっている。
ということは、結果は1,2,3,4で確定。

こういう問題を解けるようになるには、プログラム文と接してクセに慣れることが一番だと思います。特にifとendif、forとendforの流れ。なんとなく楽譜記号に似てると思います。ダカーポ、セーニョ、ダルセーニョなどなど。
ただし合格だけを目指すならここまで勉強する必要はありません。
今後上位資格へのステップアップを目指すなら読めるようになっておく必要があると思いますが。
2024.11.05 21:00

返信投稿用フォーム

※CBT試験では出題内容の公開が禁止されているため、直接的・間接的を問わず、出題内容や難易度を尋ねる質問は厳禁です。
※宣伝や迷惑行為を防止するため、当サイト、姉妹サイト、IPAサイト以外のURLを含む記事の投稿はできません。

投稿記事削除用フォーム

投稿番号:
パスワード:

その他のスレッド


Pagetop