2012-10-17 2 views
0

내 질문에 Perl : 값 목록을 허용하는 서브 루틴으로 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. 

어디 스크립트에서 잘못된 것입니까? 제발 도와주세요. 미리 감사드립니다.

+2

항상 'use strict; 경고를 사용하라. !! – ikegami

답변

0

평균 절차에서는보아야 할 것으로 생각되는 @test_array이 표시되지 않습니다. 대신 빈 배열이 표시됩니다.

재 작성 avg 다음과 작동합니다 같이

sub avg { 
    my @test_array = @_; 
    my ($avg); 
    my ($total); 
    # ... 
} 
+0

'@ _'을 (를) 복사하는 것은 어리석은 일입니다. for (@test_array) 대신'for (@_)'를 사용하십시오. – ikegami

+0

글쎄, 그건 정말 바보가 아니야. 물론, 그것은 효율적이지 않습니다. 그러나 인간에게는 가독성이 훨씬 더 중요합니다. 이것이 바로 그 이유입니다. – mvp

+2

'@ test_array'는 임의의 숫자를 평균화하는 함수에서'@ _ '보다 의미가 있다고 말하는 겁니까? – ikegami

3

avg의 인수를 읽지 않습니다. 또한 동시에 선언과 과제를 몇 가지 변수를 저장 할 수

my @test_array = @_; 

추가 : 당신은 왜 스칼라로 나누어 여기에

$avg = $total/scalar @test_array; 

divisionby 제로가처럼

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; 
} 
+0

감사합니다. 나는 결과를 얻었다. – user1613245

+0

@ user1613245 그러면 답 이외의 화살표를 클릭하여 답 중 하나를 수락 할 수 있습니다. –

-1

가 보이는 ?

+0

'scalar @ array'는 배열 요소의 수를 반환합니다. – choroba

+2

표현식이 정확합니다. 유일한 문제는 빈 매개 변수 목록에 대한 보호가 없다는 것입니다. – Borodin

0

테스트 배열은 main에서 lexical로 선언되고 함수에서 직접 사용됩니다. 함수에 전달되어야하거나 권고되지 않은 어휘를 제거해야합니다.

4

I 조언 당신은 핵심 모듈을 사용 List::Util, 그것은 당신이 최소, 최대, 합계로 구현하는 것이 모든 기능을 가지고있다.

#!/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"; 
+0

고마워요 – user1613245

+0

이것은 질문에 대답하지 않습니다 – Borodin

+0

저는 선생님을 알고 있지만 새로운 것을 배울 수 있습니다. – user1613245

관련 문제