Q1.100人分のデータを作成する。一つ一つのデータは名前と点数で構成されていて名前はA~F,点数は0〜999のランダムな値をとる。生成した100人分のデータから上位10名を以下のフォーマットで出力せよ。
<?php //クラスを作成する class Person{ //フィールド public $name; public $score; //コンストラクタ function __construct($name,$score){ $this->name=$name; $this->score=$score; } //メソッド function toString(){ return "{$this->name}[{$this->score}]"; } } //何人分生成するか const PERSON_NUM=100; //点数のMAX const MAX_SCORE=999; //上位何人取得するか const LIMIT=10; //名前のリスト $names=['A','B','C','D','E','F']; //Personインスタンスを格納する配列 $data=[]; //データ生成 for($i=0;$i<PERSON_NUM;$i++){ //名前を決定 $name=$names[mt_rand(0,count($names)-1)]; //点数を生成(端含む) $score=mt_rand(0,MAX_SCORE); //Personインスタンスを生成 $person=new Person($name,$score); //配列に追加 $data[]=$person; } //compareを定義(Personの点数降順) function cmp($person1,$person2){ return $person2->score - $person1->score; } //並び替えusort(配列,compare名) usort($data,'cmp'); /*第2引数で無名関数を使って直接定義 usort($data,function($p1,$p2){return $p2->score-$p1->score;}); */ /* //単純ソートのアルゴリズム for($i=0;$i<count($data)-1;$i++){ for($j=$i+1;$j<count($data);$j++){ if($data[$i]->score < $data[$j]->score){ $temp=$data[$i]; $data[$i]=$data[$j]; $data[$j]=$temp; } } } */ ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <ol> <?php for($i=0;$i<LIMIT;$i++):?> <li><?=$data[$i]->toString()?></li> <?php endfor;?> </ol> </body> </html>
Q2.classを使って以下のような計算ドリルアプリを作成しよう。
1.実行すると10問足し算の問題が出題される(二桁の足し算)
2.値を入力してcheckボタンを押す。
3.結果が表示される。
4.もう1回ボタンを押すと新しい問題が出題される。
[ 解答例]
◯quiz.php
<?php session_start(); class MathQuiz{ //クラス定数 const QUIZ_COUNT=10; const MIN_NUMBER=1; const MAX_NUMBER=99; //クラスフィールド public static $correctCount; //フィールド public $ques; public $ans; public $isCorrect; //コンストラクタ function __construct(){ $x=mt_rand(self::MIN_NUMBER,self::MAX_NUMBER); $y=mt_rand(self::MIN_NUMBER,self::MAX_NUMBER); $this->ques="{$x}+{$y}="; $this->ans=$x+$y; } //メソッド //入力された値をチェックして結果を出力する function check($input){ if(ctype_digit($input)){ if((int)$input===$this->ans){ $this->isCorrect=true; self::$correctCount++; } }else{ $input=''; } return sprintf("%s %s%s %s",$this->isCorrect?'◯':'×',$this->ques,$input,$this->isCorrect?'':"({$this->ans})"); } } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <?php if(count($_POST)>0):?> <?php for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++):?> <p><?=$_SESSION['quiz'][$i]->check($_POST['ans'][$i]);?></p> <?php endfor;?> <p>全<?=MathQuiz::QUIZ_COUNT?>問中<?=MathQuiz::$correctCount?>問正解</p> <button onclick="location.href=''">もう一回</button> <?php else:?> <?php $_SESSION['quiz']=[]; for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++){ $_SESSION['quiz'][]=new MathQuiz(); } ?> <form method="post"> <?php for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++):?> <p><?=$_SESSION['quiz'][$i]->ques?><input type="number" name="ans[]"></p> <?php endfor;?> <button type="submit">check!</button> </form> <?php endif;?> </body> </html>
コメント