メインコンテンツへスキップ
見出し画像

【擬似言語アルゴ②課題C】複数個分のシフト(基本情報技術者, 科目B, アルゴリズム)

    このNoteでは、「複数個分だけ右シフトする関数」を作ります。まずは予め作った「1個分だけ右シフトする関数」を活用してみます。>【アルゴ②】シフトの基礎Note

    その上で、無駄な処理を発見し改善していくのが、新しい学びです。


    テキストの基礎を生かして、プログラム的な考察/工夫を学んでいきます。基礎と実用にギャップを感じる方のために作りました。
    >【FEB】擬似言語の教科書Note
    ぜひ一緒に学習を進めていきましょう!

    このNoteは、私がIT専門学校で授業したことを基に作成しています。
    IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。

    >全Noteへのリンク(FE節)
    ※科目Aのテーマ別/科目B/旧FE午後など沢山作りました!


    1個右シフトの関数呼出しを繰り返す

    任意の個数(k個)シフトする関数を作ってみます。

    まず右シフトの2個ずらし。

    画像

    >【アルゴ②】シフトの基礎Note で作った、右シフトの関数を2回呼べば良いですね。

    ○整数型の配列: rightShift(整数型の配列: array)

    「array ← rightShift(array)」で、arrayを関数に入れて、1個右シフトされた配列をarrayで受け直します。

    ○整数型の配列: multiRightShift(整数型の配列: array, 整数型: k)
      整数型: i
      
      / k回、1マス右シフトの関数を繰り返す */
      for ( i を 1 から k まで 1 ずつ増やす)
        array ← rightShift(array)
      endfor
      
      return array

    k回繰り返せば、k個右シフトされます。

    2つ右シフトさせたいなら、「multiRightShift(array, 2)」と呼び出しせば良し。




    関数展開を展開してみる

    下のrightShift関数の中身をぶちまけてみます。

      / k回、1マス右シフトの関数を繰り返す */
      for (count を 1 から k まで 1 ずつ増やす)
        array ← rightShift(array)
      endfor

    >【アルゴ②】シフトの基礎Note からrightShift関数の中身を展開。下コードの「ここから関数」から「ここまで関数」にコピペ。

    ○整数型の配列: multiRightShift(整数型の配列: array, 整数型: k)
      整数型: i
      
      / k回、1マス右シフトの関数を繰り返す */
      for (i を 1 から k まで 1 ずつ増やす)
    
        / ------------------ */
        / --- ここから関数 ----*/
        length ← arrayの要素数
      
        / 1. 後ろの要素から順番に、1つ右(i+1)の場所へコピーする */
        for (i を length-1 から 1 まで 1 ずつ減らす)
          array[i + 1] ← array[i]
        endfor
      
        / 2. 空いた先頭のマスに新しい値を入れる */
        array[1] ← 0
        / --- ここまで関数 ---*/
        / ------------------ */
    
      endfor
      
      return array

    「length ← arrayの要素数」の「length」の変数宣言がないので、宣言するか。使う場所がfor文内だけなので、for文に組み込むか。

    後者を採用。for文に組み込みました。「 for (i を arrayの要素数-1 から」。

    ○整数型の配列: multiRightShift(整数型の配列: array, 整数型: k)
      整数型: i
      
      / k回、1マス右シフトの関数を繰り返す */
      for (i を 1 から k まで 1 ずつ増やす)
      
        / 1. 後ろの要素から順番に、1つ右(i+1)の場所へコピーする */
        for (i を arrayの要素数-1 から 1 まで 1 ずつ減らす) /【変更】 */
          array[i + 1] ← array[i]
        endfor
      
        / 2. 空いた先頭のマスに新しい値を入れる */
        array[1] ← 0
    
      endfor
      
      return array

    正しく動き「は」します。でもちょっと効率悪し。次節で動作を見ます。




    動作に無駄な処理がある

    前節の”1個右シフトする関数を複数回呼出す”では、無駄な処理があります。

    ”複数個右シフトする”手順を、ゼロベースで考え直し、比較してみます。

     
     
    大学・専門学校の先生の解説Note。 学生時代にITパスポート試験・基本情報技術者試験・応用情報技術者試験を独学で高得点合格。情報処理安全確保支援士試験(セキスペ)・データベーススペシャリスト試験・ネットワークスペシャリスト試験・G検定なども取得。 2027年にPD-S受験予定。