2011-08-02 280 views
1

是否有可能編寫出要求用戶輸入數字是平均計算平均值的程序?計算平均值用perl

我寫了一個計算三個數字的平均值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; 

相反的數字我進入我的變量而被提示在終端輸入三個數字的我的代碼計算平均值進行平均。我知道在Perl做這樣的事情,你必須執行一些代碼,就像這樣:

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

當我加入這個我的代碼沒有打印任何東西了這可怎麼正確實施,以我的代碼。

+4

如果你讀學習的Perl的前四章,你就可以回答這個問題你自己。 –

+3

不幸的是我不得不投票結束這個問題。請閱讀一些優秀的Perl文檔(使用'perldoc'工具或http://perldoc.perl.org)[perlintro](perldoc.perl.org/perlintro.html)開始。對於「真正的」書籍,請嘗試學習Perl(如bdf所述)或免費提供的Chromatic的[Modern Perl](http://www.onyxneon.com/books/modern_perl/index.html)。甚至有Gabor的[教程](http://szabgab.com/perl_tutorial.html)。學習完語言基礎知識後,我們將很樂意幫助您解決錯誤/問題。 –

回答

3

一個更通用的解決方案:

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

你不在乎你有多少項目均如此。 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

從精確的角度來看,更好的結果是沒有參數:'sub avg {my $ avg; $ avg + = $ _/@ _ for @_;返回$ avg; }' – ikegami

+0

對於標準浮點數學運算,我發現最低有效印刷數字的差異爲2。有了Math :: BigFloat,我發現了1.3e-40的差異。 Ysth建議對輸入進行排序,以便儘早將最大量的數字輸入到混合中,但這並不能改變我能夠檢測到的結果。至於返回undef與拋出一個異常,我想這取決於你想要的,但是在開始子任務之前返回undef會很容易。有趣的建議,但。我喜歡修改幾個備用解決方案,@ikegami。 :) – DavidO

+0

它會影響較長的序列,因爲最終會在較大的數字中添加小數字,因此小數字的較低位將完全丟失。是的,差異會很小。沒有輸入的情況下返回undef而不是零是相當不錯的,儘管 – ikegami

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

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

簡而言之,我們通過求和和跟蹤項目數來計算平均值。 while (<>)神奇讀取無論是從在命令行上或從標準輸入指定的文件(你可能想使用while (<STDIN>),而不是如果你的程序是唯一的互動)。

用於計算平均值可能是第一步