📘

PHP ex01

2023/04/17に公開

解答言語: PHP

01

数学と英語の点数を変数に格納し、その点数を表示するプログラムを作成しなさい
また、それぞれの教科で60点以上なら”合格”と表示、60点未満なら”不合格”と表示するプログラムを作成しなさい。
例:
値が

$math = 60;
$english = 50;

の時の出力は

数学は 60 点です。合格です
英語は 50 点です。不合格です。
答えと解説
<?php

$math = 40;
$english = 50;

echo "数学は ". $math ." 点です。";
if ($math >= 60) {
    echo "合格です";
} else {
    echo "不合格です";
}

echo "<br>"; // 改行のためのbr

echo "英語は ". $english ." 点です。";
if ($english >= 60) {
    echo "合格です。";
} else {
    echo "不合格です。";
}
?>

$math$englishが60以上で合格、未満で不合格が出ればOK

分岐の条件は60の数値を使用すると後々わかりやすくなる。

PHPの文字列連結は.を使用すると実現できる
https://www.php.net/manual/ja/language.operators.string.php

02

数学と英語の点数を変数に格納し、合計値を出力しなさい。また、100点未満の場合”C判定”、100点以上140点未満の場合"B判定"、 140点以上の場合"A判定"と出力するプログラムを作成しなさい。
例1:
値:

$math = 100;
$english = 50;

出力:

A判定

例2:
値:

$math = 50;
$english = 50;

出力

B判定
答えと解説

<?php

$math = 50;
$english = 50;

$sum = $math + $english;

if( $sum >= 140){
    echo "A判定";
}
else if( $sum >= 100 && $sum < 140){
    echo "B判定";
}
else  {
    echo "C判定";
}

?>

以下のパターンで正しく動けばOK

数学 英語 判定
50 50 B判定
49 50 C判定
70 69 B判定
70 70 A判定

1つ目と3つ目は同じB判定のパターンだが、Cに判定される境界とAに判定される境界が正しく分岐されているかを確認するためにチェックした方がいい。

03

過去3回の数学の得点を配列に格納し、合計値と平均値を求めるプログラムを作成しなさい。
例:

1回目 2回目 3回目
80 100 60

出力

合計値: 240
平均値: 80
答えと解説

<?php

$math_points = [80, 100, 60];

$sum = 0;
// 合計の計算
// foreachを使って配列の要素を基準にループ処理を行う
foreach( $math_points as $p ){
$sum += $p;
}

echo "合計値: ". $sum;
echo "
";
echo "平均値: ". ( $sum /count( $math_points) );

?>

ポイントとしては

  1. 配列に値を格納する
  2. 合計を計算する
  3. 平均の計算
  4. 表示

ができてていればOK

04 FizzBuzz

1 ~ 100までの数値を画面に表示させ、3の倍数の時は「Fizz」を、5の倍数の時は「Buzz」を、15の倍数の時は「FizzBuzz」の文字列を出力するプログラムを作成しなさい。
出力例:

1:
2:
3: Fizz
4:
5: Buzz
6: Fizz
7:
8:
9: Fizz
10: Buzz
11:
12: Fizz
13:
14:
15: FizzBuzz
答えと解説
<?php
// 回数指定の場合は通用のfor文の方が使いやすい
for($i = 1 ; $i <= 100; $i++){
    echo $i. ": ";

    if( $i % 3 == 0 ){
        echo "Fizz";
    }
    if($i % 5 == 0) {
        echo "Buzz";
    }
    echo "<br>";
} 
?>

%を使って剰余算をすれば三の倍数、五の倍数がわかる。

3と5の倍数かどうかの分岐を両方確認して、改行せずに表示しても出力の状態にできる

下記のパターンのように条件を複数書いても可能

その時は3,5,15の剰余算分岐順番に注意が必要

// 回数指定の場合は通用のfor文の方が使いやすい
for($i = 1 ; $i <= 100; $i++){
    echo $i. ": ";

    if ($i % 15 == 0 ){
        echo "FizzBuzz";
    }
    else if( $i % 3 == 0 ){
        echo "Fizz";
    }
    else if($i % 5 == 0) {
        echo "Buzz";
    }

    echo "<br>";
} 

05

3つの変数がある時、3つのうち2つが同じ値かどうかを確認して、同じ値であれば”OK”を異なる値であれば”NG”を出力するプログラムを作成しなさい。
例1:

1つめ 2つめ 3つめ
100 100 200
OK

例2:

1つめ 2つめ 3つめ
100 "100" 200
NG
答えと比較
$b = 100;
$c = 200;

$ab = $a === $b;
$bc = $b === $c;
$ca = $c === $a;

if ( $ab || $bc || $ca ){
    echo "OK";
}
else{
    echo "NG";
}

比較の結果も変数には代入できる(Boolean型)

どれかの条件を満たす場合にはOKを表示し、そうでない場合はNGを表示する。

AとBのいずれかがtrueの場合にはtrueを返すを実装するために||で比較を行う

06

0から194まで数を1ずつ増やして表示するプログラムを作成せよ。ただし、1行に表示できるのは3個までとし、
表形式で表示すること。

HTML出力


<table>
<tr><td>0</td><td>1</td><td>2</td></tr>
<tr><td>3</td><td>4</td><td>5</td></tr>
<tr><td>6</td><td>7</td><td>8</td></tr>
	:
	:
