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

【擬似言語⑨】オツリ硬貨の算出 | 配列化による拡張性(基本情報技術者, 科目B, アルゴリズム)

    このNoteでは、金額から各硬貨の枚数を算出する擬似言語を作ります。while文の適性を知り、さらに配列によって手軽に対応硬貨/紙幣を変更できるメリットを学びます。

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

    ぜひ一緒に学習を進めていきましょう!


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

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


    オツリ硬貨の算出 | 100円玉のみ

    自販機をイメージして「オツリ300円の時、100円玉3枚出せば良い」って計算する擬似言語を考えます。

    オツリ300円が、200円や100円でも算出して欲しいので「オツリ-100円」って計算をループさせます。

    整数型: change ← 300
    整数型: coins ← 0
    
    while (change ≧ 100)
        change ← change - 100
        coins ← coins + 1
    endwhile
    
    「coinsの値」を表示する

    オツリ金額によってループ回数が変わります。回数制御に向いてるfor文ではなく、条件制御(100円硬貨で返せるだけ続ける)のwhile文が適材適所です。
    >擬似言語の教科書のNote(⑮for文)
    >擬似言語の教科書のNote(⑯while文)




    他硬貨への対応 | モジュールのコピペ

    もし、オツリ350円だったら100円玉3枚では、50円を返せてません。50円玉にも対応します。

    整数型: change ← 350
    整数型: coins100 ← 0
    整数型: coins50 ← 0  // 50円玉用の変数にする
    
    / 100円玉用 */
    while (change ≧ 100)
        change ← change - 100
        coins100 ← coins100 + 1
    endwhile
    
    / 50円玉用 */
    while (change ≧ 50)
        change ← change - 50
        coins50 ← coins50 + 1
    endwhile
    
    「coins100の値」と「coins50の値」を表示する

    100円玉用のモジュールを、コピペして50円玉用にカスタマイズ。枚数を記録する変数coins50と作って、ループ処理を50円を引き/枚数を足すように変更。ちょちょいのちょいと。




    他硬貨への対応 | 配列化で得る拡張性

    前節の50円玉対応で、変数coins100と変数coins50を設けました。今後、他硬貨に対応すると、coins10とかcoins1とかが必要になります。ループモジュールも同じく追加が必要。

    配列を使ってみます。

    >【FEB】擬似言語の教科書Noteの⑳ でやりましたね。月別売上を記録する変数が12個になって面倒だから、「配列」使おうぜ!って。

    配列の要素番号(添え字)に、ループカウンタを使うと、計算に使うデータ/記録につかう部屋を切り替えられるので便利になりますね。

    整数型: change ← 350
    整数型: 配列: coinTypes ← {100, 50}
    整数型: 配列: coins ← {0, 0}
    整数型: i
    
    for (i を 1 から 2 まで 1 ずつ増やす)
        while (change ≧ coinTypes[i])
            change ← change - coinTypes[i]
            coins[i] ← coins[i] + 1
        endwhile
    endfor
    
    配列coins[]の全要素をコンマ区切りで表示する

    計算した枚数coins100, coins50などを、配列coinsに記録します。計算に使う硬貨価値(100円や50円など)は、配列coinTypesに。


    まだエレガントじゃないです。forが「2まで」が手動すぎる。

    for文のループ回数は、硬貨の種類数。つまり「coinTypesの要素数」。

    整数型: change ← 380
    整数型: 配列: coinTypes ← {100, 50, 10}
    整数型: 配列: coins ← {0, 0, 0}
    整数型: i
    
    for (i を 1 から coinTypesの要素数 まで 1 ずつ増やす)
        while (change ≧ coinTypes[i])
            change ← change - coinTypes[i]
            coins[i] ← coins[i] + 1
        endwhile
    endfor
    
    配列coins[]の全要素をコンマ区切りで表示する

    配列(coinTypesとcoins)をイジるだけで、他処理は一切イジる必要なく動きます。




    完成版 | 硬貨・紙幣への対応も

    オツリ硬貨の枚数算出の擬似言語が、完成しました。

    整数型: change ← 681
    整数型: 配列: coinTypes ← {500, 100, 50, 10, 1}
    整数型: 配列: coins ← {0, 0, 0, 0, 0}
    整数型: i
    
    for (i を 1 から coinTypesの要素数 まで 1 ずつ増やす)
        while (change ≧ coinTypes[i])
            change ← change - coinTypes[i]
            coins[i] ← coins[i] + 1
        endwhile
    endfor
    
    配列coins[]の全要素をコンマ区切りで表示する

    配列(coinTypesとcoins)に、500, 10, 1円を追加しただけです。


    1万円札, 5千円札, 千円札も、一瞬で導入できます。

    整数型: change ← 14681
    整数型: 配列: coinTypes ← {10000, 5000, 1000, 500, 100, 50, 10, 1}
    整数型: 配列: coins ← {0, 0, 0, 0, 0, 0, 0, 0}
    整数型: i
    
    for (i を 1 から coinTypesの要素数 まで 1 ずつ増やす)
        while (change ≧ coinTypes[i])
            change ← change - coinTypes[i]
            coins[i] ← coins[i] + 1
        endwhile
    endfor
    
    配列coins[]の全要素をコンマ区切りで表示する

    一時期存在した2千円札にもすぐ対応できますし。2万円札, 5万円札が導入されても大丈夫です。2つの配列をちょいちょいとイジるだけ。

    細かい話。変数「coins」「coinTypes」のままなのは、ご愛嬌(紙幣なのにcoinって😅)。 「money」や「cash」を絡めた名前が良いかもですね。




    まとめ

    お疲れ様でした!

    while文が向いている制御を実践し、配列を導入した機能変更がすごく簡単になる学びもできました。

    このシリーズは、>【FEB】擬似言語の教科書Note の基礎を生かしつつ、考察と次回への布石を追加して「知識のリレー」を繋いでいくように作っています。

    次回は別のループの仕方「再帰関数/再帰呼出し」を学びます。科目Aでも出てますよ。関数f(x)の中でf(x-1)を呼出す処理。数学的には「階乗」を題材にします。>【擬似言語⑩】階乗 | 再帰関数のNote

    なお公開問題では、オツリの出し方のパターン数を算出する擬似言語が出ました。例えば、12円だったら4通り(10円×1枚+1円×2枚, 5×2+2, 5×1+1×7, 1×12)。>【FEB】令和07年問02のNote


    最後に私のお薦めの演習順番。
    ❶学習前の”分からせ”
    >【FEB】サンプル問題2のNote
    ❷テキスト
    >【FEB】擬似言語の教科書Note
    >【FEB】擬似言語の理解演習Note ←いまこの辺
    ↓※必要なら
    うかる! 基本情報技術者 [科目B・セキュリティ編](amazon)
    うかる! 基本情報技術者 [科目B・アルゴリズム編](amazon)
    ❸各年度の公開問題
    >【FEB】令和07年科目BのNote
    >【FEB】令和06年科目BのNote
    >【FEB】令和05年科目BのNote
    ➍解法の総復習(➋や➌と併用可)
    >【FEB】擬似言語の11の解法Note
    ➎模擬試験
    >【FEB】サンプル問題1のNote(擬似言語)
    >【FEB】サンプル問題1のNote(セキュリティ)

    この記事が参加している募集

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