~モバイルを知る~ 日常生活とモバイルコンピュー...

25
Webプログラミングの基礎 PHPの基礎(102011/07/20政策情報学部 渡辺恭人 [email protected] メーリングリスト:[email protected]資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/

Upload: others

Post on 30-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Webプログラミングの基礎PHPの基礎(10)(2011/07/20)

政策情報学部

渡辺恭人

[email protected]

メーリングリスト:[email protected]

資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/

Page 2: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

7/6課題(1)再び

• 【基本】じゃんけんのプログラムを説明し、実行結果を報告してください

• 【できればやってみて】5回対戦して、最後に

その結果を表示させるように改造してみてください

2

Page 3: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

【できればやってみて】部分

• 5回対戦して、最後にその結果を表示させるように改造してみてください

• アプローチ

–対戦回数と勝利数を管理する変数を用意する

– じゃんけんの手を自分自身にPOSTで送るときに、対戦回数と勝利数も送る

• PHPのプログラムをPOSTやGETで呼び出す毎に、呼び出された側のPHPのプログラムは、変数がリセットされるため

–対戦回数が5回を越えたときに、勝利数を表示3

Page 4: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

4

ボタンが押されてたかどうかのデータと対戦回数データが送信されていれば、じゃんけんの対戦。

じゃんけんの対戦(勝敗の判断)人間の勝利なら、勝利数に1を加える

この対戦が5回目なら、勝利数と次の対戦を促す表示文字列を作成

送信されてなければ、対戦回数の初期化と初期の表示用文字列を作って下へ

メッセージを表示フォームで判定したい手を入力させる

ボタンをクリックしたら、データを自分自身に送信

“start”:ボタンが押されたかどうか“yourhand”:入力された手のデータ“num”:対戦回数“win”:勝利数

Page 5: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

前回紹介した方法

• 対戦回数や勝利数を自分自身にPOSTで送る

–プログラムの構造がやや複雑に

–別のページに遷移しても、データを管理できる機構はないのか?

5

Page 6: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

セッション機構の利用

• セッション機構

–サーバとクライアント(ブラウザ)間のやりとりで、やりとりしている相手を記憶する場合に利用する

• セッション機構をPHPで使うとき

–すべてのやりとりを開始する前に session_start()関数を呼び出して、「これから使います」と届ける

6

Page 7: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

データの管理

• 初期化– セッション機構を使ってデータを登録するときに、はじめはすべてゼロにする

• スーパーグローバル変数$_SESSIONの利用– $_GET や$_POSTと同様に、あらかじめ用意されている

– 複数のページ間で変数を共有したいときに、$_SESSIONを利用する

– 本来はサーバとクライアント間でデータをやりとりするもの

– 構造は、連想配列

7

Page 8: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

データの管理例

• インデックスラベル毎に代入

• 管理するデータの数が多いとき

– array()関数を使って、まとめて代入

8

$_SESSION['dataname'] =0;

$_SESSION['comment'][] =""; 文字列の場合

$_SESSION = array(total_cnt => 0, comment => array(""));

array()関数は、()の中の引数を配列化する$_SESSIONは連想配列なので、複数のデータを一度に登録する場合、 array()

関数で、 「配列のキーとなる文字列」と「データ」を「=>」でつなげて、代入するcommentは文字列(配列)変数なので、初期化するときは、array(””)として空にする

Page 9: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

セッション機構でデータを管理すれば

• 管理されているデータはリセットされない

–ページからページへ、プログラムからプログラムへ遷移(ジャンプ)しても、管理されているデータ(例えば、勝利数や対戦回数)はリセットされない

• じゃんけんゲームでは、

– フォームから自分自身に送信するのは、自分が出す「手」だけ

– フォームから、対戦回数や勝利数を送る必要がなくなる

9

Page 10: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Janken3.php①

10

<?php

session_start();

$num = $_POST["num"];

$win = $_POST["win"];

if (isset($_POST["start"]) && $_SESSION["num"] > 0 &&

$_SESSION["num"] < 6) {

$hand[] = "グー";

$hand[] = "チョキ";

$hand[] = "パー";

$myhand = rand(0, 2);

Page 11: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Janken3.php②

11

$message = $_SESSION["num"] . "回目¥nあなたの手は" . $hand[$_POST["yourhand"]] . "ですね¥n";

$message .= "私の手は" . $hand[$myhand] . "です。¥n";

if ($_POST["yourhand"] == $myhand){

$message .= "あいこです¥n";

} elseif ($_POST["yourhand"] == ($myhand + 1) %

3){

$message .= "私の勝ちです¥n";

} else {

$message .= "あなたの勝ちです¥n";

$_SESSION["win"]++;

}

Page 12: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Janken3.php③

12

if ($_SESSION["num"] == 5) {

$message .= "あなたは" . $_SESSION["win"] ."回、勝ちました。¥n";

$message .= "終了です。もう一度始めましょう。";

$_SESSION["num"] = 1;

$_SESSION["win"] = 0;

} else {

$_SESSION["num"]++;

}

} elseif ($_SESSION["num"] == 0) {

$_SESSION["num"] = 1;

$_SESSION["win"] = 0;

$message = "さあ始めましょう";

}

?>

Page 13: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Janken3.php④

13

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>じゃんけんプログラム</title>

</head>

<body>

<h2>コンピュータとじゃんけん</h2>

<h4>グー、チョキ、パーのどれかをクリックしてね</h4>

<form method="post">

<textarea name="result" rows="6" cols="40"><?php print

$message;?></textarea>

<br>

Page 14: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

Janken3.php⑤

14

<input type="radio" name="yourhand" value="0" checked>

グー<input type="radio" name="yourhand" value="1">チョキ<input type="radio" name="yourhand" value="2">パー<?php echo "<input type=¥"hidden¥" name=¥"num¥"

value=¥"". $num . "¥">"; ?>

<?php echo "<input type=¥"hidden¥" name=¥"win¥"

value=¥"". $win . "¥">"; ?>

<input type="submit" name="start" value="じゃんけんをする">

</form>

</body>

</html>

Page 15: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

課題(2)

• 【基本】前回課題のプログラムを、改善されたアルゴリズムで改造し、動作を確認しなさい

• 【測定】オリジナルと上のプログラムの性能差を確認するため、それぞれのプログラムのfor

文の前後に時間を計測する関数を入れ、その差から、実行時間がどれくらいかを計測し、その結果について報告しなさい

– ヒント:microtime()関数のマニュアルを見る

–判定したい数: 9999991

–実行回数:それぞれ10回 15

Page 16: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

【基本】部分①

16

<?php

if (isset($_POST["start"])) {

$number = $_POST["target"];

sosu_check($number);

$message = "続けて、素数かどうか調べたい数を入力してください。";

} else {

$message = "素数かどうか調べたい数を入力してください。";

}

Page 17: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

【基本】部分②

17

function sosu_check($a){

$s = "は素数です<br />";

for ($i = 2; $i <= ($a/2); $i++){

if ($a % $i == 0) {

$s = "は、素数ではありません<br />";

break;

}

}

print $a . $s;

}

?>

Page 18: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

【基本】部分③

18

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;

charset=UTF-8">

</head>

<body>

<?php print $message;?>

<br>

<form method="post">

<input type="text" name="target" value=""><br />

<br>

<input type="submit" name="start" value="調べる">

</form>

</body>

</html>

Page 19: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

測定

• 時間を計るには、microtime()関数を使う

• 使い方

– http://php.net/microtimeで調べる

–時間を計りたい前後で、microtime()関数を実行し、その差を求める

19

Page 20: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

測定部分①

20

<?php

if (isset($_POST["start"])) {

$number = $_POST["target"];

sosu_check1($number);

sosu_check2($number);

$message = "続けて、素数かどうか調べたい数を入力してください。";

} else {

$message = "素数かどうか調べたい数を入力してください。";

}

Page 21: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

測定部分②

21

function sosu_check1($a){

$s = "は素数です<br />";

$time_start = microtime(true);

for ($i = 2; $i <= ($a-1); $i++){

if ($a % $i == 0) {

$s = "は、素数ではありません<br />";

break;

}

}

$time_end = microtime(true);

$t = $time_end - $time_start;

print $t . "seconds<br>";

print $a . $s;

}

Page 22: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

測定部分③

22

function sosu_check2($a){

$s = "は素数です<br />";

$time_start = microtime(true);

for ($i = 2; $i <= ($a/2); $i++){

if ($a % $i == 0) {

$s = "は、素数ではありません<br />";

break;

}

}

$time_end = microtime(true);

$t = $time_end - $time_start;

print $t . "seconds<br>";

print $a . $s;

}

?>

Page 23: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

測定部分④

23

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;

charset=UTF-8">

</head>

<body>

<?php print $message;?>

<br>

<form method="post">

<input type="text" name="target" value=""><br />

<br>

<input type="submit" name="start" value="調べる">

</form>

</body>

</html>

Page 24: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

本日の課題

• セッションを使ったデータ管理を行うじゃんけんゲームjanken3.phpについて、以下の項目でレポートしてください

–プログラムの流れを説明してください

–実行した結果を示し、動作を確認してください

–感想、考えたことを述べてください

• ファイル名: kadai0720-学籍番号.docx

• 提出先:メーリングリスト

• 締切: 7/26 23:5924

Page 25: ~モバイルを知る~ 日常生活とモバイルコンピュー …riho-m/rg11/files/20110720_php10.pdfWebプログラミングの基礎 PHPの基礎(10) (2011/07/20)

ITパスポート&基本情報技術者

• 平成23年度秋期試験(試験日10月16日)について– ※7/25(月)10時から申込受付開始

– http://www.jitec.ipa.go.jp/

• ITパスポート– 平成23年度[春期][秋期] ITパスポート試験合格教本 岡嶋裕史 (著)

1659円

• 予想問題や過去問500問が入ったCD-ROM付き

• 基本情報技術者– 基本情報受かる100講―赤ぺン式でスラスラわかる 福嶋宏訓 (著)

1785円・・・・午後対応、これにプラス問題集が必要

– 基本情報受かる100問―赤ぺン式でスラスラわかる 福嶋宏訓 (著) 1680円・・・・午前対応

25