Perl - cvičení 5

  1. Napište program, který bude zpracovávat vstupní textový soubor, kde na každém řádku bude příjmení studenta a získané body (oddělené mezerou). Program vypíše pro každého studenta všechny jeho získané body a průměr ze získanych bodů.

    Pro jednoduchost uvažujme, ze se jména studentů jsou různá - opakovaný výskyt jména Novák znamená další položku pro studenta Nováka a ne jiného studenta se stejným jménem. (Převzato z knihy Programování v jazyce Perl od Larryho Walla.) Vstupní data (zkopírujte do souboru, z něho potom budete data číst):

    Novak 8
    Polak 16
    Vesely 7
    Bednar 14
    Novak 9
    Bednar 6
    Rychly 10
    Dostal 12
    Novak 10
    Rychly 5
    Novak 8
    
    Mělo by se vypsat:
    Novak: 8, 9, 10, 8	Prumer: 8.75
    Polak: 16		Prumer: 16
    Vesely: 7		Prumer: 7
    Bednar: 14, 6		Prumer: 10
    Rychly: 10, 5		Prumer: 7.5
    Dostal: 12		Prumer: 12
    
    Možné řešení:
    open F, "hodnoceni" or die "Neni soubor s hodnocenim\n";
    
    # cteme radky ze souboru
    while (<F>) {
            # radek rozdelime podle mezery
            ($jmeno, $hodnoceni) = split ' ';
    
            # do hashe %hodnoceni ke klci JMENO pridame dalsi hodnoceni a carku
            $hodnoceni{$jmeno} .= $hodnoceni.', ';
    }
    
    # vypocitame si maximalni delku retezce se jmenem a hodnocenimi,
    # neni nutne, je zde pouze pro formatovani (zatim neumime
    # pouzivat formaty :-)
    $max_delka = 0;
    for (keys %hodnoceni) {
            $delka = length($_.': '.$hodnoceni{$_});
            $max_delka = $delka if $delka > $max_delka;
    }
    # v promenne $max_delka mame delku nejdelsiho radku
    
    # projdeme vsechna jmena, seradime podle abecedy
    for (sort keys %hodnoceni) {
            # orizneme posledni dva znaky (retezec ", ")
            chop $hodnoceni{$_};
            chop $hodnoceni{$_};    # nebo $hodnoceni{$_} =~ s/..$//;
                                    # ale nezname regularni vyrazy :-(
    
            # vypiseme jmeno, hodnoceni a mezery do maximalni delky radku
            print "$_: $hodnoceni{$_}",
                    ' 'x ($max_delka - length("$_:$hodnoceni{$_}"));
    
            # vypocitame prumer
            $pocet = 0; $soucet = 0;
            for (split ', ', $hodnoceni{$_}) {
                    $pocet++;
                    $soucet += $_;
            }
            # vypiseme prumer a odradkujeme
    	print "Prumer: ", $soucet/$pocet, "\n";
    }
    
  2. Vytvořte program, který uživateli umożní zjistit hodnoty parametrż z tohoto vzorového konfiguračního souboru. Uživatel může zjitit, jestli zadaný parametr je nebo není nastaven, na jakou hodnotu, uživatel si může vypsat seznam parametr podle nějakého kritéria (např. podle počátečního písmene, podle řetězce, který tvoří součást jména parametru, parametry pouze s číselnými hodnotami apod.).
  3. Napište a vyzkoušejte program realizující kalkulačku (použijte funkci eval). V případě, že vznikla chyba při vyhodnocení výrazu, vypište ji bez ukončení programu.
    print "Zadejte vyraz: ";
    while (my $vyraz = <>) {
    
            $vysledek = eval $vyraz;
    
            unless ($@) {
                    print "Vysledek je: $vysledek\n";
            } else {
                    print "Chyba: $@\n";
            }
            print "Zadejte vyraz: ";
    }
    
  4. Napište uzávěrovou funkci na generování čísel, která jsou násobky pěti. Generování začne od čísla zadaného jako argument při vytváření funkce. Použijte prototyp takový, aby se funkce chovala jako unární operátor.
    sub nasobky ($) {
            my $hodnota = shift;
    
            # najdeme prvni cislo, ktere je mensi nebo rovno a delitelne 5
            $hodnota-- while $hodnota % 5;
    
            return sub {
                    $hodnota += 5;
                    return $hodnota;
            }
    }
    
    $gen = nasobky 5;
    
    $gen1 = nasobky 3;
    
    print &$gen, "\n" for 1..10; # vytiskne 10..55
    print &$gen1, "\n" for 1..10; # vytiskne 5..50