Программа нахождения корней квадратного уровнения

Вопросы и обсуждения, касающиеся программирования на Perl.
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1357
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Программа нахождения корней квадратного уровнения

Сообщение ZEN » 23 июл 2013, 19:33

[spoiler="Подробное описание задания"]Входные данные: три числа

Выходные данные: количество корней и их значение (если есть), см. пример вывода тестового скрипта.


# Содержимое тестового файла tests.dat:
6, 100, 2
4, 16, 8

5,10,5
-5,10,-5
-1,-1, -2
9,0,-2
3,3,3
21,23,4
89,76,56


# Запускаем скрипт:
./script_00.pl tests.dat > results.log 2> errors_description.log


# Результат в файле results.log:
2 (-0.0200240577733825 -16.6466426088933)
2 (-0.585786437626905 -3.41421356237309)
Error
1 (-1)
1 (1)
0
2 (0.471404520791032 -0.471404520791032)
0
2 (-0.216846571679767 -0.878391523558329)
0[/spoiler]

Код: Выделить всё

#!/usr/bin/perl -w
use strict;

sub discriminant {
    if (defined $_[0] && defined $_[1] && defined $_[2]) {
        my $a = $_[0];
        my $b = $_[1];
        my $c = $_[2];
        
        if (!(($a * 1) eq $a) || !(($b * 1) eq $b) || !(($c * 1) eq $c)) {
            print STDOUT "Error\n";
            print STDERR "Not integer value  $a, $b, $c !\n";
            return 1;
        }
        
        if ( $a == 0 ) {
            print STDOUT "Error\n";
            print STDERR "Not root equation !\n";
            return 2;
        }

        my $d = $b*$b-4*$a*$c;
        
        if ( $d > 0) {
            my $x1 = (-$b+sqrt($d))/(2*$a);
            my $x2 = (-$b-sqrt($d))/(2*$a);
            print STDOUT "2 ($x1 $x2)\n";
        } elsif ( $d == 0.0 ) {
            my $x1 = (-$b/(2*$a));
            print STDOUT "1 ($x1)\n";
        } else {
            print STDOUT "0\n";
            print STDERR "equation roots not found for values $a, $b, $c \n";
        }
    } else {
        print STDOUT "Error\n";
        print STDERR "Error! Not enough values\n";
    }
}

my $test_file_path = $ARGV[0];
open( FH, "<", "$test_file_path") or die "Can not open test file: $!";

while ( my $str = <FH> ) {
    # < обработка >
    $str =~ s/\s*//g;
    discriminant(split(",", $str));
}

close ( FH );

exit 0;
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей