見出し画像

【擬似言語⑨】オツリ硬貨の算出 | 配列化による拡張性(基本情報技術者, 科目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 学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

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