我有一个需要帮助的学校作业。现在,我知道你在想什么,但我的老师不在城里,没有回复我的电子邮件,我的其他同学也不知道如何解决这个问题。一些指示和提示将不胜感激!
任务是这样的:
我们应该创建一个数组,用 1-100 范围内的 20 到 30 个随机整数填充它。然后,在子程序的帮助下,我们应该计算这些数字的平均值。
当我调用子例程时出现问题,这给了我答案 0 或“非法除以 0”错误。我现在的代码是这样的:
#! /usr/bin/perl -w
use warnings;
use strict;
# Declaring the scalar variables and arrays.
my @AllNumbers;
# Create random data set of between 20 to 30 measures used for the 100 random intigers.
my $random_number = int( rand( 31 - 20 ) ) + 20;
# Create random data set of 100 intigers.
for ( my $i = 0 ; $i <= $random_number ; $i++ ) {
$AllNumbers[$i] = int( rand( 100 - 1 ) );
}
# Print the 20 to 30 random numbers (range 1 - 100).
print("Your random numbers are: \n@AllNumbers");
sub average {
my $ArrayAverage = @_;
for (@_) {
my $total += $_;
}
return $ArrayAverage / $random_number;
} ## end sub average
# Print the mean/average of the 20-30 numbers.
print( "\n\nThe average of those random numbers is: ", &average, "\n\n" );
现在,正如我所说,我想自己解决这个问题,我已经花了整整两天的时间,但无论我做什么似乎都无法解决它。任何提示将非常感谢。附言应该提到的是,我们不应该使用任何模块/插件。
最佳答案
我首先要解决几个风格点:
&
调用子程序 - 这是不好的风格,会导致一些奇怪的行为。在你的情况下: &average
被有效地调用,没有参数。但总的来说它很糟糕,除非您明确知道为什么要这样做,否则不要使用它。 (它确实有一些用途,但是当你看到它们时你会知道——而且你不会在早期学习 perl
时)。 for ( 1..$random_number ) {
,因为您不需要迭代器。 -w
,因为你有 use warnings
。 use warnings;
是更好的方法。 $random_number
不是很有帮助 - 我们可以看到,因为它被分配了 rand
的结果。称之为它的用途 - 比如 $number_of_elements
。 $random_number
一次,您可能不需要将其粘贴在变量中。你可以,如果你觉得它有助于可读性(这是一个品味问题——在良好的编程中,清晰易读是唯一真正重要的事情——考虑到当今编译器的状态,大多数内存/性能都是过早的优化。)不过,您的核心问题是:
my $ArrayAverage = @_;
这会将
$ArrayAverage
设置为列表中的元素数。这将始终与 $random_number
相同,因为这是您迭代的次数。您在此处迭代元素,但实际上并未使用
$total
。for (@_) {
my $total += $_;
}
所以在这里 - 你返回数组中的元素数除以数组中的元素数。
return $ArrayAverage / $random_number;
但真正重要的是 - 这些都不重要,因为您使用
&average
调用它,实际上并没有发送任何参数。所以你只是输入零,然后输出零。知道它可能很有用 - 标量上下文中的数组返回元素的数量,因此计算平均值很简单:
my $sum;
$sum += $_ for @AllNumbers;
print( "\n\nThe average of those random numbers is: ", $sum / @AllNumbers, "\n\n" );
这将产生一个长十进制 - 如果您需要格式化它,您可以使用
printf
或 sprintf
。printf( "\n\nThe average of those random numbers is: %02.2f \n\n", $sum / @AllNumbers);
所以我会稍微改写成这样:
#!/usr/bin/perl
use warnings;
use strict;
# Declaring the scalar variables and arrays.
my @all_numbers;
#repeat 20 + random 11 times - so 20-30
for ( 1 .. 20 + int rand 11 ) {
push ( @all_numbers, int rand 99 );
}
# Print the 20 to 30 random numbers (range 1 - 100).
print("Your random numbers are: \n@all_numbers\n");
#calculate sum of elements
my $sum;
$sum += $_ for @all_numbers;
print "Sum: $sum count: ", scalar @all_numbers, "\n";
# Print the mean/average of the 20-30 numbers.
printf( "\n\nThe average of those random numbers is: %02.2f \n\n", $sum / @all_numbers);
关于arrays - Perl 从随机填充的数组中计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35152207/