0

Perlでの私の質問:値のリストを受け入れ、最大、最小、および平均値を呼び出し元のプログラムに返すサブルーチンを使用してPerlスクリプトを記述します。

#!/usr/bin/perl

sub large_and_small {   
    my (@numbers);
    @numbers = @_;

    my ($small, $large);
    $large = $numbers[0];
    $small = $numbers[0];

    foreach my $i (@numbers) {

        if ($i > $large) {         

            $large = $i;  
        }        
        elsif ($i < $small) {

            $small = $i;  
        }
    }
    return ($small, $large);
}

sub avg {
    my ($avg);
    my ($total);

    foreach (@test_array) {

        $total += $_;
    }
    $avg = $total/scalar @test_array;
    return $avg;
}

my (@test_array, @ret);
@test_array = (15, 5, 7, 3, 9, 1, 20,1 3, 9, 8, 15, 16, 2, 6, 12, 90);
@ret = large_and_small(@test_array);
print "The Largest value is ", $ret[1], "\n";
print "The Smallest value is ", $ret[0], "\n";
print "The Average value is", avg(@test_array), "\n";

私が得ている出力は次のとおりです。

The Largest value is 90
The Smallest value is 1
Illegal division by zero at /tmp/135044395416028.pl line 59.

スクリプトのどこが間違っているのですか?助けてください。よろしくお願いします

4

5 に答える 5

4

コアモジュールを使用することをお勧めします。List::Utilこれには、min、max、sumとして実装したすべての関数が含まれています。

#!/usr/bin/perl

use strict;
use List::Util qw(min max sum);

my @test_array = (15, 5, 7, 3, 9, 1, 20, 13, 9, 8, 15, 16, 2, 6, 12, 90);
my $min = min(@test_array);
my $max = max(@test_array);
my $avg = scalar @test_array
        ? (sum(@test_array) / (scalar @test_array))
        : 0;

print "The Largest value is ", $max, "\n";
print "The Smallest value is ", $min, "\n";
print "The Average value is ", $avg, "\n";
于 2012-10-17T10:40:37.273 に答える
3

の引数を読んでいませんavg。追加

my @test_array = @_;

また、いくつかの変数を保存し、宣言と割り当てを同時に行うこともできます。

sub large_and_small {
    my @numbers = @_;
    my ($small, $large) = @numbers[0, 0];

    foreach my $n (@numbers) {
        if ($n > $large) {
            $large = $n;
        }
        elsif ($n < $small) {
            $small = $n;
        }
    }
    return ($small, $large);
}

sub avg {
    my @numbers = @_;
    return unless @numbers;  # Prevent Division by zero
    my $total;
    foreach (@numbers) {
        $total += $_;
    }
    return $total / @numbers;
}
于 2012-10-17T10:33:24.390 に答える
0

テスト配列は、メインで字句として宣言され、関数で直接使用されます。関数に渡すか、推奨されていない字句を削除する必要があります。

于 2012-10-17T10:34:04.607 に答える
0

avgプロシージャは、表示@test_arrayする必要があると思われることを認識しません。代わりに、空の配列が表示される可能性があります。

次のように書き直すavgと、機能するはずです。

sub avg {
    my @test_array = @_;
    my ($avg);
    my ($total);
    # ...
}
于 2012-10-17T10:36:05.250 に答える
-1

ここにゼロによる除算があるように見えます

$avg = $total/scalar @test_array;

なぜスカラーで割っているのですか?

于 2012-10-17T10:33:37.990 に答える