<tr><td>186</td><td>187</td><td>188</td></tr>
<tr><td>189</td><td>190</td><td>191</td></tr>
<tr><td>192</td><td>193</td><td>194</td></tr>
</table>

ブラウザ出力

0	1	2
3	4	5
6	7	8
   :
   :
答えと解説
<table>
<?php
for($i = 0; $i < 194 ; ){
    echo "<tr>";
    echo "<td>";
    echo $i;
    $i++;
    echo "</td>";
    echo "<td>";
    echo $i;
    $i++;
    echo "</td>";
    echo "<td>";
    echo $i;
    $i++;
    echo "</td>";
    echo "</tr>\n";
}
?>
</table>

庫の解答例のポイントは

  1. PHPタグの外にtableタグを記述すること
  2. tr(行タグ)とtd(データタグ)をPHPから出力すること
  3. forの3つ目の加算処理を空白にして、$iの加算はループの中に自分で記述すること

別解としてforを入れ子にする方法もある

forの中で処理していることも繰り返しになっていればforを使うことで繰り返しとして記述できる。

入れ子が2重のため、2重forとか2重ループとか言われる場合もある。

<table>
<?php
for($i = 0; $i < 194 ; ){
    echo "<tr>";
    for($j = 0 ; $j < 3; $j++){
        echo "<td>";
        echo $i;
        $i++;
        echo "</td>";
    }
    echo "<tr>";
}
?>
</table>

07

以下の文字列が何文字か表示するプログラムを作成しなさい

Tyhgq9myXyFXFkJ4nAAqgpUgHNXEYvjwRekpHKvqzmnqPThWbUuwhKiNvDtVTJpnJMayzCi3tHmJxEyW2MCKrq7RnT43g2csE
答えと解説

文字数の正解は97文字

<?php
echo mb_strlen("Tyhgq9myXyFXFkJ4nAAqgpUgHNXEYvjwRekpHKvqzmnqPThWbUuwhKiNvDtVTJpnJMayzCi3tHmJxEyW2MCKrq7RnT43g2csE");
?>

PHPの文字数を返してくれる、mb_strlenメソッドを調べられれば簡単

ただし、よく似ている、strlenだとバイトサイズが返されるため、”文字数”が取得できるわけではないため注意。
今回のような大文字小文字の英数だけなら問題ないが、日本語などの2バイト文字が含まれているとstrlenでは2文字文とカウントされる。

08

前問の文字列で40番目の文字を"#"に変更するプログラムを作成しなさい。

答えと解説

答え出力

問題:Tyhgq9myXyFXFkJ4nAAqgpUgHNXEYvjwRekpHKvqzmnqPThWbUuwhKiNvDtVTJpnJMayzCi3tHmJxEyW2MCKrq7RnT43g2csE
出力:Tyhgq9myXyFXFkJ4nAAqgpUgHNXEYvjwRekpHKvq#mnqPThWbUuwhKiNvDtVTJpnJMayzCi3tHmJxEyW2MCKrq7RnT43g2csE

ソースコード

<?php

$q = "Tyhgq9myXyFXFkJ4nAAqgpUgHNXEYvjwRekpHKvqzmnqPThWbUuwhKiNvDtVTJpnJMayzCi3tHmJxEyW2MCKrq7RnT43g2csE";

$ans = substr_replace($q, "#", 40,1);

echo "問題:" .$q;
echo "<br>";
echo "出力:" .$ans;

?>

こちらも、指定した文字数分を置換してくれるsubstr_replace関数を調べられれば簡単。

第1引数に対象文字列
第2引数に置換したい文字列
第3引数に置換位置
第4引数置換する長さ

1文字で問題ないため、第4引数は1を設定すれば1文字だけ置換できる。

09

以下の計算をプログラムを使って計算しなさい

a 20303.22 + 10120.19

b 212 - 100000

c 3.14 x 9.99 ( x: 乗算)

d 1.33 ÷ 33

e 394383 を 10000で割った余り

f 33^7 (^:指数)

g 10 - 19 ÷ 2

h ( 10 - 19 ) ÷ 2

i ( ( 5 + 0.1 ) + 5 ) ÷ 2

答えと解説
<?php

echo "<h1> a `20303.22 + 10120.19` </h1>";
echo 20303.22 + 10120.19;

echo "<h1> b `212 - 100000` </h1>";
echo 212 - 100000;

echo "<h1> c `3.14 x 9.99       ( x: 乗算)` </h1>";
echo 3.14 * 9.99;

echo "<h1> d `1.33 ÷ 33` </h1>";
echo 1.33 + 33;

echo "<h1> e `394383 を 10000で割った余り` </h1>";
echo 394383 % 10000;

echo "<h1> f `33^7		(^:指数)` </h1>";
echo 33 ** 7;

echo "<h1> g `10 - 19 ÷ 2` </h1>";
echo 10 - 19 / 2;

echo "<h1> h `( 10 - 19 ) ÷ 2 ` </h1>";
echo (10 - 19) / 2;

echo "<h1> i `( ( 5 + 0.1 ) + 5 ) ÷ 2` </h1>";
echo ( ( 5 + 0.1 ) + 5 ) / 2;

計算できれば基本OK

Discussion