2011-08-02 33 views
1

平均する数値を入力するように求めることで平均を計算するプログラムを作成できますか?perlを使用して平均を計算する

私は3つの数字の平均を計算するperlスクリプトを書いています。ここに私のコードは次のとおりです。

#usr/bin/perl 
use strict; 
use warnings; 

my $a; #variable declaration 
my $b; #variable declaration 
my $c; #variable declaration 
my $avg; #variable declaration 
my $x; #variable declaration 
my $y; #variable declaration 
my $z; #variable declaration 
my $results; #variable declaration 
my $number; #variable declaration 

$a = 2; #number 1 
$b = 6; #number 2 
$c = 7; #number 3 

$avg = avg($a,$b,$c); #Three variables to be averaged 

    sub avg { 
    ($x,$y,$z) = @_; #Store variables in array 
    $results = ($x+$y+$z)/3; #Values stored added, and divided for average 
    return $results; #return value 

      } 

    print "$avg\n"; 
    exit; 

代わりに、私はむしろ平均化されるように、端末の3つの数字を入力するように要求された変数に入る数字の私のコード・コンピューティング・平均の。私はそれが、これは正しく私のコードに実装する方法は何もプリントアウトしていない私のコードにこれを追加すると

print STDOUT "Enter a number: \n"; 
$averages = <STDIN>; 
print "The Average is $averages.\n"; 

:私はあなたがそうのようないくつかのコードを実装する必要があることのような何かをするperlで知っています。

+4

Learning Perlの最初の4つの章を読んだら、あなた自身でこれに答えることができます。 –

+3

悲しいことに私はこの質問を閉じるために投票しなければならなかった。優れたPerlのドキュメント( 'perldoc'ユーティリティを使うかhttp://perldoc.perl.orgを参照)を[perlintro](perldoc.perl.org/perlintro.html)から読んでください。 "本物の"書籍については、Perlの学習(bdf)や有色の[Modern Perl](http://www.onyxneon.com/books/modern_perl/index.html)を無料で利用できます。 Gaborのチュートリアル(http://szabgab.com/perl_tutorial.html)もあります。言語の基本を学んだら、あなたのバグや問題をお手伝いします。 –

答えて

3

より一般的な解決策は、最初のステップである可能性があります。 avg()が出てきます。

次のステップは、入力内容を読み取ることです。あなたは、このような<>演算子であることを行うことができます。

my @input; 
print "Enter a few numbers...\n"; 
while(<>) { 
    chomp; 
    while(m/([\d.-])/g) { 
     push @input, $1; 
    } 
} 
local $" = ', '; 
print "The average of [@input] is ", avg(@input), "\n"; 

そして最後に、我々は、入力のセットを印刷し、呼び出しとavg()を印刷してそれをすべて一緒に置きます。

正規表現は、入力文字列の数字のように曖昧に見えるものを取り出すだけです。それは数のバリデーターのようなものではありません。

+2

精度の観点からは優れており、argsがない場合はより良い結果が得られます: 'sub avg {my $ avg; @_のための$ avg + = $ _/@ _; $ avgを返します。 } ' – ikegami

+0

標準浮動小数点数学では、最下位桁に2の差があることがわかりました。 Math :: BigFloatでは1.3e-40の違いが見つかりました。 Ysthは入力を並べ替えることを提案して、すぐに最高の大きさの数字をミックスに入れることを提案しましたが、それは私が検出できるものから結果を変えませんでした。 undefを返すか例外をスローするかについては、あなたが望むものに依存していると思いますが、sub内で作業を開始する前にundefを返すだけで十分でしょう。興味深い提案。私はいくつかの代替ソリューション@ikegamiを試して楽しんだ。 :) – DavidO

+0

長いシーケンスには影響します。なぜなら、大きな数字に小さな数字を追加することになります。そのため、小さな数字の下位ビットは完全に失われます。はい、違いはごくわずかです。 – ikegami

0
#!/usr/bin/perl 
use warnings; 
use strict; 

my $sum = 0; 
my $n = 0; 
while (<>) { 
    $sum += $_; 
    $n++; 
} 
print $sum/$n, "\n"; 

簡潔には、アイテムの数を合計して追跡することによって平均を計算します。 while (<>)は、コマンドラインまたはSTDINで指定されたファイルから魔法のように読み込みます(プログラムがインタラクティブな場合のみ、while (<STDIN>)を使用します)。あなたが平均化しているどのように多くのアイテムを気にしないその方法

sub avg { 
    my $total; 
    $total += $_ foreach @_; 
    # sum divided by number of components. 
    return $total/@_; 
} 

:平均を計算するための

関連する問題