トラック
/
PHP
PHP
/
演習
/
ピザとπ
ピザとπ

ピザとπ

学習演習

はじめに

整数

整数とは、{..., -2, -1, 0, 1, 2, ...}の集合に属する数です。 整数の最大値と最小値は、PHPが動作しているシステムによって決まります。 通常、最近のほとんどのシステムでは、整数は64ビットの値です。つまり、-9_223_372_036_854_775_808から9_223_372_036_854_775_807までを表すことができます。

<?php

$a = 1234;
$a = 1_234_567;

基数の接頭辞を使うと、10進数以外の基数で整数リテラルを書くことができます。

<?php

$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0o123; // octal number (as of PHP 8.1.0)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)

PHPのドキュメントより

浮動小数点数

PHPでは、実数の一部を表すために浮動小数点数を使います。 小数点で区切られた1桁以上の数字で始まります。

<?php

$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // as of PHP 7.4.0

よくある落とし穴

すべての数値と算術演算が浮動小数点数で扱えるわけではありません。 ドルとセントを表すのに浮動小数点数を使うと、丸め誤差につながることがあります。

<?php

$result = 0.1 + 0.2; // => 0.30000000000000004

算術演算子

PHPには、算術演算を行うための演算子がいくつか用意されています。PHPの算術演算子は、数学の標準的な演算の順序に従います。PHPで用意されている演算子は次のとおりです。

  • 単項プラス (+)
  • 単項マイナス (-)
  • 加算 (+)
  • 減算 (-)
  • 乗算 (*)
  • 除算 (/)
  • 余り (%)
  • 累乗 (**)
$moles = +'10';
$aLotOfMoles = 6.022 * 10**23 * $moles;

説明

リリーは料理が大好きです。 友達と一緒にピザパーティーを開きたいと思っています。 材料を無駄なく使い切るには、作り始める前にそれぞれの材料がどれくらい必要かを知っておかなければなりません。

そこでリリーは、計画の一部を自動化するプログラムを書き始めましたが、完成させるには助けが必要です。 リリーが分量ぴったりのピザパーティーを開くのを手伝ってみませんか?

1. 生地の比率

リリーは、耳まで薄いパリッとしたクリスピーなピザが好きです。 中央部分に必要な生地は最低200gですが、食べる人が1人増えるごとに生地がさらに20g必要になります。

grams = pizzas * ((persons * 20) + 200)

リリーが必要としているのは、次のような関数です。

  • ピザの枚数を受け取り
  • 1枚のピザを何人で分けるかを表す人数を受け取り
  • 必要な生地の量を、1g単位で四捨五入して返します。

たとえば、8人分になるピザを4枚作る場合を考えてみましょう。

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateDoughRequirement(4, 8);
// => 1440

2. ソースを少々

リリーはソースをかける量にはとても細かく気を配りますが、ピザの大きさは毎回同じとは限りません。 経験から、ピザ1枚につき125mLのソースが必要だと知っています。 リリーが必要としているのは、ソースを何缶買えばよいかを計算する関数です。

cans of sauce = pizzas * sauce per pizza / sauce can volume

たとえば、8枚のピザを作る必要があり、1缶が250mLの場合を考えてみましょう。

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateSauceRequirement(8, 250);
// => 4

3. チーズもお願いします

チーズはきれいな立方体の形で、大きさごとに売られています。

リリーが使う式はピザの面積を求める式ではありません。チーズをピザ全体に敷き詰めたいわけでは_ない_からです。 そこでリリーは、ある一辺の長さ(cheese_dimension)のチーズの立方体から、ある直径(diameter)のピザが何枚作れるかを求めるために、次の式を使うことにしました。

pizzas = (cheese_dimension³) / (thickness * PI * diameter)

次のような関数を作成してください。

  • チーズの立方体の一辺の長さを受け取り
  • チーズ層の希望の厚さを受け取り
  • ピザの直径を受け取り
  • リリーの式を使って、作れるピザの枚数を小数点以下を切り捨てて返します。

たとえば、25x25x25cmのチーズの立方体、厚さ0.5cmのチーズ層、直径30cmのピザの場合を考えてみましょう。

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateCheeseCubeCoverage(25, 0.5, 30);
// => 331

4. 公平な分配

最後に、リリーはピザを1枚8切れに分けて、友達に公平に配りたいと思っています。

次のような関数を作成してください。

  • ピザの枚数と友達の人数を受け取り
  • 1人が同じ数ずつ切れを受け取ったときに残る切れの数を返します。

たとえば、次のようになります。

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateLeftOverSlices(2, 4);
// => 0
$pizza_pi->calculateLeftOverSlices(4, 3);
// => 2
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
PHP Exercism

ピザとπを始める準備はできましたか?

Exercismに登録すれば、11個のコンセプト122個の演習、そして本物の人間によるメンタリングとともに、PHPを学んでマスターできます。すべて無料です。