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