Скрипт классы Date и Calendar

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

Скрипт классы Date и Calendar

Сообщение ZEN » 12 авг 2013, 14:25

[spoiler="Подробное описание задания"]Класс Date должен иметь возможность задать текущую дату и получить отдельно день, месяц, год, а также текстовое представление даты в формате “Год месяц день”.
Класс Calendar позволяет установить и получить текущую дату (как объект класса Date), прибавить к текущей дате некоторое количество дней (метод add_days), месяцев (метод add_months) или лет (add_years).


Входные данные:
файл содержащий произвольный код на perl, который использует Date и Calendar

Выходные данные:

результат выполнения кода.

Пример:

$ cat ../08/dat/00_example.dat
print "Current date:\n";
my $current_date = Date->new();
print $current_date->year. "\n";
print $current_date->month . "\n";
print $current_date->day . "\n";
print $current_date->get_struct . "\n";
print "\n";


print "Set full date as hash:\n";
my $fixed_date_hash = Date->new({year=>2012, month=>6, day=>21});
print $fixed_date_hash->get_struct . "\n";
print "\n";


print "Set full date as array:\n";
my $fixed_date_array = Date->new([2012,6,21]);
print $fixed_date_array->get_struct . "\n";
print "\n";

print "Shouldn't create object, if not full params provided:\n";
my $fail_date_hash = Date->new({year=>2012, month=>6});
print "Object not created\n" if not defined $fail_date_hash;
my $fail_date_array = Date->new([2012, undef, 6]);
print "Object not created\n" if not defined $fail_date_array;
print "\n";

print "Should be able to change year/month/day:\n";
my $test_change_date = Date->new();
print $test_change_date->get_struct . "\n";
$test_change_date->day(1);
$test_change_date->year(2012);
$test_change_date->month(7);
print $test_change_date->get_struct . "\n";
$test_change_date->{day} = 2;
$test_change_date->{year} = 2011;
$test_change_date->{month} = 2;
print $test_change_date->get_struct . "\n";
print "\n";

print "Calendar should be a Date" . "\n";
my $calendar = Calendar->new([2011, 1,1]);
if($calendar->isa("Date")){
print "Calendar is a Date\n";
}
print "\n";

print "Calendar should be able to add months\n";
my $now_plus_5_month = $calendar->add_months(5);
print $now_plus_5_month->get_struct() . "\n";
print "\n";


print "Calendar should be able to add years\n";
my $now_plus_5_years = $calendar->add_years(5);
print $now_plus_5_years->get_struct() . "\n";
print "\n";

print "Calendar should be able to add days\n";
my $now_plus_5_days= $calendar->add_days(5);
print $now_plus_5_days->get_struct() . "\n";
print "\n";


Вывод:

diesel@bender-2:07$ perl ../08/08.pl ../08/dat/00_example.dat
Current date:
2013
7
2
2013/7/2

Set full date as hash:
2012/6/21

Set full date as array:
2012/6/21

Shouldn't create object, if not full params provided:
Object not created
Object not created

Should be able to change year/month/day:
2013/7/2
2012/7/1
2011/2/2

Calendar should be a Date
Calendar is a Date

Calendar should be able to add months
2011/6/1

Calendar should be able to add years
2016/6/1

Calendar should be able to add days
2016/6/6[/spoiler]

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

#!/usr/bin/perl

use warnings;

{
	package Date;
    use POSIX;
	sub new {
		my $class = shift;
		my $self = shift;
        if (!defined $self) {
            my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
            $self = {
                year  => 1900+$year, 
                month => $mon,
                day   => $mday
            };
        } elsif (ref($self) eq "ARRAY") {
            foreach my $tmp(@$self) {
                if (!defined $tmp) {
                    return undef;
                }
                return undef if (! $tmp =~ m/^\d+/);
            }
            $self = {
                year  => @$self[0], 
                month => @$self[1],
                day   => @$self[2]
            };
        } 
        if (scalar(keys %$self) != 3) {
            return undef;
        }
        foreach my $key (keys %$self) {
            if (!defined $self->{$key}) {
                return undef;
            }
            return undef if (! $self->{$key} =~ m/^\d+/);
        }
        my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}, $self->{month}-1, $self->{year} - 1900, -1, -1, -1);
        $self = {split /[,>]/, $buff};
		bless $self, $class;
		return $self;
	}

	sub get_struct {
		my $self = shift;
		return $self->{"year"}."/".int($self->{"month"})."/".int($self->{"day"});
	}
    
	sub year {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}, $self->{month}-1, $tmp - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add years");
            }
		}
		return $self->{year};
	}
    
	sub month {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}, $tmp-1, $self->{year} - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add years");
            }
		}
		return int($self->{month});
	}
    
	sub day {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $tmp, $self->{month}-1, $self->{year} - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add years");
            }
		}
		return int($self->{day});
	}

}
{
	package Calendar;
    use POSIX;
    our @ISA = ('Date');
     
	sub add_years {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}, $self->{month}-1, $self->{year}+$tmp - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add years");
            }
		}
		return $self;
	}
    
	sub add_months {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}, $self->{month}-1+$tmp, $self->{year} - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add months");
            }
		}
		return $self;
	}
    
	sub add_days {
		my $self = shift;
		if(@_){
            my $tmp = shift;
            if ($tmp =~ m/^[\d]+/) {
                my $buff = strftime("year>%Y,month>%m,day>%d", 0, 0, 0, $self->{day}+$tmp, $self->{month}-1, $self->{year} - 1900, -1, -1, -1);
                my %hash = split /[,>]/, $buff;
                foreach my $key (keys %hash) {
                    $self->{$key} = $hash{$key};
                }
            } else {
                warn("Cannot add days");
            }
		}
		return $self;
	}
}

# use first argument of script as file name whith data
my $test_file_path = $ARGV[0];
# open file and get file handler or die
open( FH, "<", "$test_file_path") or die "Missing file names";
my $ptrname;
my $code;
my $first = 0;
$code = do {local $/;<FH>;};

eval($code);
if ($@) {
    print "ERROR\n";
    warn("$@");
    exit 1;
}


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

Ответить

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

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