PHP初心者です。
オブジェクト指向を今勉強している途中でどうしても理解できないところがあるので教えてください。
----------------------------------------------------------------
<?
class ANIMAL{
var $first_weight;
var $weight;
var $soul = true;
var $x = 0;
var $y = 0;
function ANIMAL($weight){
$this->first_weight = $this->weight = $weight;
$this->old = $old;
}
function walk($x, $y){
if(!$this->soul){
return;
}
if($this->weight < $this->first_weight * 0.99){
$this->death();
return;
}
$this->x += $x;
$this->y += $y;
echo "walking... [{$x}], [{$y}]<br />";
$this->weight -= 20;
}
function death(){
$this->soul = false;
echo "I died...<br />";
}
function get_weight(){
echo "Weight... {$this->weight} g<br />";
}
function get_posi(){
echo "Position... x : {$this->x}, y : {$this->y}"."<br />";
}
}
$animal = new ANIMAL(6000);
$animal->walk(5, 2);
$animal->walk(-10, 20);
$animal->walk(2, 0);
$animal->walk(-50, 21);
$animal->walk(-11, -20);
$animal->walk(20, 30);
$animal->get_weight();
$animal->get_posi();
----------------------------------------------------------------
上記のようなプログラムがあります。
プログラムの答えの予想では、
>if($this->weight < $this->first_weight * 0.99){
移動するごとに体重が20キロ減っていき
元体重の0.99%をきった時点5940になると
$animal->walk(2, 0);
$animal->walk(-50, 21);
$animal->walk(-11, -20);
$animal->walk(20, 30);
この部分は全て I died...になると考えていました。
また、$animal->get_weight();この部分は5000gと考えていました。
return;を入れることでなにが変わるのか、戻り値という事はわかり
ます。本を読んでいて本の中の簡単な例題では意味はなんとなくつかめるのですが、どんな時につかったらいいのか、また複雑になるとreturn;の存在する意味がわからなくなってしまいます。
ご助言いただければ幸いです。宜しくお願いします。
No.3
- 回答日時:
> 解釈はあっているでしょうか?
OKです。
念のため、正確にはget_posi()は現在の位置を出力するメソッドなので位置情報は
$this->x += $x;
$this->y += $y;
で蓄積しています。
私見ですが、class ANIMALのメンバとしてwalk()やdeath()は動物の動作ですが、get_weight()、get_posi()は状態を画面に出力させる為だけのメソッドで動物の動作を表現していないので、class ANIMALに並べるのは不自然だと思います。
get_weight()、get_posi()はバッサリカットして
$animal = new ANIMAL(6000);
$animal->walk(5, 2);
(省略)
echo "Weight... {$animal->weight} g<br />";
echo "Position... x : {$animal->x}, y : {$animal->y}"."<br />";
とするのがいいかな。と思いました。
御礼遅くなって申し訳ありません。先ほど上記kalkichiさんに書いていただいたプログラムをみて書き換えましたところ。見ため的にもすっきりです。
そして、解釈もOKということでやっと問題自体も理解をすることができました。ありがとうございます。
自分の力だけでは解けなかったと思います。
何度も聞いて、そのたびに回答をいただけて本当に感謝しております。
ありがとうございました。
No.2
- 回答日時:
ご不明な点がいまいち把握できず質問意図と異なっていたら申し訳ないのですが、この場合
・元の体重が6000
・6000 * 0.99 = 5940以下になると死ぬ
・1回動くと-20
という事で、6000-5940=60 → 60÷20=3
で、3回動ける事になります。
ただし体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。
動作(メソッド)のたびに状態(プロパティ)を確認してみれば把握しやすいと思います。
$animal->walk(5, 2);
$animal->get_weight();
$animal->get_posi();
$animal->walk(-10, 20);
$animal->get_weight();
$animal->get_posi();
$animal->walk(2, 0);
$animal->get_weight();
$animal->get_posi();
$animal->walk(-50, 21);
$animal->get_weight();
$animal->get_posi();
$animal->walk(-11, -20);
$animal->get_weight();
$animal->get_posi();
$animal->walk(20, 30);
$animal->get_weight();
$animal->get_posi();
この回答への補足
説明が下手で本当に申し訳ありません。
上記の解答参考になりました。
3回動けることは理解していたのですが、
「体重が減るのが全ての状態チェックが終わったあとなので、1回分余分に動けます。」とても参考になりました。
function walkで歩いた位置、(5.2)を代入し、
echo でwalking...[5][2]を出力 この時点では(1)6000g
function get_weight この時点で5980g
となると、
(1)6000
(2)5980
(3)5960
(4)5940
(5)I died...
(6)I died...だけれど
function walk($x, $y){
if(!$this->soul){
return;
でfunction から抜けるので、出力されない
(7)weight...5920
(8)Position... x : -53, y : 43
I died...がでた時点で
if($this->weight < $this->first_weight * 0.99){
$this->death();
return;
の部分でfunctionから抜けるので、
function get_posi(){
echo "Position... x : {$this->x}, y : {$this->y}"."<br />";
}
に蓄積されない。
で解釈はあっているでしょうか?
長々と申し訳ないです。宜しくお願いします。
No.1ベストアンサー
- 回答日時:
元体重の0.99%を切った時点で死ぬので後の処理(walking)をさせない為にreturn;でfunctionを抜けてます。
この回答への補足
解答ありがとうございます。この例題のreturnについての理解は完璧とはいえませんが、どういう時につかうのかは理解できました。
ありがとうございます。
実は、書き方不足でもうしわけないのですが、
例題の答えが
(1)$animal->walk(5, 2);
(2)$animal->walk(-10, 20);
(3)$animal->walk(2, 0);
(4)$animal->walk(-50, 21);
(5)$animal->walk(-11, -20);
(6)$animal->walk(20, 30);
(7)$animal->get_weight();
(8)$animal->get_posi();
↓
(1)walking... [5], [2]
(2)walking... [-10], [20]
(3)walking... [2], [0]
(4)walking... [-50], [21]
(5)I died...
(6)Weight... 5920 g
(7)Position... x : -53, y : 43 になります。
予想していた答えが
(1)と(2)は解答と同じ
(3)~(6)I died...
(7)Position... x : -5, y : 22 でした。
(1)の解き方は
function walk($x, $y){
if(!$this->soul){
return;
}
if($this->weight < $this->first_weight * 0.6){
$this->death();
return;
}
$this->x += $x; 5を代入
$this->y += $y; 2を代入
echo "walking... [{$x}], [{$y}]<br />";
$this->weight -= 20; 6000-20=5980
ここ間違っている部分をどのように考えたらよいのか教えていただけませんでしょうか?
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- ロック・パンク・メタル “エアロスミス” が『WALK THIS WAY』を歌っています。 1 2023/07/26 19:32
- TOEFL・TOEIC・英語検定 英語の質問です。 This is one of many parks in the city, wh 3 2022/03/30 14:43
- 英語 体重が3kg増える/減る の英語表現 2 2023/07/07 11:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
Parse error というエラーの対...
-
バッチファイルで、全てのウィ...
-
オブジェクト指向 継承について
-
PHP一覧表示した項目にリンクを...
-
PHPで値を表示する「echo」「pr...
-
phpでcookieがうまく保存されない
-
シェルスクリプトbashについて...
-
PHPでのパスワード制限のセキュ...
-
変数の受け渡しによる画像の表示
-
PHPで作成した2つのプログラム...
-
batファイルでドロップしたデー...
-
PHPで訪問回数を表示するカウン...
-
小数点以下0の非表示
-
PHPでの分岐
-
PHPにて変数をテキストファイル...
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
switch()文で値の大小比較
-
DMMの動画を全件取得したのです...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
phpでcookieがうまく保存されない
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
syntax error, unexpected 'ech...
-
findstrのerrorlevel
-
バッチファイルで、全てのウィ...
-
PHPで訪問回数を表示するカウン...
-
PHP一覧表示した項目にリンクを...
-
DBのハッシュ化したパスワード...
-
小数点以下0の非表示
-
Windowsのsetコマンドでの小数...
-
オブジェクトの中身の判定(PHP)
-
bashの関数の引数にスペースが...
-
PHPでのパスワード制限のセキュ...
-
RSSにdiv,ul classを付けたいの...
-
pdftkを使った処理をバッチファ...
-
ゼロとNULLを区別して number_f...
-
コマンドプロンプト フォルダ内...
おすすめ情報