質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

3回答

713閲覧

PHP: FizzBuzz問題の応用について、教えてください!

zetzetn

総合スコア7

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2020/10/15 14:00

Udemy教材を見ながらアレンジを入れるくらいは出来るレベルの初心者なのですが、
よくあるFizzBuzzを思ったように表示させたくても出来ず困っております。

お力をお貸しいただければ幸いです。

前提・実現したいこと

・不適切な値、数字ではない入力が起きた場合はinput error.を出力してプログラムを終了するようにしたいです。
1から100までが適切な値です。現状では数値しか判断出来ていません。

・一番末尾に出力される数字の後ろには「,」は不要です。

該当のソースコード

PHP

1<?php 2 $n = trim(fgets(fopen('php://stdin', 'r'))); 3 4if (100 < $n){ 5 exit('input error.'); 6 7}else{ 8 9 print ">>"; 10 11 12 for ($i = 1; $i <= $n; $i++) { 13 if($i % 15 === 0) { 14 print "FizzBuzz,"; 15 } else if ($i % 5 === 0) { 16 print "Buzz,"; 17 } else if ($i % 3 === 0) { 18 print "Fizz,"; 19 } else { 20 print "$i,"; 21 } 22 } 23 } 24 25?>

出力結果

>>1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz,16,17,Fizz,19,Buzz,Fizz,22,23,Fizz,Buzz,26,Fizz,28,29,FizzBuzz,31,32,Fizz,34,Buzz,Fizz,37,38,Fizz,Buzz,41,Fizz,43,44,FizzBuzz,46,47,Fizz,49,Buzz,

補足情報(FW/ツールのバージョンなど)

PHPのみ
結果はコマンドラインに表示します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/10/15 14:04

>・不適切な値、数字ではない入力 要件を具体化すれば1つ1つは調べて出ない内容ではないと思いますが、 どの程度調べて試されたのでしょうか。
zetzetn

2020/10/16 09:27

30分ほどPHPのリファレンスを見て調べていたのですが、 どうしても自分の力だけでは解決することが出来ず質問させていただきました。 初歩的な内容ですみませんでした。
m.ts10806

2020/10/16 09:38

書いてないことは伝わりませんし質問は編集できます。
guest

回答3

0

ベストアンサー

入力値を確認することを「バリデーション」と呼びます。
厳密に行おうとすると、要件を適切に定義する必要があります。

現状のif (100 < $n)は数値の判定としてはかなり雑です。
-10.5 はどう判断しますか?
20testとかも素通ししてしまいます。

「正しい入力値」がどのような条件になるのかを定義するところから始めると良いです。

また、バリデーションは、生の入力値に対して実施すべきなので、trim 等で加工する前にデータに対して実施してください。

投稿2020/10/15 21:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zetzetn

2020/10/16 10:02

ご教示くださりありがとうございました。 >入力値を確認することを「バリデーション」と呼びます。 恥ずかしながらバリデーションという考えを持っていなかったのですが、 そうですよね、、正しい入力値がどのような条件になるか定義、、、大変勉強になりました。 今回はis_numeric関数を使って解決したのですが、次回はバリデーションを意識して検討してみたいと思います。
退会済みユーザー

退会済みユーザー

2020/10/16 10:59

うーん。。。 提示されたコードからは、どのような「正しい入力値」を定義したのか分かりません^^; 自己回答に、どう要件を定義したか記述してほしいです。 正直に言うと、私の回答は伝わっていないのではないかと思います。 よく理解でkていないのであれば、3か月程度の学習ののちに改めて読み返してみてください。
guest

0

数字ではない入力が起きた場合

is_numeric関数で、数値を表現する文字列かどうか判断できます。

一番末尾に出力される数字の後ろには「,」は不要

$i == $nの時はカンマを出さないようにするのが一つの案です。

投稿2020/10/15 14:40

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zetzetn

2020/10/16 10:07

ご教示いただきありがとうございます。 is_numeric関数は過去リファレンスマニュアルで見ただけで使い方が分かっておりませんでした。 $i == $nの条件は思い付かず、、、大変勉強になりました。
guest

0

皆様にいただいたアドバイスを参考にしてコードを描いてみました。
ありがとうございました。

<?php $n = trim(fgets(fopen('php://stdin', 'r'))); if(is_numeric($n)){ if (100 < $n){ exit("input error.\n"); }else{ print ">>"; for ($i = 1; $i <= $n; $i++) { if($i == $n) { print "$i"; exit("\n"); }if($i % 15 === 0) { print "FizzBuzz,"; } else if ($i % 5 === 0) { print "Buzz,"; } else if ($i % 3 === 0) { print "Fizz,"; } else { print "$i,"; } } } }else{ exit("input error.\n"); exit("\n"); } ?>

投稿2020/10/16 10:10

zetzetn

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問