410 likes | 591 Views
平成 21 年度 情報科学 III (理系コア科目・2年生). PHP プログラムの実行. 担当 岡村耕二 月曜日 2限. http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/. 本資料の一部は、堀良彰准教授、天野浩文准教授等による 以前の講義資料をもとにしています。. 演習の回答例. a, b, c を入力して、 2 次方程式を解くプログラムを作成せよ。 aX^2 + bX = C 名前、数字を5名分入力し、数字の順に並び替えるプログラムを作成せよ。 入力画面および入力例 出力例 大橋 29 馬出 22
E N D
平成21年度 情報科学III (理系コア科目・2年生) PHP プログラムの実行 担当 岡村耕二 月曜日 2限 http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/ 本資料の一部は、堀良彰准教授、天野浩文准教授等による 以前の講義資料をもとにしています。
演習の回答例 • a, b, c を入力して、2次方程式を解くプログラムを作成せよ。 • aX^2 + bX = C • 名前、数字を5名分入力し、数字の順に並び替えるプログラムを作成せよ。 • 入力画面および入力例 • 出力例 • 大橋 29 • 馬出 22 • 箱崎 12 • 六本松 9 • 伊都 4 箱崎 12 六本松 9 馬出 22 伊都 4 大橋 29
メイン <form method="POST" ACTION="niji.php"><p> a=<input type="text" name="a" size="4"><p> b=<input type="text" name="b" size="4"><p> c=<input type="text" name="c" size="4"><p> <input type="submit" value="Go!"> <input type="reset" value="Clear"> </form> 式を解く $a=$_POST["a"]; $b=$_POST["b"]; $c=$_POST["c"]; printf("a=%d,b=%d,c=%d <p>\n",$a,$b,$c); $c = $c * -1; $d = $b * $b - 4 * $a * $c; printf("D=%d <p>\n",$d); printf("<HR>"); if($d>0){ printf(" x = (%d + SQRT(%d))/%d and (%d - SQRT(%d))/%d <br>\n", ($b * -1),$d,2 * $a, ($b * -1),$d,2 * $a ); printf("or x = %.3f and %.3f \n", (($b * -1) + sqrt($d)) / (2 * $a), (($b * -1) - sqrt($d)) / (2 * $a) ); }elseif ($d==0) { printf(" x = %d/%d. <br>\n",($b * -1),2 * $a); printf("or x = %.3f.", ($b * -1)/(2 * $a)); }elseif ($d <0){ printf(" x = (%d + SQRT(%d)i)/%d and (%d - SQRT(%d)i)/%d <br>\n", ($b * -1),$d * -1 ,2 * $a, ($b * -1),$d * -1 ,2 * $a ); printf("or x = %.3f + %.3fi and %.3f + %.3fi.", ($b * -1)/(2 * $a), sqrt($d * -1)/(2* $a), ($b * -1)/(2 * $a), sqrt($d * -1)/(2* $a) ); } 演習 1: http://bossp.is.kyushu-u.ac.jp/~oka/20090518/10/main.html
メイン <form method="POST" ACTION="sort.php"><p> name0=<input type="text" name="name0" size="4"> val0=<input type="text" name="val0" size="4"><p> name1=<input type="text" name="name1" size="4"> val1=<input type="text" name="val1" size="4"><p> name2=<input type="text" name="name2" size="4"> val2=<input type="text" name="val2" size="4"><p> name3=<input type="text" name="name3" size="4"> val3=<input type="text" name="val3" size="4"><p> name4=<input type="text" name="name4" size="4"> val4=<input type="text" name="val4" size="4"><p> <input type="submit" value="Sort!"> <input type="reset" value="Clear"> </form> ソート $name=array($_POST["name0"],$_POST["name1"],$_POST["name2"],$_POST["name3"],$_P\ OST["name4"]); $val=array($_POST["val0"],$_POST["val1"],$_POST["val2"],$_POST["val3"],$_POST["\ val4"]); for($i=0;$i<5;$i++) printf("%d %s %d \n<br>",$i,$name[$i],$val[$i]); printf("<HR>"); for($i=0;$i<4;$i++){ for($j=$i+1;$j<5;$j++) if($val[$i] < $val[$j]){ $tmp=$val[$i]; $val[$i]=$val[$j]; $val[$j]=$tmp; $tmp=$name[$i]; $name[$i]=$name[$j]; $name[$j]=$tmp; } } for($i=0;$i<5;$i++) printf("%d %s %d <br>",$i,$name[$i],$val[$i]); 演習 2: http://bossp.is.kyushu-u.ac.jp/~oka/20080518/11/main.html
前回のおさらい(1) • 配列(array) • 複数の値をリストとしてまとめて格納する. • ひとつひとつの値を要素(element)と呼ぶ. • 番号で要素を特定するものと,名前で要素を特定するものがある. • 多次元の配列も作れる. $fruit[1] = "banana"; // 番号で要素を識別する配列の例 $fruit[0] = "apple"; $fruit[2] = "みかん"; $profile["sex"] = "男"; // 名前で要素を識別する配列(連想配列)の例 $profile["age"] = 20; $profile["country"] = "Japan";
配列を模式的に書くと • 番号で要素を区別する配列の場合 • 連想配列の場合 "banana" "みかん" "apple" 必要に応じて伸びていく $fruit[0] $fruit[2] $fruit[1] 実は,並んでいる順番はあまり重要でない. 20 "Japan" "男" 必要に応じて伸びていく $profile["sex"] $profile["country"] $profile["age"]
前回のおさらい(2) • 関数(function) • ( )で囲まれたデータ(引数)を受け取り,何かの処理をして,結果を返す. • 「引数」は「ひきすう」と読む. • ほとんどの場合,実行結果は,変数に直接代入できる. • 実行結果として返される値は,「戻り値」と呼ばれる. • 戻り値がのちのち必要になる場合は,いったん変数で受け取っておいて,その変数を利用するとよい. 戻り値を受け取る変数 = 関数名( 引数 );
前回のおさらい(3) • PHPプログラムがうまく実行されないときのチェックリスト • HTMLの開始タグ・終了タグはきちんと対応が取れているか? • 例:<head>~ </head> • PHPの開始タグ・終了タグはきちんと対応が取れているか? • <?php~ ?> • ( ~),{ ~}," ~",などの対応は取れているか? • あるべきところにセミコロンがあるか? • 連想配列に値をセットするとき/値を読むとき,キーの名前を打ち間違えていないか? • 例: $message["Wed"]と $message["Wen"];
print( )に関する補足と訂正 • 第4回のスライドでは,以下のように説明していた. • print( )は関数である. • print( )は論理型の値を返す. • 正しくは,以下の通りであった.http://www.php.net/manual/ja/function.print.php(関数レファレンスの中に書かれてはいるけれど…) • 厳密に言うと,実は print( )は関数ではなく PHP言語が持つ特殊な構文構造であり,括弧を省略することもできる. • printまたは print( )を実行した結果の値(戻り値)は,常に1である.
今日勉強すること • PHPの実行形態 • PHPと入出力(おさらい) • PHPとファイル処理
PHPはプログラミング言語である • ここまでの講義では,HTML 文書に埋め込むような使い方だけを扱ってきたが: • 実は,PHPのみでプログラムを書き,webサーバ抜きで実行することもできる. • bossp のように,PHP処理系がコマンドラインからでも実行できるようにインストールされているサーバでは,以下のような形式でも実行できる. • web ブラウザでアクセスしたときに何の表示も出ないようなときには,これによって何がおかしいのかを知ることができるかも知れない. [te999999@bossp ~]$ php PHPのファイル名
PHPプログラムをコマンドラインから実行すると…PHPプログラムをコマンドラインから実行すると… • ミニ実習 • これまでに作ったPHPプログラムをコマンドラインから実行してみよう • Tera Term (TTSSH) で bossp に接続して,PHPプログラムの入っているディレクトリ(~/public_html)まで cdして実行 • 何がおきるか? [te999999@bossp ~]$ cd public_html [te999999@bossp ~]$ php PHPのファイル名
PHPプログラムの実行形態(まとめ) • PHP処理モジュールがインストールされている web サーバ上で,web サーバ経由で実行させる. • PHPプログラムを実行した結果が,HTMLデータに埋め込まれて,ブラウザに返される. • PHPがコマンドラインで実行できるようにインストールされているサーバ上で,コマンドラインから起動する. • PHPプログラムを実行した結果が,ディスプレイ上に表示される. • 実際には: • HTTPレスポンスの一部も合わせて出力される. • 純粋のPHPだけでなく,HTML埋め込みのPHPも処理できる.
プログラムにとっての入出力(1) • プログラムを実行するときには,普通は,外部から与えたデータを元に計算をさせたり,計算した結果を後に(外に)残したりしたいことが多い. • 実行時に外部から何のデータも持ってこない(あるいは,外部の影響をまったく受けない)プログラムがあったとしたら: • 何度実行しても同じ実行結果しか生み出せない. • 2回以上実行する意味がどれだけあるか? • 実行時に得られた計算結果を外部に引き渡さない(あるいは,外部に何の影響も残さない)プログラムがあったとしたら: • 何を計算してもその結果を知る方法がない. • そもそも,実行する意味があるか?
プログラムにとっての入出力(2) • 入力(input) • プログラムに対して,外部から与えられるデータ • 入力の例 • Enterキーが押されるまでの間にキーボードから打ち込まれた文字列 • ファイルの中に格納されていた文字列や数値 • 出力(output) • プログラムが,外部に対して与える(残す)データ • 出力の例 • ディスプレイの画面に表示される文字列 • ファイルの中に保存される文字列や数値
プログラムにとっての入出力(3) • 通常のプログラムの典型的な実行形態 • 入力はキーボードから • 出力はディスプレイに 実行中の プログラム
プログラムにとっての入出力(4) • 場合によっては,入力や出力をファイルに対して行うこともある. 実行中の プログラム
標準入出力 • 多くのオペレーティングシステムでは,実行開始されたプログラムに,以下の3種類の入力・出力をあらかじめ与えている. • 標準入力(standard input) • デフォルトでは,キーボードから • 標準出力(standard output) • デフォルトでは,ディスプレイに • 標準エラー出力(standard error output) • デフォルトでは,ディスプレイに • 出力が2つに分かれているのは… • 正常に処理できたときのメッセージ等と,何か問題が起きたときのメッセージ等を分離して保存しやすくするため.
コマンドラインから実行されるPHPプログラム • 標準出力・標準エラー出力をディスプレイに出せる. • キーボードからの標準入力を受けることもできる. • ファイルに対する入出力もできる. ただし,適切な関数を呼び出す必要がある. 実行中の PHPプログラム インターネット TTSSH SSHが提供する「回廊」
webサーバ経由で実行されるPHPプログラム(1)webサーバ経由で実行されるPHPプログラム(1) • サーバ上のファイルに対する入出力 • これもあまり問題はない. • 実際,このような機能を提供するための関数もいろいろと用意されている. 実行中の PHPプログラム サーバ インターネット webサーバ PHP 処理 モジュール
webサーバ経由で実行されるPHPプログラム(2)webサーバ経由で実行されるPHPプログラム(2) • クライアントに対する入出力? • ところが,webサーバ上で実行中のPHPプログラムからは,クライアントのキーボードやディスプレイが直接には見えない. • 「標準入出力」の考えは,この実行形態にあまりなじまない. 実行中の PHPプログラム ? webサーバ インターネット クライアント PHP 処理 モジュール
ではどうやって入出力するか? • しかたがないので,HTTPの力を借りる. • 入力は,HTTPリクエストから受け取る. • 出力は,HTTPレスポンスに埋め込む. HTTP リクエスト 実行中の PHPプログラム webサーバ インター ネット HTTP レスポンス クライアント PHP 処理 モジュール
クライアントへの間接的な出力 • これは,print( )の呼び出しで簡単に実現できる. • ステータス行やメッセージヘッダは自動的に付加される. HTTPレスポンス PHPプログラム ステータス行 <html> <head> ... </head> <body> <?php print("Hello, World!\n"); ?> </body> </html> メッセージヘッダ (ない場合もある) (空行) <html> <head> ... </head> <body> Hello, World! </body> </html>
クライアントからの間接的な入力 • HTMLの <form>タグを用いる. • ブラウザ画面内で入力された内容を集める. • 入力させる内容は <input>タグで指定する. • submitタイプのボタンがクリックされると,集めた内容を HTTP で送信する. • resetタイプのボタンがクリックされると,ブラウザに入力された内容をクリアする. <form method="メソッド名" action="URL"> <input ... > ... <input type="submit" value="送信"> <input type="reset" value="クリア"> </form>
<form>タグ(1) • <form>タグの詳細 • method:ブラウザに入力されたデータの送信形式(GETまたはPOST) • GET:データをURLの末尾に追加して送信する.送信できるデータ量には制限がある. • POST:データをURLとは別に送信する形式.一度に大量のデータを送信することもできる. • action:集めたデータの送信先のURL • 通常は,PHPプログラム(HTML埋め込みも可)またはCGIプログラム • このファイルと同じディレクトリにあるときには,ファイル名だけでも可. <form method="メソッド名" action="URL" ...> ... </form>
<form>タグ(2) • <form>タグによるデータ受け渡しの様子 • <form>タグを含むwebページを表示中に,submitタイプのボタンをクリック • 入力されていた内容が,action先のプログラムに渡される. HTTP リクエスト webサーバ クライアント PHP 処理 モジュール
<form>タグ(3) • <form>タグは,PHPだけでなく,CGIプログラムに対するデータ入力の方法としても用いられる. • CGI(Common Gateway Interface) • webサーバに,webブラウザからの要求に応じてプログラムを起動させるためのしくみ • よく用いられるのは Perlで書かれたスクリプト • 入力データを集める最初の web ページは,HTMLだけで書いてもよいし,CGIプログラムやPHP(HTML埋め込みを含む)を使って書いてもよい. • ファイルをアップロードするようなときは,method,actionの他に enctype属性も指定する必要がある.
<input>タグのいろいろ(1) • <input type="text" name="名前"...> • 1行のテキストの入力欄を作る. • nameは項目を区別するための名前.項目ごとに違う名前を指定する. • size,maxlength属性の指定ができる. • valueを指定すると,あらかじめ文字列を入れておくことができる. <p> 簡単なテキスト入力欄の例<input type="text" name="text1"> </p>
<input>タグのいろいろ(2) • <input type="password" name="名前" ...> • パスワード形式の入力欄を作る.ここに入力される内容は画面上ではすべてアスタリスク(*)となる. • nameは項目を区別するための名前.項目ごとに違う名前を指定する. • size,maxlength属性の指定ができる. • valueを指定すると,あらかじめ文字列を入れておくことができる.ただし,これもすべてアスタリスク(*)となる. <p> 簡単なパスワード入力欄 <input type="password" name="password1"> </p>
<input>タグのいろいろ(3) • <input type="radio" name="名前" ...> • ラジオボタンを作る.選択されたボタンの valueが送信される. • nameは項目を区別するための名前.選択肢全体で共通の名前を付ける. • 同じ nameを付けることで複数のラジオボタンがグループ化され,そのグループ内では,1つしか選択できない. • checked指定したボタンは最初から選択された状態になる. <p>簡単なラジオボタンの例:PHPを使ったことがありますか? <br><input type="radio" name="q1" value="はい">はい <input type="radio" name="q1" value="いいえ">いいえ </p>
<input>タグのいろいろ(4) • <input type="checkbox" name="名前"...> • チェックボックスを作る.選択されたボタンの valueが送信される. • nameは項目を区別するための名前. • 選択肢全体で共通の名前を付ける. • 後ろに []を付ける(説明は次回). • 同じ nameを付けることで複数のチェックボックスがグループ化され,そのグループ内で複数選択できる. • checked指定したボタンは最初から選択された状態になる. <p> 質問1あなたの好きな果物は?(複数選択可) <br> <input type="checkbox" name="q2[]" value="リンゴ">リンゴ <input type="checkbox" name="q2[]" value="バナナ">バナナ <input type="checkbox" name="q2[]" value="キウイ">キウイ </p>
<input>タグのいろいろ(5) • <input type="file" name="名前" ...> • ファイルの送信欄を作る.自動的に「参照...」または「Browse...」ボタンが表示される. • nameは項目を区別するための名前.項目ごとに違う名前を指定する. • sizeを指定すると,入力欄の横幅を決められる. <p> 送信するファイル: <br> <input type="file" name="uploadfile1"> </p>
<input>タグのいろいろ(6) • <input type="hidden" name="名前" ...> • ブラウザ画面には表示されない「隠しデータ」を送信する. • nameは項目を区別するための名前.項目ごとに違う名前を指定する. <p> <input type="hidden" name="title" value="非表示データ"> </p>
その他のタグ(1) • <textarea name="名前" ...> </textarea> • 複数行のテキスト入力欄を作る. • nameは項目を区別するための名前.項目ごとに違う名前を指定する. • cols,rowsで入力欄の横幅,高さを決められる.wrapで自動改行のタイプを指定できる. • このタグで囲まれた部分に文字列を入れておくと,あらかじめその文字列が入力された状態になる. <p> テキストエリアの例: <br> <textarea name="message1">ここを編集</textarea> </p>
その他のタグ(2) • <select name="名前"> <option value="値">選択肢の名前</option>...</select> • プルダウンメニューを作る.どれかの選択肢が選択されたとき,valueの内容が送信される. • nameは項目を区別するための名前.選択肢全体で共通の名前を付ける. <p> 質問1あなたの血液型は?<br> <select name="q3“> <option value="A">A型</option> <option value="B">B型</option> <option value="O">O型</option> <option value="AB">AB型</option> </select> </p>
file1.txt がサーバーに存在する <?php print "1. output by fpassthru<br>\n"; $fh=fopen("file1.txt","r"); fpassthru($fh); print "<br><br>\n"; print "2. output after input into array and output the array.<br>\n"; $lines=file("file1.txt"); print_r ($lines); ?> ファイルを扱ってみよう
メイン <form enctype="multipart/form-data" method="POST" ACTION=“upload.php"><p> <INPUT type="hidden" name="MAX_FILE_SIZE" SIZE=65536><p> <INPUT type="file" name="testfile" size=20><p> <input type="submit" value="Upload"> <input type="reset" value="Clear"> サーバー <?php printf("name1 %s<br>", $_FILES['testfile']['name']); printf("name2 %s<br><br>",$_FILES['testfile']['tmp_name']); $filename=$_FILES['testfile']['tmp_name']; print "1. outout by fpassthru<br>\n"; $fh=fopen($filename,"r"); fpassthru($fh); print "<br><br>\n"; print "2. output after input into array and output the array.<br>\n"; $lines=file($filename); print_r ($lines); ?> ファイルを扱ってみよう: Uploadhttp://bossp.is.kyushu-u.ac.jp/~oka/20090525/00/main.html
練習問題 • 手元のクライアントPC上で、英数字でテキストファイルを、Windows XP のメモ帳などで作成し、それをサーバーにアップロードして、 • そのテキスト、 • そのテストに含まれる単語数、 • そのテキストに含まれる文字数、 を、表示するプログラムを作成せよ。 例: This is a pen. Is this a pen,too? Yes, it is. • 単語数 12 • 文字数?
演習問題 • クライアントのWindows XP などで英数字でテキストファイルを作成し、そのファイルに含まれる単語を、抽出し、表示するプログラムを作成せよ。 • 例 • This is a pen. Is this a pen,too? Yes, it is. • 出力結果 • this (2) • is (3) • a(2) • pen(2) • too(1) • yes (1) • it(1) • 単語は出現頻度やアルファベット順にソーティングできると、なおよい。