Perl - cvičení 4

  1. Napište program, který z CSV souboru, který obsahuje čárkami oddělená čísla (na každém řádku je stejný počet čísel) vypočítá požadovanou hodnotu. Jako parametr programu (jsou dostupné v poli @ARGV) je zadáno číslo sloupce (počítáno od 1) a typ hodnoty, která se má pro daný sloupec vypočítat (1 = průměr, 2 = minimum, 3 = maximum).
  2. V hashi %osoby = ('Novak' => 50, 'Dvorak' => 30, 'Novotny' => 40, 'Kucera' => 40, 'Maly' => 60) jsou informace o příjmeních a věku osob. Vypište:
  3. Napište program, který v zadaném adresáři vyhledá soubory zadaného jména bez uvažování jejich typu (např. pro jméno data budou nalezeny soubory data.txt a data.csv).
  4. Definujte podprogram soucin, která vypočítá součin z hodnot zadaných jako parametry. Pokud je některý z parametrů 0, není potřeba dále násobit.
  5. Definujte podprogram, který vrátí extrémní hodnotu ze zadaného seznamu na základě hodnoty prvního parametru. Pokud je první parametr 1, vrátí se maximum, pokud je -1, vrátí se minimum. Použijte standardní funkci sort.
    
    sub extrem {
      if ($_[0] == 1) {
            return +(sort @_[1..$#_])[-1]
      } elsif ($_[0] == -1) {
            return ((sort @_[1..$#_])[0])
      } else {
            die "špatně zadán typ požadované hodnoty\n";
      }
    }
    
    # nebo
    
    sub extrem {
      my $co = shift;
      if ($co == 1) {
            return +(sort @_)[0]
      } elsif ($co == -1) {
            return +(sort @_)[-1]
      } else {
         die "špatně zadán typ požadované hodnoty\n";
      }
    }
    
  6. Definujte podprogram, který v zadaném poli z prvků na zadaných pozicích vypočítá součet, aritmetický průměr nebo najde maximální hodnotu. Všechny tyto údaje jsou zadané jako parametry, na jejich pořadí nezáleží, ale podprogram musí ohlídat, še jsou zadány všechny.
    sub f {
       my %arg = @_;
       unless (exists $arg{-hodnoty} and @{$arg{-hodnoty}}
            and exists $arg{-pozice} and @{$arg{-pozice}}
            and exists $arg{-co} and (lc $arg{-co} eq 'prumer' or
            lc $arg{-co} eq 'max')) {
            die "nejsou zadany vsechny parametry";
       }
       if (lc $arg{-co} eq 'prumer') {
            return +(eval join '+', @{$arg{-hodnoty}}[@{$arg{-pozice}}])
                    /
                    @{$arg{-pozice}};
       } else {
            return +(sort @{$arg{-hodnoty}}[@{$arg{-pozice}}])[-1]
       }
    }
    @h = (1..10); @p = (1,3, 8);
    print f -hodnoty => \@h, -pozice => \@p, -co => 'max';
    print f  -co => 'PRUMER', -pozice => \@p, -hodnoty => \@h;
    
    
  7. Načítejte řádky ze standardního vstupu (na každém řádku jedno číslo) a vypište aritmetický průměr těchto čísel.
    while (<>) {
            $soucet += $_;
            $pocet++;
    }
    print "Aritmeticky prumer je ", $soucet/$pocet, "\n";
    
  8. Načítejte dvojice čísel oddělených mezerou ze standardního vstupu (použijte funkci split / /, VYRAZ), v pžípadě, že jsou obě čísla nezáporná a druhé není nula, vypište podíl těchto čísel. Použijte příkaz pro řízení cyklu.
    while (<>) {
            chomp;
            ($x, $y) = split / /;
            unless ($y) {
                    warn "Druhe cislo je nula\n";
                    next;
            }
            if ($x >= 0 and $y > 0) {
                    print "Podil $x / $y je ", $x/$y, "\n";
            } else {
                    warn "Nektere cislo se zaporne\n";
            }
    }
    
  9. Napište program na hádání čísla. Minimální číslo je 0, maximilní číslo je zadáno na standardním vstupu. Mezi nimi leží hledané náhodné číslo (vybereme pomocí int rand <MAX> + 1 ). Potom vypište zadejte číslo mezi a a čekejte na zadání hodnoty uživatelem. Pak rozhodněte, zda je zadané číslo menší než hledané, pak vypište "Hledané číslo je menší" a "Zadejte číslo mezi a ". V opačném případě vypište "Hledané číslo je větší" a "Zadejte číslo mezi a ".
    # pocet pokusu potrebnych k nalezeni cisla
    $pokusu = 0;
    
    # minimalni cislo je na zacatku 0
    $min = 0;
    
    # nacteme maximalni cislo
    print "Zadejte maximalni mozne cislo: ";
    chomp($max = <>);
    
    # vygenerujeme si hledane cislo mezi $min a $max
    $cislo = int (rand($max) + 1);
    
    while ($zadane != $cislo) {
            # dokud se uzivatel netrefi, nacitame od nej hodnoty
    
            print "Zadejte cislo mezi $min a $max: ";
            chomp($zadane = <>);
    
            # hodnotu nacitame tak dlouho, nez cislo bude mezi $min a $max
            while ($zadane > $max or $zadane < $min) {
                    print "Zadali jste spatne cislo, melo byt mezi $min a $max,
    zadali jste $zadano. Zkuste to znova: ";
                    chomp($zadane = <>);
            }
    
            # zvysime pocet pokusu
            $pokusu++;
    
            # porovname zadane cislo s hledanym a pripadne upravime dolni nebo
            # horni hranici
            if ($zadane == $cislo) {
                    print "Trefa, hledane cislo bylo $cislo, potrebovali jste
    $pokusu pokusu\n";
            } elsif ($zadane > $cislo) {
                    print "Vase cislo je vetsi nez hledane\n";
                    $max = $zadane;
            } else {
                    print "Vase cislo je mensi nez hledane\n";
                    $min = $zadane;
            }
    }