2015-09-28 3 views
2

Я ищу помощь в том, как перемещаться по массиву. У меня есть исходный код, который принимает число радиуса круга и создает его окружность. Это занимает только одно число, и я хотел бы получить несколько окружностей.Perl Circle Array Function

#!/usr/bin/env perl 
use warnings; 

$pi = 3.141592654; 
print "What's the radius? "; 
chomp($radius = <STDIN>); 
$circle = 2 * $pi * $radius; 
if ($radius < 0) { 
$circle = 0; 
} 
print "The circumference of a circle with the radius of $radius is $circle.\n"; 

Теперь я хочу иметь возможность вводить несколько чисел для нескольких радиусов, используя цикл while, чтобы поместить их в массив. Когда я вхожу в 0 или число меньше 0, цикл while будет завершен, и программа будет продолжена путем прокрутки массива введенных пользователем чисел и вычисления окружности каждого круга с использованием этих значений в виде радиусов.

У меня есть код, который пытается это сделать, но я не могу заставить его работать.

@number = <STDIN>; 
while(<>) { 
print "whats the radius? "; 
my($circle, $radius, $pi); 

$radius = &rad(<STDIN>); 
$pi = 3.141592654; 


$circle = 2 * $pi * $radius; 
if ($radius <= 0){ 

    return $circle; } 
} 

Любое направление, куда идти, или простое решение было бы очень полезно.

+4

Добро пожаловать в StackOverflow и в тег [perl]! Если вы изучаете Perl прямо сейчас, похоже, что вы используете устаревший источник. Пожалуйста, ознакомьтесь с учебниками, связанными в [perl tag wiki] (http://stackoverflow.com/tags/perl/info) и улучшившись, добавив 'use strict;' и 'use warnings;' в начало каждой программы, которую вы написать. Они помогут вам обнаружить ошибки раньше. – simbabque

+0

Также обратите внимание, что вашей второй программе не хватает ';' после первой строки. – simbabque

ответ

0
use strict; 
use warnings; 

use Data::Dumper; 

Это повторяет свой код в бесконечном цикле, выход, если радиус < = 0.

Он хранит все соответствующие значения для окружности и радиуса в массивах:

my (@circle, @radius); 
while(1){ 
    print "What's the radius? "; 
    chomp($radius = <STDIN>); 
    $circle = 2 * $pi * $radius; 
    print "The circumference of a circle with the radius of $radius is $circle.\n"; 
    last if $radius <= 0; 
    push @circle, $circle; 
    push @radius, $radius; 
} 

print Dumper \@circle, \@radius; 
2

Чтобы сделать это с помощью массива, вы должны сначала прочитать, пока вы не получите ноль и push. Затем вы можете обрабатывать массив с помощью цикла for или foreach. Эти два являются одинаковыми, но синтаксис, обычно связанный с foreach, является более perlish.

use strict; 
use warnings; 

# turn on autoflush so stuff gets printed immediately 
$|++; 

print "Please enter a bunch of numbers, or 0 to stop. "; 

my @numbers; 
while (my $n = <>) { 
    chomp $n; 

    # stop at zero or less 
    last if $n <= 0; 

    # store the number in the array 
    push @numbers, $n; 
} 

my $pi = 3.141592654; 

foreach my $radius (@numbers) { 
    my $circumference = 2 * $pi * $radius; 

    # print with format (%s gets replaced by params) 
    printf "The circumference of a circle with radius %s is %s\n", $radius, $circumference; 
} 

Вот вход/выход.

Please enter a bunch of numbers, or 0 to stop. 1 
2 
3 
0 
The circumference of a circle with radius '1' is '6.283185308' 
The circumference of a circle with radius '2' is '12.566370616' 
The circumference of a circle with radius '3' is '18.849555924' 

При запуске своей первой программы, я заметил, что Что радиус? сообщение появилось под подсказкой ввода. Это связано с тем, что ваш выходной буфер очищается только тогда, когда у вас есть новая строка \n (или в некоторых других случаях, но не будем игнорировать их). Чтобы изменить это поведение, вы можете включить автозапуск в буфере или просто установить $| на значение, большее нуля. Для этого обычно используется инкремент-идиома.


Вы также можете использовать модуль Math :: Trig для получения π. Он поставляется с Perl и имеет константу, которая дает вам pi. Поскольку константы в Perl - это просто субтитры, вы импортируете их, как любую другую функцию из модуля.

use strict; 
use warnings; 
use Math::Trig 'pi'; # load module and import the 'pi' constant 

# ... 

foreach my $radius (@numbers) { 
    my $circumference = 2 * pi * $radius; 

    # print with format (%s gets replaced by params) 
    printf "The circumference of a circle with radius %s is %s\n", $radius, $circumference; 
} 
+1

'for' и' foreach' точно идентичны, алиасы к одной и той же функции. – TLP

+1

@TLP Я обновился, чтобы сделать это более понятным. Спасибо. – simbabque

+0

@simbabque Спасибо, что это очень полезно. – PJCollins

0

проще, чем это может показаться - тон основных способов взаимодействия с массивом осуществляется через для (или Еогеасп - они одинаковы) петли. Каждая итерация цикла, переменная устанавливается на итератор - вы можете указать ее (я имею ниже), но если вы этого не делаете, по умолчанию используется $_.

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

my $PI = 3.141592654; 

print "Please enter radii, terminate with ^D\n"; 
my @list_of_values = <STDIN>; 
chomp (@list_of_values); #remove linefeeds 

foreach my $radius (@list_of_values) { 
    print "Circumference of radius $radius is: ", $PI * $radius * 2,"\n"; 
} 

Другой трюк я использую выше - читает STDIN. Perl знает разницу между чтением одного значения - в скалярном или считывает последовательность значений в массив.

Так он будет вести себя по-другому, если вы:

my $value = <STDIN>; #reads one line 
my @values = <STDIN>; #reads all the lines 

Вы также можете сделать это с помощью:

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

my $PI = 3.141592654; 
my @list_of_values; 

print "Enter radii, or \"done\" if complete\n"; 
while (my $input = <STDIN>) { 
    chomp($input); 
    last if $input eq "done"; 
    if ($input =~ m/^[\d\.]+$/) { 
     push(@list_of_values, $input); 
    } 
    else { 
     print "Input of \"$input\" is invalid, please try again\n"; 
    } 
} 

foreach my $radius (@list_of_values) { 
    print "Circumference of radius $radius is: ", $PI * $radius * 2, "\n"; 
} 

for и foreach делать то же самое, это вопрос стиля, который вы используете ,