Harjoitukset 17.2.2003

Palauta vastaukset sähköpostitse luennoitsijalle ennen seuraavaa luentoa (klo 9.00, eli vastauksiaan voi vielä hioa 8-9 kertaustunnilla). Vastaus sisältää sekä lopputuloksen että sen saamiseksi tarvitut käskyt (siis ne ratkaisevat, ei muita yrityksiä ja erehdyksiä). Vastaukset mieluiten raakatekstinä (vastaan nopeammin :) ja komentorivit vastaukset mieluiten osana viestiä, skriptit (pakkaamattomina) liitteinä. Siis mieluiten.

  1. Tee ohjelma, joka lukee syötettä rivi kerrallaan. Ohjelma tulostaa annetun rivin keskellä ruutua (terminaalia), eli laittaa syöterivin ympärille tarpeeksi välilyöntejä keskittämisen mahdollistamiseksi. Oletetaan ruudun kooksi 80 merkkiä. Voit olettaa, ettei mikään syöterivi ole tuota 80:aa merkkiä pitempi. Käytä syötteenä yhdestoista.txt-tiedostoa. Tulostuksen 10 ensimmäistä rivi näyttäisivät siis seuraavilta:
                                   Yhdestoista runo
    
                      Vika on Ahtia sanoa, veitikkätä vieretellä.
    
                  Ahti poika Saarelainen, tuo on lieto Lemmin poika,
                     kasvoi koissa korkeassa luona armahan emonsa
                   laajimman lahen perällä, Kaukoniemen kainalossa.
    
                    Kaloin siinä Kauko kasvoi, Ahti ahvenin yleni.
                     Tuli mies mitä parahin, puhkesi punaverinen,
    
    Eli lasketaan tarvittavien välilyöntien määrä ja lisätään ne. Tämän pystyy tekemään printf-käskyllä, mutta silloin pitänee muistaa mitä kalvossa Muuttuja merkkijonon sisällä kerrottiin. Voi kuitenkin olla helpompaa välilyöniten tekemisestä esim. while-silmukan avulla. (Tai sitten voi oma-alotteisesti selvittää mitä Perlin x-operaattori tekee...)

  2. Tutki kurssin kotisivua. Saat HTML:n näkyviin vaikkapa käskyllä

    lynx -source http://www.ling.helsinki.fi/kit/2003k/ctl160/

    HTML:n eritasoiset otsikot ovat tageissa <h1> .. <h6>. Tee ohjelma, tulostaa annetun HTML-sivun otsikot (otsikko per rivi). Käytä aineistona kurssin kotisivua. Tiedostosta xml-cleaner.perl voi olla apua...

  3. Kahden tehtävän arvoinen tehtävä!

    Tiedosto mv_0227.TextGrid on Praatilla tehty TextGrid-tiedosto, jossa on lause-, sana- ja äännetason tietoa ääninäytteestä mv_0227.wav. Olemme kiinnostuneita vain äänteistä, joten kaiken lause- ja sanatason tiedot voi heittää heti aluksi pois. Tee ohjelma, joka kertoo pisimmän äänteen nimen ja keston. Hiljaisuuksia (#) ei oteta mukaan... xmin kertoo äänteen alkuajankohdan ja xmax äänteen loppuajankohdan. Saatat joutua käyttämään putkessa useampaa eri Perl-skriptiä/unixin käskyä... Merkkijonossa, jossa on rivinvaihtomerkkejä keskellä, .* ei oletus arvoisesti pääse rivinvaihtomerkkien yli. Ongelmaan on olemassa ratkaisu.

  4. Kahden tehtävän arvoinen tehtävä!

    Tee Perl-ohjelma, joka saa syötteenään mielivaltaisen pitkiä rivejä. Alle 61 merkkiä pitkät rivit tulostetaan sellaisenaan. Yli 60 merkkiä pitkät ja rivit jaetaan kahdeksi tai useammaksi riviksi. Kullekin riville tulee niin monta sanaa kuin 60 merkkiin mahtuu. Kaikki syöttöteksti siis tulostetaan, mutta liian pitkät rivit jaetaan useammaksi lyhyemmäksi.

    Tehtävä perustuu aikaisempina vuosina olleeseen tehtävään. Aikaisemman tehtävän vihje ei välttämättä sovi meille, koska meillä on ohjelmointia vähemmän, ja sitä paitsi mielestäni helpommallakin voisi päästä. Meidän ratkaisurunkomme voisi olla seuraavanlainen:
    while (<>) {
      while ( syötteen pituus > 60 merkkiä ) {
        # ota ensimmäiset 61 merkkiä muuttujaan x
        # poista näistä viimeinen välilyönti ja sitä seuraavat merkit
        # tulosta näin saatu merkkijono
        # poista alkuperäisestä syöterivistä äsken tulostettu osa
        # (jos x sisältää säännöllisissä lausekkeissa käytettyjä merkkejä,
        # ei s/$x//; onnistu. 
        # Ongelman voi kiertää antamalla ennen edellistä käskyä käsky 
        #  $x =~ s/././g; )
        # tämänkin voi toki tehkä substr-funktion avulla...
      }
      # tulosta jäljellä oleva syöterivi
    }
    
    
    Aineistona voi käyttää tiedostoa rivitettavaa.txt. Myös toisenlaisia ratkaisuja saa toki käyttää. Luentokalvoissa oli tehtävää vaikeuttava virhe, eli substr-funktion päättävä r-kirjain oli pudonnut matkasta esimerkissä.

nvolk@ling.helsinki.fi
Viimeksi päivitetty: Wednesday, 19-Feb-2003 12:33:48 EET