結構書くのが久しぶりだが、今までクラウド資格の勉強に費やしてきたので
(おかげでGCPとAWSのアシスタント資格は全取得できた)
コードを書く練習を再開しようと考えた。
出始めに、PaizaのphpのBランクのスキルチェックがとんと検討がつかないレベルで敗北したので、レベルアップ問題集をつかってスキルアップを目指す。
スキルチェックテストはだめだが、レベルアップ問題集についてはコードを公開したりしても大丈夫らしいので、Qiitaを使って問題演習をやってみることにした
今回の問題はこれ
https://paiza.jp/works/mondai/class_primer/class_primer__make
//問題
N
n_1 o_1 b_1 s_1
...
n_N o_N b_N s_N
・ 1 行目では、paiza君のクラスの人数 N
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) では、 i 番の生徒の名前・年齢・誕生日・出身地を表す整数・文字列 n_i ,o_i ,b_i , s_i が順に半角スペース区切りで与えられます。
構造体・・・って聞いた覚えがあるけど全く覚えてなかった(ヤバイ)
ぐぐってみると
どうやら、データ型の1つで、単数or複数の値をまとめて格納できる型らしい。
配列に似ているが、Wikiによると、配列と比べてそれぞれのメンバー(フィールド)に名前が付いている点、またメンバーの型が異なっていてもよい点が異なるらしい。
ちなみに、VBAだとtype
、C言語だとstruct
。
※phpには存在しない。
そう、存在しないのである。
phpをマスターする前はマクロ屋だったこともあり、typeは流石に覚えてた。
そうか、typeってあれか。。。と。振り返ってみれば仕事でも使ってたわ。たしかに。
構造体を構成する要素をメンバというが、たとえば今回の問題でいうと、
User{
nickname : 名前
old : 年齢
birth : 誕生日
state : 出身地
}
名前・年齢・誕生日・出身地がメンバということになる。
おや?こいつはもしや。クラスを使えばいけるんじゃないか。
Userクラスに、各メンバーをprivateで型を指定して、
入力が名前 年齢 誕生日 出身地ってなってるので、加工して
クラスに突っ込んで出力が問題の形になるようにメソッドを作ってやればいけるんでは?
やってみましょう。
//Userクラス
class User{
private string $nickname;
private int $old;
private string $birth;
private string $state;
public function __construct($nickname,$old, $birth, $state) {
$this->nickname = $nickname;
$this->old = $old;
$this->birth = $birth;
$this->state = $state;
}
public function getOutput(){
$output = "User{" . "\n";
$output = $output ."nickname : " .$this->nickname. "\n";
$output = $output ."old : " .$this->old. "\n";
$output = $output ."birth : " .$this->birth. "\n";
$output = $output ."state : " .$this->state. "\n";
$output = $output ."}" . "\n";
return $output;
}
}
上はクラスでここから本編
//まず1行目はpaizaくんのクラスの人数となっているのでこれを元にループ作成
$num = trim(fgets(STDIN));
for($i=0; $i<$num; $i++){
//次の標準出力ゲット
$s = trim(fgets(STDIN));
//改行を除去(Win/Mac両方対応)
$s = str_replace(array("\r\n","\r","\n"), '', $s);
//半スペで区切って配列に
$array = explode(" ", $s);
//それぞれ変数に代入
$nickname = $array[0];
$old = $array[1];
$birth = $array[2];
$state = $array[3];
//クラスをインスタンス化して変数をつっこむ
$member = new User($nickname, $old, $birth, $state);
echo $member->getOutput();
}
はい、これでいけました。
上の2つのコードは本来1つのコードに書くべきですが、
わかりやすくするために2つにわけました。
※コードを書く順番はクラス・本編どっちからでも構いません。
まあ、でも、そもそもこの問題、クラス使わなくても配列でもいけましたね。。。
でも今後構造体を積み重ねてデータ検索してみたいなことをやるみたいなので、クラスじゃないとだめかな?
もうちょっと研究しよう