Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Генерация последовательности чисел (Funya)
Author Message
Funya
Заглянувший



Joined: 16 Nov 2003
Posts: 8
Карма: 0
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Feb 03, 2007 8:55 am (написано за 8 минут 31 секунду)
   Post subject: Скажите это велосипед???
Reply with quote

Задача:
Нужно сгенерировать числа допустим от 1.980 до 2 (и на оборот) обязательно с нулями в конце...

Решение:
Написал вот такую каку...
Она определяет что за числа переданы и что с ними делать...
Code (perl): скопировать код в буфер обмена
        sub BuildIntervalNumber {
                my ($NS, $NE) = @_;
                my ($Start, $End);
                if ($NS>$NE) {
                        $Start = $NE; $End = $NS;
                } else {
                        $Start = $NS; $End = $NE;
                }
                if (($Start =~ /^\d+?\.\d+?$/) || ($End =~ /^\d+?\.\d+?$/)) {
                        $Start = "$Start.0" if ($Start =~ /^\d+?$/);
                        $End = "$End.0" if ($End =~ /^\d+?$/);
                        if ("$Start-$End" =~ m (www.perldoc.com/perl5.6/pod/func/m.html)/^(\d+?)\.(\d+?)\-(\d+?)\.(\d+?)$/) {
                                my ($s1,$s2,$e1,$e2) = ($1,$2,$3,$4);
                                my ($is,$ie);
                                if (length (www.perldoc.com/perl5.6/pod/func/length.html)($s2)>length($e2)) {
                                        $e2 = sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)("%d%0".(length (www.perldoc.com/perl5.6/pod/func/length.html)($s2)-length (www.perldoc.com/perl5.6/pod/func/length.html)($e2))."d", $e2);
                                        $is = sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)("%0".length($s2)."d", 0);
                                        $ie = $is; $ie =~ s (www.perldoc.com/perl5.6/pod/func/s.html)/\d/9/g;
                                } elsif (length (www.perldoc.com/perl5.6/pod/func/length.html)($s2)<length($e2)) {
                                        $s2 = sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)("%d%0".(length (www.perldoc.com/perl5.6/pod/func/length.html)($e2)-length (www.perldoc.com/perl5.6/pod/func/length.html)($s2))."d", $s2);
                                        $is = sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)("%0".length($e2)."d", 0);
                                        $ie = $is; $ie =~ s (www.perldoc.com/perl5.6/pod/func/s.html)/\d/9/g;
                                } else {
                                        $is = sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)("%0".length($s2)."d", 0);
                                        $ie = $is; $ie =~ s (www.perldoc.com/perl5.6/pod/func/s.html)/\d/9/g;
                                }
                                my (@return, $n1,$n2);
                                foreach $n1 ($s1..$e1) {
                                        if ($s1 == $e1) {
                                                foreach $n2 ("$s2".."$e2") {
                                                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@return, "$n1.$n2");
                                                }
                                        } elsif (($s1 == $n1) && ($e1 > $n1)) {
                                                foreach $n2 ("$s2".."$ie") {
                                                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@return, "$n1.$n2");
                                                }
                                        } elsif (($s1 < $n1) && ($e1 > $n1)) {
                                                foreach $n2 ("$is".."$ie") {
                                                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@return, "$n1.$n2");
                                                }
                                        } elsif (($s1 < $n1) && ($e1 == $n1)) {
                                                foreach $n2 ("$is".."$e2") {
                                                        push (www.perldoc.com/perl5.6/pod/func/push.html)(@return, "$n1.$n2");
                                                }
                                        }
                                }
                                @return = reverse (www.perldoc.com/perl5.6/pod/func/reverse.html)(@return) if ($NS>$NE);
                                return (www.perldoc.com/perl5.6/pod/func/return.html) @return;
                        }
                } elsif (($Start =~ /^\d+?$/) || ($End =~ /^\d+?$/)) {
                        my (@return);
                        foreach ($Start..$End) {
                                push (www.perldoc.com/perl5.6/pod/func/push.html)(@return, $_);
                        }
                        @return = reverse (www.perldoc.com/perl5.6/pod/func/reverse.html)(@return) if ($NS>$NE);
                        return (www.perldoc.com/perl5.6/pod/func/return.html) @return;
                }
        }
