• 締切済み

Fizz-Buzz問題のソース

プログラミングの初心者です。 Fizz-Buzz問題をPHPで書いてみました。 <?php for ($i=1; $i<=100; $i++) { if ($i%3==0 && $i%5==0) { // 3でも5でも割り切れる数 echo "Fizz-Buzz"; } elseif ($i%3==0 && $i%5!==0) { // 3で割り切れる数 echo "Fizz<br>"; } elseif ($i%3!==0 && $i%5==0) { //5で割り切れる数 echo "Buzz<br>"; } else{ //3でも5でも割り切れない数 echo "$i<br>"; } } ?> こんな感じになったのですが、何か問題点はあるでしょうか? ちなみに、echo末尾に<br>を入れているのは、<br>なしで作ると、12Fizz4Buzz……と改行なしに表示されて読みにくかったからです。 インターネット上のソースを見ると、$i%3==0 && $i%5==0 ではなく $i%15==0 にしていたり、三項演算子を使ってバイト数を減らしたりと色々工夫がされているようですが、そちらのほうがよいのでしょうか。

  • PHP
  • 回答数3
  • ありがとう数3

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

○ if 文などの説明をよく読んでください http://www.php.net/manual/ja/control-structures.if.php if()のかっこの中は「式」で、その評価結果が真か偽かで分岐します。 式ということは $a=式; という形で計算結果を変数に代入できるはずです。演算子の優先順位を考えれば $a=(式); が確実でしょう。 ○比較演算子の「等しい」には===と==があります。 それぞれの否定(等しくない)は!==と!=です。 この2つは意味が違います。 その違いを知らない人が、使い方を混同して、期待通りに動作してくれない、というのがよくあります。 http://www.php.net/manual/ja/language.operators.comparison.php

selfless
質問者

お礼

再び回答ありがとうございます。 式をfunctionの中に入れて、function()==trueとすればよいのでしょうか。 > 比較演算子 !=と<>には型の相互変換という意味があったんですね。知りませんでした。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

このプログラムを見ると、初心者が書いたものだ、と感じます。 動作自体は問題はないでしょう。 > if ($i%3==0 && $i%5==0) { // 3でも5でも割り切れる数 が成立しなかった場合の > } elseif ($i%3==0 && $i%5!==0) { // 3で割り切れる数 なのですから、$i % 3 == 0 なら $i % 5 != 0 になるのは当たり前。 無駄な事をしている、と感じます。 それを解消しても $i % 3 == 0 を2回も計算しているのが無駄に感じます。 比較演算や論理値について理解が足りないのかも、と思います。 ==などは、TRUE/FALSEを返す「演算」です。値があるので、変数に保存することもできます。 また == と !== との組み合わせを見て、PHPの比較演算子の違いを理解していないのではないか、と感じます。 ==の否定は!==ではありません。

selfless
質問者

お礼

回答ありがとうございます。 > なのですから、$i % 3 == 0 なら $i % 5 != 0 になるのは当たり前。 elseif($i%3==0)だけ書いておけば十分、ということでしょうか。 > 値があるので、変数に保存することもできます。 ifの結果を変数に保存するにはどのように書けばよいのでしょうか。 > PHPの比較演算子の違い 「何」と比較演算子の違いですか? > ==の否定は!==ではありません。 調べてみると、!=か<>を使うようですね。

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.1

縦に表示させるとスクロールさせなければなりません。横が見にくいのであれば空白を入れるとかでいいんじゃないですか? 計算機のやることなので結果が合っていれば細かい点はいいのですけど、多分プログラミングのセンス問われますよ。

selfless
質問者

お礼

回答ありがとうございます。 私はスクロールはさほど気にならなかったのですが、ないほうがよいでしょうか?

関連するQ&A

  • ナベアツプログラム(3の倍数と3の付く数字)

    PHPを勉強中です。 勉強の為に思いついたものをPHPで書いてみようと思い、ネタが古いですが100までの数字を表示し、見やすいように3桁揃えで10ずつで改行して、3の倍数と3のつく数字を太字で表示するプログラムを書いてみました。なんとなくできたようなかんじなのですが、30だけ太字になりません。原因がわかる方がいらっしゃれば教えていただけたら嬉しいです。よろしくお願いします。 <?php for($i = 1; $i <= 100; $i++){ if($i % 10 == 0) { echo sprintf('%03d', $i)." "."<br>"; } elseif($i % 3 == 0) { echo('<strong>'.sprintf('%03d', $i)." ".'</strong>'); }elseif(strpos($i,"3") !== false) { echo('<strong>'.sprintf('%03d', $i)." ".'</strong>'); }else{ echo sprintf('%03d', $i)." "; } } ?>

    • ベストアンサー
    • PHP
  • phpでのアンケート編集

    社員旅行のアンケート編集のphpです。 (???)のところがどうしてもわからなくて上手く動きません。 どなたか回答お願いします。 <?php session_start(); ?> <html> <head> <body> <font size=5><b>社員旅行アンケート集計</b></font><br><br> <?php $db = mysql_connect("localhost","",""); mysql_select_db("syain_db"); $query = "SELECT * FROM trvl_t"; $result = mysql_query($query); if(mysql_num_rows($result) == 0) print"<br>無し"; else{ for($i = 0;$i <4;$i++) $cnt[$i] = 0; while($row = mysql_fetch_array($result))(???) mysql_close($db); echo "<table border =1>"; echo "<tr><td>旅行先</td><td>希望者数</td></tr>"; for($i=0;$i<4;$i++){ echo "<tr align=center>"; if($i == 0) echo "<td>北海道</td>"; elseif($i == 1) echo"<td>沖縄</td>"; elseif($i == 2) echo"<td>韓国</td>"; elseif($i == 3) echo"<td>香港</td>"; echo "<td>".(???)."</td>"; echo"</tr>"; } echo "</table>"; } ?>

    • ベストアンサー
    • PHP
  • 【C】fizzbuzzのトリッキーなコードについて

    C言語でのfizzbuzz問題の回答を探していたら、以下のようなコードがありました。 #include <stdio.h> int main(void){ int i; for(i = 1 ; i <= 100 ; i++){ printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i); } printf("\n"); return 0; } (引用元:http://revilog.com/2010/08/c-fizzbuzz-printf.html) このコードについての質問です。 printf("%d \0Fizz \0FizzBuzz "+(i%5?(i%3?0:4):(i%3?14:10)),i); で、以下のことは理解しました。 ・\0で区切って文字列の終わりを作っておく ・+演算子でポインタ演算を行なっている ・三項演算子でポインタ演算する量を決めている ・+演算子によって指定したポインタから\0までの文字列を出力する ・Buzzを出力する際は、「FizzBuzz」の途中の「Buzz」を出力している わかっていないところは、 ・特殊文字(\0など)や「%d」は何バイトとして計算するのか ・数字以外を出力する際、%dによって桁数がずれ、変なところから出力されてしまうのではないか(でも実際はならない) です。 以上2点について回答よろしくお願いします。

  • 冗長なソースをコンパクトにしたい

    冗長なソースをコンパクトにしたい お世話になります。 CakePHP+MySqlでサイトを構築しているのですが、以下のソースが冗長なので、もう少しコンパクトにできないものかと悩んでいます。 このソースは「hogehoge」テーブルにあるデータ(0~100までの数値)を各列ごとに書き出しているものです。 出力イメージはこのようになります(テーブルもほぼこんな感じです)。     jan feb mar ~ 項目A  1 28 20 ~ 項目B 58 78 40 ~ 項目C ~ …… また、たんにデータを出力するだけでなく、値によってセルの背景色を変えたかったので、値を1つずつチェックし、それに応じたCSSクラス(pat1~)を変数$colorに代入しています。 <table> <?php for($i = 0;$i < count($data);$i++){ $arr = $data[$i]['hogehoge(テーブル名)']; echo "<tr><td>{$arr['hoge(項目名)']}</td>";  if($arr['jan'] < 10 ){   $color = "pat1";  }elseif(9 < $arr['jan'] && $arr['jan'] < 20 ){   $color = "pat2";  }elseif(19 < $arr['jan'] && $arr['jan'] < 30 ){   $color = "pat3";  }else{   $color = "pat4";  }  echo "<td class =".$color.">{$arr['jan']}</td>";  if($arr['feb'] < 10 ){   $color = "pat1";  }elseif(9 < $arr['feb'] && $arr['feb'] < 20 ){   $color = "pat2";  }elseif(19 < $arr['feb'] && $arr['feb'] < 30 ){   $color = "pat3";  }else{   $color = "pat4";  }  echo "<td class =".$color.">{$arr['feb']}</td>";  if($arr['mar'] < 10 ){   $color = "pat1";  }elseif(9 < $arr['mar'] && $arr['mar'] < 20 ){   $color = "pat2";  }elseif(19 < $arr['mar'] && $arr['mar'] < 30 ){   $color = "pat3";  }else{   $color = "pat4";  }  echo "<td class =".$color.">{$arr['mar']}</td>";  ※これが12月(dec)まで延々と続きます…… } ?> </table> 私の頭とスキルではコンパクトにできなかったので、どなたかお知恵を拝借できますでしょうか。 そもそもこの方法が正しいのかどうかも分かりません。もし、もっとスマートなやり方をご存じの方はぜひご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 連番を書き出すなどの単純処理をするこのコードを採点願えませんか

    Excel-VBAについて下記のような質問をしたのですが http://oshiete1.goo.ne.jp/kotaeru.php3?q=2285679 この質問で実現したい処理をPHPで例示してみて、もっとシンプルに かけるに違いない!と思っています。 実際、いかがなものでしょうか。 <?php  for($i=20001;$i<=24000;$i++){   for ($j=1; $j<=12;$j++){    if ($j==1){     $body .= $i . "&nbsp;200412&nbsp;" . $i . "200412<br>\n";    } elseif ( $j == 2 ) {     $body .= $i . "&nbsp;200501&nbsp;" . $i . "200501<br>\n";    } elseif ( $j == 3 ) {     $body .= $i . "&nbsp;200502&nbsp;" . $i . "200502<br>\n";    } elseif ( $j == 4 ) {     $body .= $i . "&nbsp;200503&nbsp;" . $i . "200503<br>\n";    } elseif ( $j == 5 ) {     $body .= $i . "&nbsp;200504&nbsp;" . $i . "200504<br>\n";    } elseif ( $j == 6 ) {     $body .= $i . "&nbsp;200505&nbsp;" . $i . "200505<br>\n";    } elseif ( $j == 7 ) {     $body .= $i . "&nbsp;200506&nbsp;" . $i . "200506<br>\n";    } elseif ( $j == 8 ) {     $body .= $i . "&nbsp;200507&nbsp;" . $i . "200507<br>\n";    } elseif ( $j == 9 ) {     $body .= $i . "&nbsp;200508&nbsp;" . $i . "200508<br>\n";    } elseif ( $j == 10 ) {     $body .= $i . "&nbsp;200509&nbsp;" . $i . "200509<br>\n";    } elseif ( $j == 11 ) {     $body .= $i . "&nbsp;200510&nbsp;" . $i . "200510<br>\n";    } else {     $body .= $i . "&nbsp;200511&nbsp;" . $i . "200511<br>\n";    }   } } ?> <html> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPの代数処理について

    下記のようなPHPを組みました。 af1~af4のカラムの中に空きがあったら表示するPHPです。 <?php $fr1=$row_friend_name['af1']; $fr2=$row_friend_name['af2']; $fr3=$row_friend_name['af3']; $fr4=$row_friend_name['af4']; if (empty($fr1)) { echo "af1"; } elseif (empty($fr2)) { echo "af2"; } elseif (empty($fr3)) { echo "af3"; } elseif (empty($fr4)) { echo "af4"; } else { echo "空きなし"; } ?> ここまでは問題なく、空きのカラムを表示してくれます。 【質問】 次に、この結果をPHPの中で代数として扱いたいと考えています。 (計算結果を$kekkaとする) <?php $fr1=$row_friend_name['af1']; $fr2=$row_friend_name['af2']; $fr3=$row_friend_name['af3']; $fr4=$row_friend_name['af4']; $kekka=( if (empty($fr1)) { echo "af1"; } elseif (empty($fr2)) { echo "af2"; } elseif (empty($fr3)) { echo "af3"; } elseif (empty($fr4)) { echo "af4"; } else { echo "10"; }) IF $kekka='10' { echo "空きなし"; } else { echo "空きあり"; } ?> 結果 エラー (真っ白) $kekka=() がまずいと思い、$kekka=(); や$kekka={} $kekka={}; もダメでした。 大変初歩的な部分かと思いますが、ご指導を宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPで干支を表示する

    以前、QNo.1446745でお世話になったものです。 http://okweb.jp/kotaeru.php3?q=1446745 今回も分からない点があるので質問させてもらいます。 htmlのフォームから西暦を送って和暦に変換し同時に干支を表示すると言う課題が出ました。 和暦への変換は出来たのですが干支の表示表示方法が調べたのですが見つからず困っています。 一応、和暦変換のプログラムは if ($toshi >= 1989){ echo "平成".($toshi-1988)."年<br>"; } elseif (1926 <= $toshi and $toshi <= 1988){ echo "昭和".($toshi-1925)."年<br>"; } elseif (1912 <= $toshi and $toshi <= 1987){ echo "大正".($toshi-1911)."年<br>"; } else { echo "明治".($toshi-1867)."年<br>"; } ※$toshiはフォームから送られた変数です。 こんな感じで作ることが出来たのですが書いたとおり干支の表示方法がさっぱりです。 答えでもヒントでもいいので教えていただけないでしょうか? 書いてあるプログラムは皆様方からみれば稚拙でしょうが重大な問題がない限りはツッコミはなしでお願いします。 かなり苦労して出来上がったものなので…

    • ベストアンサー
    • PHP
  • strlen関数について

    文字列の長さがとれなくて困っています。 プログラムは、以下の通りです。 実行すると、1の箇所で66になります。 次に値の文字数(2の箇所)を出そうとすると、6と出てしまいます。 見ていると、$sumkey1を変数ではなく文字列として見入るみたいなのですが、 直前に、直接数字を代入するとちゃんとした値がとれます。 どうしたらよいか、わかる方いらしたら教えてください。 <?php $a= abcde12345678912345678912345678912; for($h=1; $h<5; $h++){ for($i=0; $i<8; $i++){ if($h == 1){ $sumkey1= $sumkey1 + hexdec(substr($a ,$i,1)) . "<br>"; }else if($h == 2){ $sumkey2= $sumkey2 + hexdec(substr($a ,$i+8,1)) . "<br>"; }else if($h == 3){ $sumkey3= $sumkey3 + hexdec(substr($a ,$i+16,1)) . "<br>"; }else if($h == 4){ $sumkey4= $sumkey4 + hexdec(substr($a ,$i+24,1)) . "<br>"; } } } //最初の8つを16から10進数にして足した値 echo $sumkey1 . "<br>"; //1 //文字列の長さ echo strlen($sumkey1). "<br>"; //2 //文字列? echo var_export(is_numeric($sumkey1), true); //3 ?>

    • ベストアンサー
    • PHP
  • phpのコーディングの練習問題で画像の文章をコーデ

    phpのコーディングの練習問題で画像の文章をコーディングするんですが、 なぜ3でスキップと言っているのに、$i ==2 と書いているんでしょうか? <?php for($i = 1; $i <= 10; $i++){ if($i == 2){ continue; } else if($i == 7){ break; } else { echo $i."\n"; } }

    • 締切済み
    • PHP
  • phpで3の倍数かつ7の倍数を表すのが if

    phpで3の倍数かつ7の倍数を表すのが if ($x % 3 == 0 && $x % 7 == 0) なんでこれが、 3の倍数かつ7の倍数という意味になるのでしょうか? ↓以下のコードから抜粋 <?php $x = 1071; // 以下にif-elseif-else文を書いてください + if ($x % 3 == 0 && $x % 7 == 0) { + echo 'xは3の倍数かつ7の倍数です。'; + } elseif ($x % 3 == 0) { + echo 'xは3の倍数ですが7の倍数ではありません。'; + } elseif ($x % 7 == 0) { + echo 'xは7の倍数ですが3の倍数ではありません。'; + } else { + echo 'xは7の倍数でも3の倍数でもありません。'; + } ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう