Calculate pagination
ページネーション
On this page
課題
とある在庫管理システムの一覧画面では、在庫を 1 ページに 100 件表示しています。 その際、以下の項目を合わせて表示します。
- 在庫は全部で何件あるか
- 全部で何ページあるのか
- 現在、何ページ目か
- 現在、何件目から何件目を表示しているか
そこで、在庫の件数が与えられたときに全部で何ページあるかを返す関数を作成してください。
なお、関数名は getPageCount あるいは get_page_count とし、引数は整数が 1 つ、返り値は整数が 1 つであるとします。
アプローチ案
在庫 n 件なら何ページ?
具体例で考えさせる。
- 在庫が 5 件あったら全部で何ページある?
- 在庫が 300 件あったら全部で何ページある?
それに対する答え(1 ページ、3 ページ)などに対して、その数字はどうやって出したのかを考えさせる。
想定解
- 100 で割る -> 5 件の時に説明がつかない。100 で割れないときはどうするの?という問いかけをして場合分けさせる方向性が有効か。
if stock_num % 100 == 0:
# code...
else:
# code...
n ページになる場合の在庫件数で考えられるのは?
このアプローチはおすすめしない。なぜかというと、if 文を永遠に書き続けるアプローチになりかねないから。
具体例としては次のようなものがある。
- 全部で 1 ページになる場合の在庫で考えられるのは?
- 全部で 3 ページになる場合の在庫で考えられるのは?
1 から 100 件、201 件から 300 件など、答えは出てくるものの、それをコードで表そうとすると以下のようになる。
if stock_num >= 1 and stock_num <= 100:
return 1
elif stock_num >= 201 and stock_num <= 300:
return 3
以後、別のパターンを考えて elif を増やす方向でしか物事を考えられなくなり、永遠に実装が終わらない。
これを解決するには、201 から 300 の数字に共通点を見つけさせる方向に持っていかなければならず、問題がさらに難しくなる。
解決案としては 1 を引くと 100 の位が同じになる点に着目。(これを教えてしまうとアルゴリズムの勉強にならないのだが)
s = stock_num - 1
return s // 100