Resistance calculator: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) (Added Perl example) |
|||
Line 375: | Line 375: | ||
assert 32.4 == node.effect() |
assert 32.4 == node.effect() |
||
assert '+' == node.kind</lang> |
assert '+' == node.kind</lang> |
||
=={{header|Perl}}== |
|||
===Infix=== |
|||
{{trans|Perl 6}} |
|||
<lang perl>use strict; |
|||
use warnings; |
|||
use feature <say state>; |
|||
{ |
|||
package Resistor; |
|||
sub new { |
|||
my ($class, $args) = @_; |
|||
my $self = { |
|||
symbol => $args->{symbol}, |
|||
voltage => $args->{voltage}, |
|||
resistance => $args->{resistance}, |
|||
a => $args->{a}, |
|||
b => $args->{b}, |
|||
}; |
|||
return bless $self, $class; |
|||
} |
|||
sub res { |
|||
my $self = shift; |
|||
if ($self->{symbol} eq '+') { return res($self->{a}) + res($self->{b}) } |
|||
elsif ($self->{symbol} eq '*') { return 1 / (1/res($self->{a}) + 1/res($self->{b})) } |
|||
else { return $self->{resistance} } |
|||
} |
|||
sub set_voltage { |
|||
my($self,$voltage) = @_; |
|||
if ($self->{symbol} eq '+') { |
|||
my $ra = res($self->{a}); |
|||
my $rb = res($self->{b}); |
|||
set_voltage($self->{a}, $ra / ($ra+$rb) * $voltage ); |
|||
set_voltage($self->{b}, $rb / ($ra+$rb) * $voltage ); |
|||
} elsif ($self->{symbol} eq '*') { |
|||
set_voltage($self->{a}, $voltage ); |
|||
set_voltage($self->{b}, $voltage ); |
|||
} |
|||
$self->{voltage} = $voltage; |
|||
} |
|||
sub current { my $self = shift; return $self->{voltage} / res($self) } |
|||
sub effect { my $self = shift; return $self->{voltage} * current($self) } |
|||
use overload '+' => \&serial, |
|||
'*' => \∥ |
|||
sub serial { my($a,$b) = @_; Resistor->new( {symbol => '+', a => $a, b => $b} ) } |
|||
sub parallel { my($a,$b) = @_; Resistor->new( {symbol => '*', a => $a, b => $b} ) } |
|||
sub report { |
|||
my($self,$level) = @_; |
|||
state @results; |
|||
push @results, ' Ohm Volt Ampere Watt Network tree' and $level = 1 unless $level; |
|||
my $pad = ('| ') x $level; |
|||
my $f = sprintf '%9.3f' x 4, res($self), $self->{voltage}, current($self), effect($self); |
|||
say "$f $pad" . $self->{symbol}; |
|||
report($self->{a}, $level+1) if defined $self->{a}; |
|||
report($self->{b}, $level+1) if defined $self->{b}; |
|||
join "\n", @results; |
|||
} |
|||
} |
|||
package main; |
|||
my ($R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9, $R10) = |
|||
map { Resistor->new( {symbol => 'r', resistance => $_} ) } <6 8 4 8 4 6 8 10 6 2>; |
|||
my $node = (((($R8 + $R10) * $R9 + $R7) * $R6 + $R5) |
|||
* $R4 + $R3) * $R2 + $R1; |
|||
Resistor::set_voltage($node,18); |
|||
say Resistor::report($node);</lang> |
|||
{{out}} |
|||
<pre> Ohm Volt Ampere Watt Network tree |
|||
10.000 18.000 1.800 32.400 | + |
|||
4.000 7.200 1.800 12.960 | | * |
|||
8.000 7.200 0.900 6.480 | | | + |
|||
4.000 3.600 0.900 3.240 | | | | * |
|||
8.000 3.600 0.450 1.620 | | | | | + |
|||
4.000 1.800 0.450 0.810 | | | | | | * |
|||
12.000 1.800 0.150 0.270 | | | | | | | + |
|||
4.000 0.600 0.150 0.090 | | | | | | | | * |
|||
12.000 0.600 0.050 0.030 | | | | | | | | | + |
|||
10.000 0.500 0.050 0.025 | | | | | | | | | | r |
|||
2.000 0.100 0.050 0.005 | | | | | | | | | | r |
|||
6.000 0.600 0.100 0.060 | | | | | | | | | r |
|||
8.000 1.200 0.150 0.180 | | | | | | | | r |
|||
6.000 1.800 0.300 0.540 | | | | | | | r |
|||
4.000 1.800 0.450 0.810 | | | | | | r |
|||
8.000 3.600 0.450 1.620 | | | | | r |
|||
4.000 3.600 0.900 3.240 | | | | r |
|||
8.000 7.200 0.900 6.480 | | | r |
|||
6.000 10.800 1.800 19.440 | | r</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |