🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1957閲覧

配列を利用した平均の求め方

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/23 09:25

前提・実現したいこと

プログラミング初心者です。
引数で配列と要素の個数を受け取り,受け取った配列の要素の平均を返すユーザ定義関数getAryAveを定義し、主プログラムでは、getAryAveを利用し,標準入力から入力された複数の数値の平均を求めて表示します。標準入力から入力された数値は配列に蓄えます。配列への数値の入力は最大10件までとし,件数が10件なるかEOFを読み込むまで繰り返すものとします。

発生している問題・エラーメッセージ

最後の値が出てしまう(?)

該当のソースコード

PHP

1<?php 2function getAryAve($x,$y){ 3 $h = new SplFixedArray($y); 4 $total = 0; 5 for($i = 0; $i < $y; $i++){ 6 $h[$i] = $x; 7 $total += $x; 8 } 9 $ave = $total / $y; 10 return $ave; 11} 12//main 13print('数値を入力してください'); 14$a = trim(fgets(STDIN)); 15$i = 0; 16while($a != NULL and $i < 10){ 17 print('数値を入力してください'); 18 $a = trim(fgets(STDIN)); 19 $i++; 20} 21print('平均は'.getAryAve($a,10)."\n");

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

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

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

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

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

cerfweb

2020/11/23 11:02

$h[$i] = $x; <-- これは何をしようとしているのでしょうか。 また、STDINにはどんな値が入りますか。 提示されたソース以外に関係している部分があれば全て表記してもらえますか。
退会済みユーザー

退会済みユーザー

2020/11/23 12:35

数値であれば特に指定はないです。 他に何か足りない部分などあればご指摘頂きたいです。
guest

回答4

0

いくつか問題がありそうなので、平均を計算するのは後回しにして、まずは、「入力された数値を最大10個まで配列に格納する」を目指したほうが良さそうです。

php

1print('数値を入力してください'); 2$a = trim(fgets(STDIN)); 3$i = 0; 4while($a != NULL and $i < 10){ 5 print('数値を入力してください'); 6 $a = trim(fgets(STDIN)); 7 $i++; 8} 9var_export($a);

最後のvar_export()で、入力された数値がすべて表示されればOKですが、このコードだと、うまくいきません。
なぜななら、

  • $aは配列じゃない
  • whileループが回るたびに、前回の入力値が上書きされてしまう

からです。

別途、配列を用意して、そこへ$aの内容を転記(追記)していく必要があります。

php

1$values = []; // この配列に蓄積する。 2print('数値を入力してください'); 3$a = trim(fgets(STDIN)); 4$i = 0; 5while($a != NULL and $i < 10){ 6 $values[] = $a; // 蓄積。 7 print('数値を入力してください'); 8 $a = trim(fgets(STDIN)); 9 $i++; 10} 11var_export($values);

これでもまだ問題があるのですが、まずはご自分で動かして遊んでみてください。

投稿2020/11/23 11:35

gpsoft

総合スコア1323

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

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

退会済みユーザー

退会済みユーザー

2020/11/23 13:02

とてもわかり易い説明ありがとうございます。 上記コードは動かせましたが、最後の入力が表示できてませんね…
guest

0

何をしているか分からないプログラムになっています。

まずは、「入力された数値を配列に順次格納し、var_dump($配列名);でそのデータを表示する」というプログラムを作ってみて下さい。
配列はSplFixedArrayとかじゃなくて、普通の配列を使います。

投稿2020/11/23 11:03

otn

総合スコア85893

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

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

退会済みユーザー

退会済みユーザー

2020/11/23 13:09

回答ありがとうございます。ご指摘どおり、まずは表示だけでもやってみたいと思います。
退会済みユーザー

退会済みユーザー

2020/11/23 13:46

$values = []; while(count($values) < 10){ print('数値を入力してください'); $a = trim(fgets(STDIN)); $values[] = $a; } var_dump($values); このように作ってみましたがいかがでしょうか。
otn

2020/11/23 14:08

データの個数が10個前提なら、良いと思います。 > 件数が10件なるかEOFを読み込むまで繰り返す なので、EOFだと途中で繰り返しを止めないといけません。 EOFの時はfgetsがFALSEを返すので、 $a = fgets(STDIN); if($a===FALSE) { break; } また、配列に入れる段階で数値化した方が良いでしょう。 整数だけとは書いてないので、floatに変換して、 $values[] = (float)$a; あとは、getAryAve($values, count($values)); で呼べるように関数を書きます。
退会済みユーザー

退会済みユーザー

2020/11/23 15:01

ありがとうございます。
guest

0

ベストアンサー

PHP

1<?php 2function getAryAve($x,$y){ 3 $total = 0; 4 for($i = 0; $i < $y; $i++){ 5 $total += $x[$i]; 6 } 7 $ave = $total / $y; 8 return $ave; 9} 10//main 11$values = []; 12print('数値を入力してください'); 13$a = trim(fgets(STDIN)); 14$values[] = $a; 15while($a != NULL and count($values) < 10){ 16 print('数値を入力してください'); 17 $a = trim(fgets(STDIN)); 18 $values[] = $a; 19} 20print ('平均は'.getAryAve($values,count($values))."\n");

投稿2020/11/23 14:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

otn

2020/11/23 15:26

これだと、ちょうど10個の場合じゃ無いとダメですね。 テストしてない?
guest

0

$aですが、最後に入力された値を保持しているだけで、それ以前の入力は捨てられています。
getAryAve()では、配列を作っていますが、全ての要素に$xを設定しています。

そもそも、

引数で配列と要素の個数を受け取り

となっているのに、$xが配列でない時点で、要求を満たしていません。

コードを作成される前に、設計はされましたか?
各変数は、何を格納するのか、きちんと考えましたか?
初心者なら、コードを作成する前に、上記のような項目を書き出すなどして、明確にするようにしてください。

投稿2020/11/23 11:15

YT0014

総合スコア1748

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

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

退会済みユーザー

退会済みユーザー

2020/11/23 13:10

回答ありがとうございます。書き出しですね。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問