Использование:
Code (perl): скопировать код в буфер обмена
BuildIntervalNumber('1.980','2');
Результат:
дано: от 1.980 до 2
1.980
1.981
1.982
1.983
1.984
1.985
1.986
1.987
1.988
1.989
1.990
1.991
1.992
1.993
1.994
1.995
1.996
1.997
1.998
1.999
2.000

дано: от 2 до 1.980
2.000
1.999
1.998
1.997
1.996
1.995
1.994
1.993
1.992
1.991
1.990
1.989
1.988
1.987
1.986
1.985
1.984
1.983
1.982
1.981
1.980

---------------
Работает прекрасно но почемуто мне кажется что можно все это дело урезать, подрезать и перерезать...:)
Поделитесь тем чего я не знаю плиз...:)
В заранее огромное спасибо...
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Sat Feb 03, 2007 2:21 pm (спустя 5 часов 26 минут; написано за 2 секунды)
   Post subject:
Reply with quote

Code (perl): скопировать код в буфер обмена
sub BuildIntervalNumber {
        my ( $start, $end ) = @_;
        my ( $step, @result );

        $step = ( $start < $end ) ? ( $end - $start ) * 1000 : ( $start - $end ) * 1000;
        for ( 0..$step ) {
                push (www.perldoc.com/perl5.6/pod/func/push.html) @result, sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)( "%.3f", ( $start < $end ) ? $start+($_/1000) : $start-($_/1000) );
        }
        return (www.perldoc.com/perl5.6/pod/func/return.html) @result;
}
Back to top
View user's profile Send private message Send e-mail
Funya
Заглянувший



Joined: 16 Nov 2003
Posts: 8
Карма: 0
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Feb 03, 2007 3:07 pm (спустя 45 минут; написано за 9 минут 4 секунды)
   Post subject:
Reply with quote

Спасибо не то...

Надо чтобы функция определяла сама то что вы ей дали и далее...
если даете от 5.1 до 6 то получаете 5.1,5.2,5.3...6.0
если даете от 6.000 до 5 то получаете 6.000,5.999,5.998...5.000
если даете от 1 до 7 то получаете 1,2,3...7
...
Короче не знаю как еще обьяснить...

з.ы. Еще раз спасибо...:)
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Sat Feb 03, 2007 3:52 pm (спустя 45 минут; написано за 18 секунд)
   Post subject:
Reply with quote

GamBurger wrote:
Надо чтобы функция определяла сама то что вы ей дали
Хм. Вам ещё и разжевать надо...
Code (perl): скопировать код в буфер обмена
use warnings;
use strict;

print (www.perldoc.com/perl5.6/pod/func/print.html) "$_\n" for ( BuildIntervalNumber('1.980','2') );

sub BuildIntervalNumber {
        my ( $start, $end ) = @_;
        my ( $degree, $step, @result );

        $start =~ /\d+\.?(\d*)/;
        $degree = $1 ? length (www.perldoc.com/perl5.6/pod/func/length.html) $1 : 0;

        $step = ( $start < $end ) ? ( $end - $start ) * ( 10**$degree ) : ( $start - $end ) * ( 10**$degree );
        push (www.perldoc.com/perl5.6/pod/func/push.html) @result, sprintf (www.perldoc.com/perl5.6/pod/func/sprintf.html)( "%.${degree}f", ( $start < $end ) ? $start+($_/10**$degree) : $start-($_/10**$degree) ) for ( 0..$step );

        return (www.perldoc.com/perl5.6/pod/func/return.html) @result;
}
Back to top
View user's profile Send private message Send e-mail
Funya
Заглянувший



Joined: 16 Nov 2003
Posts: 8
Карма: 0
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Feb 03, 2007 6:29 pm (спустя 2 часа 36 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

мда...
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Sat Feb 03, 2007 6:51 pm (спустя 22 минуты; написано за 10 секунд)
   Post subject:
Reply with quote

GamBurger wrote:
мда...
Не понял, что не устраивает?
Back to top
View user's profile Send private message Send e-mail
Funya
Заглянувший



Joined: 16 Nov 2003
Posts: 8
Карма: 0
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Feb 03, 2007 7:38 pm (спустя 47 минут; написано за 2 минуты 17 секунд)
   Post subject:
Reply with quote

нет нет...
сори... забыл по благодарить:)
немного не до жевали правда...;)

еще раз спасибо...:)
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Sat Feb 03, 2007 8:25 pm (спустя 46 минут)
   Post subject:
Reply with quote


М

ok

Тема закрыта.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML