Perl - cvičení 12

  1. Napište moduly definující třídy Obrazec, Kruh a Ctverec. Kruh a Ctverec budou potomky třídy Obrazec. Ta bude definovat konstruktor (může fungovat jako metoda třídy i jako metoda objektu) a metodu, která vypíše jméno obrazce. Atributem objektu třídy Kruh bude průměr, třída Ctverec má atributy délka strany nebo délka úhlopříčky. Obě třídy definují metody pro výpočet obsahu obrazce. V případě, že potřebné atributy nejsou nastaveny, vypište varování.

    Použijte moduly Kruh a Ctverec pro vytvoření objektů těchto tříd, nastavte jim atributy a vypište obsahy těchto obrazců.

    Atributy objektů mohou být nastaveny hned v konstruktoru, ale mohou být také nastaveny až po vytvoření objektu. Napište proto funkce, které umějí s atributy pracovat (tzn. modifikovat hromadně i po jednom, stejně tak jako je číst).

    Konstantu PI importujte z modulu Obrazec.

    Modul Obrazec:

    package Obrazec;
    
    use Exporter;
    @ISA = qw(Exporter);
    
    our @EXPORT = qw(PI);
    
    sub new {
            my $kdo = shift;
            return bless {@_}, ref $kdo || $kdo;
    }
    
    sub jmeno {
            my $kdo = shift;
            return ref $kdo || $kdo;
    }
    
    sub nastav_atributy {
            my $objekt = shift;
    
            my %atributy = @_;
    
            $objekt->{$_} = $atributy{$_} for keys %atributy;
    }
    
    sub dej_atribut {
            my $objekt = shift;
    
            return $objekt->{shift()};
    }
    
    sub PI () {3.14};
    
    
    Modul Kruh:
    package Kruh;
    
    use Obrazec;
    our @ISA = qw(Obrazec);
    
    sub obsah {
            my $objekt = shift;
    
            unless (exists $objekt->{prumer}) {
                    warn "Neni zadan prumer kruhu\n";
            } else {
                    return PI*($objekt->{prumer}/2)**2;
            }
    }
    
    Modul Ctverec:
    package Ctverec;
    
    use Obrazec;
    our @ISA = qw(Obrazec);
    
    sub obsah {
            my $objekt = shift;
    
            unless (exists $objekt->{strana} or exists $objekt->{uhlopricka}) {
                    warn "Neni zadana strana nebo uhlopricka ctverce\n";
            } elsif (exists $objekt->{strana}) {
                    return $objekt->{strana}**2;
            } else {
                    return +($objekt->{uhlopricka}/sqrt(2))**2;
            }
    }
    
    Příklad použití objektů tříd Kruh a Ctverec:
    use Kruh;
    
    my $k = new Kruh prumer => 1;
    
    print "jmeno obrazce: ".$k->jmeno."\n";
    print "prumer: ", $k->dej_atribut('prumer'), "\n";
    print "obsah: ", $k->obsah, "\n";
    
    use Ctverec;
    my $c = new Ctverec;
    
    print "jmeno obrazce: ".$c->jmeno."\n";
    $c->nastav_atributy(uhlopricka => sqrt(2));
    print "uhlopricka: ", $c->dej_atribut('uhlopricka'), "\n";
    print "obsah: ", $c->obsah, "\n";
    
    
    $c->nastav_atributy(barva => cervena, strana => 2);
    print "strana: ", $c->dej_atribut('strana'), "\n";
    print "obsah: ", $c->obsah, "\n";
    
    my $c2 = new Ctverec;
    print $c2->obsah;  # varovani, nemame zadany potrebne hodnoty
    
    # do promenne $c2 si ulozim odkaz na objekt tridy Kruh
    $c2=$k;
    print "obsah : ", $c2->obsah;
    
  2. S využitím stanradního modulu CGI vygenerujte a vypište kód webové stránky s titulkem "Datum", obsahující nadpis úrovně 1 "Dnešní datum" a text s aktuálním datem, následovaný horizontální čarou. Jednou příklad vyřešte tak, že modul CGI použijete objektovým způsobem, podruhé standardním způsobem (provedete import potřebných jmen).
    # objektově orientované použití
    use CGI;
    my $q = new CGI;
    my @time = localtime;
    print $q->start_html(-title => 'Datum'),
          $q->h1("Datum"),
          $q->p("$time[3]. ".(1+$time[4]).". ".(1900+$time[5])),
          $q->hr,
          $q->end_html;
    
    
    # standardní použití
    use CGI ':standard';
    my @time = localtime;
    print start_html(-title => 'Datum'),
          h1("Datum"),
          p("$time[3]. ".(1+$time[4]).". ".(1900+$time[5])),
          hr,
          end_html;
    
© 2013, František Dařena

Valid XHTML 1.0! Valid CSS!