Perl - cvičení 10

  1. Napište program, který načte matici hodnot (hodnoty na řádcích oddělené mezerou), vypíše tuto matici transponovanou.

    Příklad - vstup:

    1 2 3 4
    5 6 7 8
    
    Výstup:
    Transponovaná matice:
    1 5
    2 6
    3 7
    4 8
    Součet všech prvků: 36
    Součet prvků na hlavní diagonále: 7
    
    Možné řešení:
    my $soucet; my $soucet_diagonala;
    my @matice; my @transponovana;
    while (<>) {
            chomp;
            my @radek = split;
            push @matice, [@radek];
    	# nebo jenom push @matice, [split];
    }
    for my $radek (0..$#matice) {
            for my $sloupec (0..@{$matice[0]}-1) {
                    $transponovana[$sloupec]->[$radek] = $matice[$radek]->[$sloupec];
                    $soucet += $matice[$radek]->[$sloupec];
                    $soucet_diagonala += $matice[$radek]->[$sloupec] if $radek == $sloupec;
            }
    }
    
    print "Transponovana matice:\n";
    print "@$_\n" for @transponovana;
    print "Soucet vsech prvku: $soucet\n";
    print "Soucet prvku na hlavni diagonale: $soucet_diagonala\n";
    
  2. Napište program, který projde tabulku symbolů balíku main a vypíše jména všech polí a hashl, které oobsahují nějaké hodnoty.
    # pomocí symbolických odkazů
    for (keys %main::) {
            print "\@$_ je pole\n" if @$_;
            print "\%$_ je hash\n" if %$_;
    }
    
    # nebo pomocí typeglobů
    for (keys %main::) {
            local *symbol = $_;
            print "\@$_ je pole\n" if @symbol;
            print "\%$_ je hash\n" if %symbol;
    }
    
  3. Napište funkci zobraz_struktury, která přebírá jako seznam argumentů libovolný počet skalárů, polí nebo hashů a která potom každou z těchto struktur zobrazí následujícím způsobem:
    1. argument - skalár
    Hodnota: 10
    
    2. argument - pole
    Hodnoty: 1, 2, 3
    
    3. argument - hash
    Obsah:
    	klic1 => hodnota1
    	klic2 => hodnota2
    
    Vyzkoušejte následovně:
    $x = 1;
    @p = (1,2,3);
    %h = (klic1 => 'hodnota1', klic2 => 'hodnota2');
    
    zobraz_struktury \$x, \@p, \%h;
    
    Možné řešení:
    sub zobraz_struktury {
            my $i = 1;
            for (@_) {
                    if (ref eq 'SCALAR') {
                            print "$i. argument - skalar\n";
                            print "Hodnota: $$_\n\n";
                    } elsif (ref eq 'ARRAY') {
                            print "$i. argument - pole\n";
                            print "Hodnoty: ", join(', ', @$_), "\n\n";
                    } elsif (ref eq 'HASH') {
                            print "$i. argument - hash\n";
                            print "Obsah:\n";
                            for my $klic (keys %$_) {
                                    print "$klic => $_->{$klic}\n";
                            }
                            print "\n\n";
                    } else {
                            "Nepodporovany datovy typ\n\n";
                    }
                    $i++;
            }
    }
    
© 2003, František Dařena

Valid XHTML 1.0! Valid CSS!