Ну вот ещё сюда добавим - Perl.Olej писал(а):- C
- C++
- Java
- Python
- JavaScript
- PHP
- Lua
- bash
В самом Perl нет комплексной математики (как типа данных), но в их репозитарии CPAN накопились модули на все случаи жизни, в частности Math::Complex.
Так что здесь я ничего не изобретал, а взял готовое.
Код: Выделить всё
#!/usr/bin/perl
use strict 'subs';
use Math::Complex;
sub perimeter {
my @par = @_;
$suma = 0.0;
for( $i = 0; $i <= $#par; $i++ ) {
if( $i == 0 ) { $j = $#par; }
else { $j = $i - 1; }
$suma += abs( $par[ $i ] - $par[ $j ] );
}
return $suma;
}
sub square {
my @par = @_;
$suma = 0.0;
foreach $i ( 0 .. $#par - 2 ) {
$s1 = $par[ $i + 1 ] - $par[ 0 ];
$s2 = $par[ $i + 2 ] - $par[ 0 ];
$suma += abs( $s1 ) * abs( $s2 ) *
abs( sin( arg( $s2 ) - arg( $s1 ) ) ) / 2.;
}
return $suma;
}
while( "true" ) {
print "координаты вершин в формате: X Y (^D конец ввода)\n";
$i = 0;
@polygon = ();
while( "true" ) {
print( "вершина № ", $i + 1, " : " );
unless( defined( $line = <STDIN> ) ) { # ^D - конец ввода
print "\r";
last;
}
chop( $line );
@parm = split( /\s+/, $line );
if( $#parm != 1 or # только 2 координаты
$parm[ 0 ] !~ /\d+\.{0,1}\d*$/ or # X - нечисловой
$parm[ 1 ] !~ /\d+\.{0,1}\d*$/ ) { # Y - нечисловой
print "ошибка ввода!\n";
next;
}
$c = cplx( $parm[ 0 ], $parm[ 1 ] );
push( @polygon, $c );
$i++;
}
$msg = "вершин " . ( $#polygon + 1 ) . " : ";
foreach $c ( @polygon ) {
$re = Re( $c );
$im = Im( $c );
$msg .= "[$re,$im] ";
}
print "$msg\n";
printf( "периметр = %.2f\n", perimeter( @polygon ) );
printf( "площадь = %.2f\n", square( @polygon ) );
print "---------------------------------\n";
}
Код: Выделить всё
olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft$ perl triangle.pm
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 2 1
вершина № 3 : 1 2
вершин 3 : [1,1] [2,1] [1,2]
периметр = 3.41
площадь = 0.50
---------------------------------
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 1 2
вершина № 3 : 2 2
вершина № 4 : 2 1
вершин 4 : [1,1] [1,2] [2,2] [2,1]
периметр = 4.00
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : ^C