~モバイルを知る~ 日常生活とモバイルコンピュー...
TRANSCRIPT
Webプログラミングの基礎PHPの基礎(10)(2011/07/20)
政策情報学部
渡辺恭人
メーリングリスト:[email protected]:
資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/
7/6課題(1)再び
• 【基本】じゃんけんのプログラムを説明し、実行結果を報告してください
• 【できればやってみて】5回対戦して、最後に
その結果を表示させるように改造してみてください
2
【できればやってみて】部分
• 5回対戦して、最後にその結果を表示させるように改造してみてください
• アプローチ
–対戦回数と勝利数を管理する変数を用意する
– じゃんけんの手を自分自身にPOSTで送るときに、対戦回数と勝利数も送る
• PHPのプログラムをPOSTやGETで呼び出す毎に、呼び出された側のPHPのプログラムは、変数がリセットされるため
–対戦回数が5回を越えたときに、勝利数を表示3
4
ボタンが押されてたかどうかのデータと対戦回数データが送信されていれば、じゃんけんの対戦。
じゃんけんの対戦(勝敗の判断)人間の勝利なら、勝利数に1を加える
この対戦が5回目なら、勝利数と次の対戦を促す表示文字列を作成
送信されてなければ、対戦回数の初期化と初期の表示用文字列を作って下へ
メッセージを表示フォームで判定したい手を入力させる
ボタンをクリックしたら、データを自分自身に送信
“start”:ボタンが押されたかどうか“yourhand”:入力された手のデータ“num”:対戦回数“win”:勝利数
前回紹介した方法
• 対戦回数や勝利数を自分自身にPOSTで送る
–プログラムの構造がやや複雑に
–別のページに遷移しても、データを管理できる機構はないのか?
5
セッション機構の利用
• セッション機構
–サーバとクライアント(ブラウザ)間のやりとりで、やりとりしている相手を記憶する場合に利用する
• セッション機構をPHPで使うとき
–すべてのやりとりを開始する前に session_start()関数を呼び出して、「これから使います」と届ける
6
データの管理
• 初期化– セッション機構を使ってデータを登録するときに、はじめはすべてゼロにする
• スーパーグローバル変数$_SESSIONの利用– $_GET や$_POSTと同様に、あらかじめ用意されている
– 複数のページ間で変数を共有したいときに、$_SESSIONを利用する
– 本来はサーバとクライアント間でデータをやりとりするもの
– 構造は、連想配列
7
データの管理例
• インデックスラベル毎に代入
• 管理するデータの数が多いとき
– array()関数を使って、まとめて代入
8
$_SESSION['dataname'] =0;
$_SESSION['comment'][] =""; 文字列の場合
$_SESSION = array(total_cnt => 0, comment => array(""));
array()関数は、()の中の引数を配列化する$_SESSIONは連想配列なので、複数のデータを一度に登録する場合、 array()
関数で、 「配列のキーとなる文字列」と「データ」を「=>」でつなげて、代入するcommentは文字列(配列)変数なので、初期化するときは、array(””)として空にする
セッション機構でデータを管理すれば
• 管理されているデータはリセットされない
–ページからページへ、プログラムからプログラムへ遷移(ジャンプ)しても、管理されているデータ(例えば、勝利数や対戦回数)はリセットされない
• じゃんけんゲームでは、
– フォームから自分自身に送信するのは、自分が出す「手」だけ
– フォームから、対戦回数や勝利数を送る必要がなくなる
9
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);
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"]++;
}
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 = "さあ始めましょう";
}
?>
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>
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>
課題(2)
• 【基本】前回課題のプログラムを、改善されたアルゴリズムで改造し、動作を確認しなさい
• 【測定】オリジナルと上のプログラムの性能差を確認するため、それぞれのプログラムのfor
文の前後に時間を計測する関数を入れ、その差から、実行時間がどれくらいかを計測し、その結果について報告しなさい
– ヒント:microtime()関数のマニュアルを見る
–判定したい数: 9999991
–実行回数:それぞれ10回 15
【基本】部分①
16
<?php
if (isset($_POST["start"])) {
$number = $_POST["target"];
sosu_check($number);
$message = "続けて、素数かどうか調べたい数を入力してください。";
} else {
$message = "素数かどうか調べたい数を入力してください。";
}
【基本】部分②
17
function sosu_check($a){
$s = "は素数です<br />";
for ($i = 2; $i <= ($a/2); $i++){
if ($a % $i == 0) {
$s = "は、素数ではありません<br />";
break;
}
}
print $a . $s;
}
?>
【基本】部分③
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>
測定
• 時間を計るには、microtime()関数を使う
• 使い方
– http://php.net/microtimeで調べる
–時間を計りたい前後で、microtime()関数を実行し、その差を求める
19
測定部分①
20
<?php
if (isset($_POST["start"])) {
$number = $_POST["target"];
sosu_check1($number);
sosu_check2($number);
$message = "続けて、素数かどうか調べたい数を入力してください。";
} else {
$message = "素数かどうか調べたい数を入力してください。";
}
測定部分②
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;
}
測定部分③
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;
}
?>
測定部分④
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>
本日の課題
• セッションを使ったデータ管理を行うじゃんけんゲームjanken3.phpについて、以下の項目でレポートしてください
–プログラムの流れを説明してください
–実行した結果を示し、動作を確認してください
–感想、考えたことを述べてください
• ファイル名: kadai0720-学籍番号.docx
• 提出先:メーリングリスト
• 締切: 7/26 23:5924
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