Webプログラミングの 基 礎 PHPの 基 礎 (8) (2011/07/06) 政 策 情 報 学 部 渡 辺 恭 人 riho-m@cuc.ac.jp メーリングリスト:riho-m-rg11@cuc.ac.jp: 資 料 ページ: http://www.cuc.ac.jp/~riho-m/rg11/
前 回 の 課 題 POSTでデータが 送 信 されているかを 確 認 送 信 されていれば sosu_check() 関 数 の 引 数 に 渡 す 送 信 されてなければ 初 期 の 表 示 用 文 字 列 を 作 って 下 へ start :ボタンが 押 された かどうか target : 入 力 されたデータ sosu_check() 関 数 引 数 が 素 数 かどうかを 判 定 する 入 力 を 促 す 初 期 メッセージを 表 示 フォームで 判 定 したい 数 を 入 力 させる ボタンをクリックしたら データを 自 分 自 身 に 送 信 2
前 回 の 課 題 :プログラム1 <?php if (isset($_post["start"])) { $number = $_POST["target"]; sosu_check($number); $message = " 続 けて 素 数 かどうか 調 べたい 数 を 入 力 してください "; } else { $message = " 素 数 かどうか 調 べたい 数 を 入 力 してください "; } 3
前 回 の 課 題 :プログラム2 function sosu_check($a){ $s = "は 素 数 です<br />"; }?> for ($i = 2; $i <= ($a - 1); $i++){ if ($a % $i == 0) { $s = "は 素 数 ではありません<br />"; break; } } print $a. $s; 4
前 回 の 課 題 :プログラム3 <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> 5
アルゴリズムの 改 善 情 報 システムの 復 習 エラトステネスのふるいの 定 義 通 りのアルゴ リズム 判 定 したい 数 はnを 判 定 するための 計 算 回 数 は n-2 これを 改 良 して 時 間 を 短 縮 させたい 計 算 回 数 を 少 なくする 例 えば 判 定 したい 数 を2で 割 った 数 以 上 の 数 で 割 る 必 要 はない 6
どこを 変 更 するか 繰 り 返 し(for 文 )のところ 半 分 より 小 さい 数 だけで 判 定 したい 数 を 割 る ($a - 1) のところ さらに 改 善 されるアルゴリズムもある 判 定 したい 数 の 平 方 根 より 小 さい 数 で 判 定 した い 数 を 割 る 7
文 字 化 けについて Webアプリケーションでよく 起 きるトラブル データの 入 出 力 メール 送 信 などの 個 所 で 起 きる Webブラウザ Webサーバ PHP データベースサ ーバなどの 間 で 文 字 コードが 正 しく 設 定 されてい ないときに 起 こりうる 文 字 化 けの 原 因 文 字 にはコードが 多 数 ある( 日 本 語 にも 数 種 類 ) 使 う 文 字 コードを 統 一 するのも 一 つの 方 法 PHPでどのように 設 定 されているかを 確 認 する Phpinfo()の 表 示 のうち mbstringカテゴリ 8
文 字 コード JIS(ISO-2022JP) 電 子 メールでの 日 本 語 の 文 字 コード SJIS(Shift JIS) WindowsやMS-DOS 等 で 普 及 した 日 本 語 の 文 字 コード EUC( Extended UNIX Code) UNIXシステムで 普 及 UTF-8 コンピュータ 上 で 多 言 語 の 文 字 を 単 一 の 文 字 コ ードで 取 り 扱 うために 1980 年 代 に 提 唱 された 文 字 コードである Unicodeの 一 つ 9
PHPでの 設 定 方 法 3つ php.iniを 設 定 一 般 ユーザにはできない.htaccessを 設 定 使 えないレンタルサーバもある PHPのスクリプト 内 で 設 定 10
PHPスクリプトの 中 で 設 定 する <?php mb_internal_encoding ("UTF-8"); mb_http_output("utf-8"); ob_start("mb_output_handler"); header("content-type: text/html; charset=utf-8");?> print " 日 本 語 を 出 力 する"; EmEditorで 保 存 するときに 文 字 コードをUTF-8に 設 定 するのを 忘 れないように!( 設 定 した 文 字 コードと 同 じにする ) 11
.htaccessファイルで 設 定 する.htaccessファイル WebサーバのApacheの 設 定 やPHPの 設 定 ユー ザの 認 証 を 設 定 する Windowsでは ドット. で 始 まるファイル 名 はつく れないので ドットのないファイル 名 で 作 成 し www2に 転 送 してから 変 更 する 次 の1 行 をhtaccessというファイル 名 で 作 成 す る php_value default_charset UTF-8 WinSCPで 転 送 して ファイル 名 を.htaccessに 変 更 12
文 字 コードの 確 認 以 下 のプログラムを 入 力 保 存 し WinSCPで www2に 転 送 してください Internet Explorerで 実 行 する default_charsetの 欄 を 見 る <?php phpinfo();?> 13
コンピュータとじゃんけん 手 順 グーを0 チョキーを1 パーを2とする 人 間 はキーボードから 手 を 数 値 で 入 力 変 数 A コンピュータは 出 す 手 を 考 える(ランダム) 変 数 B AとBを 比 較 して どちらが 勝 ちかを 判 断 結 果 を 表 示 どちらが 勝 ちか 判 断 するところがカギ!(アルゴリズ ム) 条 件 の 作 り 方 いかに 処 理 を 簡 単 にするか プログラムの 実 行 速 度 も 速 くなる 14
じゃんけんの 勝 ち 負 け 判 定 表 Aの 値 Bの 値 判 定 0 (グー) 0 (グー) あいこ 0 (グー) 1 (チョキ) Aの 勝 ち 0 (グー) 2 (パー) Bの 勝 ち 1 (チョキ) 0 (グー) Bの 勝 ち 1 (チョキ) 1 (チョキ) あいこ 1 (チョキ) 2 (パー) Aの 勝 ち 2 (パー) 0 (グー) Aの 勝 ち 2 (パー) 1 (チョキ) Bの 勝 ち 2 (パー) 2 (パー) あいこ 15
条 件 を 簡 単 にする 表 をよく 見 る AとBが 等 しければ あいこ Bが 勝 ちの 場 合 Aが0 (グー) かつ Bが2 (パー) または Aが1 (チョキ) かつ Bが0 (グー) または Aが2 (パー) かつ Bが1 (チョキ) 上 記 以 外 のとき Aが 勝 ち 消 去 法 みたいなもの 16
条 件 をもっと 簡 単 にできる 慣 れも 必 要 Bが 勝 ちの 場 合 を 数 式 化 Aが0 (グー) かつ Bが2 (パー) または Aが1 (チョキ) かつ Bが0 (グー) または Aが2 (パー) かつ Bが1 (チョキ) 並 べ 替 えや 四 則 演 算 や 剰 余 の 組 み 合 わせで 成 立 しないか 考 える B+1を3で 割 った 余 りがAになる 3 行 の 条 件 が1 行 になった 17
PHPでWeb 版 じゃんけんを 作 る 実 は おみくじプログラムと 変 わらない 前 半 PHP POSTで 自 分 自 身 に 送 信 されたデータ( 人 間 が 入 力 した 手 )があれば コンピュータの 手 をランダムで 決 める 勝 ち 負 けを 判 定 し $messageに 結 果 を 代 入 そうでなれければ $messageに 初 期 メッセージを 代 入 後 半 HTML ゲームタイトル 等 を 表 示 Formのtextareaを 使 って $messageを 表 示 させる Formのラジオボタンで グー チョキ パーを 選 ばせる ボタンを 押 すと POSTで 自 分 に 送 信 18
janken.php1 <?php if (isset($_post["start"])) { $hand[] = "グー"; $hand[] = "チョキ"; $hand[] = "パー"; $myhand = rand(0, 2); $message = "あなたの 手 は". $hand[$_post["yourhand"]]. "ですね n"; $message.= " 私 の 手 は". $hand[$myhand]. "です n"; 19
janken.php 2 if ($_POST["yourhand"] == $myhand){ $message.= "あいこです n"; } elseif ($_POST["yourhand"] == ($myhand + 1) % 3){ $message.= " 私 の 勝 ちです n"; } else { $message.= "あなたの 勝 ちです n"; } } else { $message = "ここに 結 果 が 表 示 されます"; }?> 20
janken.php 3 <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>じゃんけんプログラム</title> </head> <body> <h2>コンピュータとじゃんけん</h2> <h4>グー チョキ パーのどれかをクリックしてね</h4> 21
janken.php 4 <form method="post"> <textarea name="result" rows="5" cols="40"><?php print $message;?></textarea> <br> <input type="radio" name="yourhand" value="0">グー <input type="radio" name="yourhand" value="1">チョキ <input type="radio" name="yourhand" value="2">パー <input type="submit" name="start" value="じゃんけんをする"> </form> </body> </html> 22
課 題 (1) 基 本 じゃんけんのプログラムを 説 明 し 実 行 結 果 を 報 告 してください できればやってみて 5 回 対 戦 して 最 後 に その 結 果 を 表 示 させるように 改 造 してみてく ださい 23
課 題 (2) 基 本 前 回 課 題 のプログラムを 改 善 された アルゴリズムで 改 造 し 動 作 を 確 認 しなさい 測 定 オリジナルと 上 のプログラムの 性 能 差 を 確 認 するため それぞれのプログラムのfor 文 の 前 後 に 時 間 を 計 測 する 関 数 を 入 れ そ の 差 から 実 行 時 間 がどれくらいかを 計 測 し その 結 果 について 報 告 しなさい ヒント: microtime() 関 数 のマニュアルを 見 る 判 定 したい 数 : 9999991 実 行 回 数 :それぞれ10 回 24
課 題 提 出 方 法 メールで riho-m-rg11@cuc.ac.jpに 送 る 形 式 Word 等 で A4サイズ 枚 数 は 上 限 なし 実 行 結 果 の 画 像 などがあれば 貼 り 付 ける ファイル 名 :kadai0706- 学 籍 番 号.docx 締 切 07/12 23:59 25