0

私のスクリプトは、ユーザーが入力した一連の数値を取得し、それらの平均を見つける必要があります。「ファイルの終わり」という行を使用して、ユーザーがコードの入力を完了したことを示したいと思います。どんな助けでも大歓迎です。以下は私がこれまでに持っているものです。私は本当に近いと思いますが、何かが欠けています。

コード:

#! /usr/bin/perl
use 5.010;


print "Enter the scores and type end-of-file when done";
chomp(@scores = <STDIN>);
foreach (@scores) {
    push_average(total(@scores));
}




sub total {
    my $sum;
    foreach (@_) {
        $sum += $_;
    }
    sum;
}

sub average {
    if (@_ == 0) {return}
    my $count = @_;
    my $sum = total(@_);
    $sum/$count;
}

sub push_average {
    my $average = average(@_);
    my @list;
    push @list, $average;
    return @list;
}
4

2 に答える 2

3

あなたはかなり近いです。すべての Perl スクリプトの先頭に追加するuse strict; use warningsと、他の方法では見過ごされる可能性のあるエラーが警告されます。

いくつかのヒント:

  • $sumの最後のステートメントでの印を忘れましたtotal。現在、文字列 "sum" (厳密な vars なし) を返すか、場合によっては というサブルーチンを呼び出しsumます。

  • foreachメイン部分にはは必要ありません。

    my @averages = push_average(@scores);
    

    totalすでに内部で計算されていますpush_average

  • おそらく、結果の平均を出力したいと思うでしょう:

    my $avg = $averages[0];
    say "The average of these numbers is $avg";
    
  • push_averageばかげています。1 つの要素の新しい配列を返します。その 1 つの要素を返すこともできます。


推奨されるスクリプト:

use strict; use warnings; use 5.010;
use List::Util qw/sum/;  # very useful module

# say is like print, but appends a newline. Available with 5.10+
say "Please enter your numbers, finish with Ctrl+D";
my @nums = <STDIN>;
chomp @nums;

# The // is the defined-or operator
# interpolating undef into a string causes a warning.
# Instead, we give an expressive message:
my $avg = average(@nums) // "undefined"; 

say "The average was $avg";

sub average { @_ ? sum(@_) / @_  : undef } # return undef value if called without args
于 2013-01-25T04:38:21.863 に答える
0

改行まで読み取ります。ここにはいくつかの選択肢があります。スペースで区切って数値を入力し、それを@choices配列に分割するようにユーザーに依頼できます。または、番号を入力するように依頼し続けるか、Enterキーを押して終了することもできます。

回答1)

print "Enter scores separated by a space and press enter when done";
chomp($input = <STDIN>);
@choices = split(' ', $input);

回答2)

@chomp = ();
do {
   print "Enter a score and then press enter. If done, just press enter.";
   chomp($temp = <STDIN>);
   if($trim ne '') {
     push(@choices, $temp);
   }
} until ($temp eq '');
于 2013-01-25T04:32:10.550 に答える