Ohjelmointi 1, syksy 2007 -- Demo 1

Tehtävät julkaistaan:
 Tiistain luennolla 11.9.2007
Palautus viimeistään:
 18.9.2007 klo 18 (ensimmäisellä kerralla tosin joustetaan, koska tekniikka on testaamatonta eikä opiskelijoiden vielä oleteta osaavan käyttääkään sitä... yritä kuitenkin aikarajaan mennessä!)
100% tehtävistä tarkoittaa:
 8 kpl tehty

Tässä demossa ennakoidaan tulevaa. Ensimmäinen demotilaisuus tulee olemaan ohjaustyyppinen, ja siellä opetellaan käytännön toimia vielä kädestä pitäen läpi. Ensimmäisellä kerralla joustetaan myös palautuskäytännön suhteen; tarkoitus on oppia mm. demojen palauttaminen viimeistään tilaisuudessa. Seuraavasta demosta alkaen on palautettava sähköisesti määräaikaan mennessä.

Contents

Tietokoneen käyttöä

Tämän osion tehtävät ovat äärimmäisen pakollisia, ja ne tulee tehdä joko itsenäisesti tai viimeistään demotilaisuudessa ohjatusti. Jatkossa kaikki perustuu siihen, että tietokoneen peruskäyttötaito on hallussa!

Tallenna kukin tämän demon tehtävä yhteen järkevästi nimeämääsi tiedostoon, jonka tarkenne eli tiedoston nimen loppuosa on .txt (poikkeuksellisesti myös tehtävä 6b, vaikka siinä on Java-ohjelma; jatkossa Java-ohjelmien tulee olla täysin toimivia ja siksi myös niiden nimen on oltava käytänteiden mukainen eli mallia OhjelmanNimi.java). Tallenna kaikki tiedostot näitä demoja varten tekemääsi hakemistoon (esimerkiksi U:\ohj1\demo1). Jatkossa tallenna aina yhden demon tiedostot kyseisen demon omaan hakemistoon. Ohjelmoinnissa ylipäätään on syytä pitää yllä järjestelmällistä hakemistorakennetta.

Tehtävä 1:

Tee tietokoneellesi (tai Agoran mikroluokassa U:-asemallesi) hakemisto Ohjelmointi 1:n demovastauksia varten; nimeä se järkevästi, esim. ohj1. Tee alihakemisto näitä ensimmäisiä demoja varten, esimerkiksi demo1. Tee valmiiksi rinnakkainen hakemisto seuraavia varten eli demo2.

Demotilaisuudessa ohjaaja tarkistaa, että hakemistot ovat OK. Siellä on viimeinen hetki kysyä, miten hakemistoja tai tekstitiedostoja tehdään! (En uskalla olettaa asiaa esitietona, mutta tiedoston ja hakemiston olemus on ehdottomasti Ohjelmointi 1 -kurssin alussa opittavaa sisältöä!)

Koko loppukurssin demot ovatkin sitten tekstitiedostojen tekemistä! Ja ohjelman koodaus on sitä samaa koko näköpiirissä olevan tulevaisuuden ajan. Toistetaan tärkein: Ohjelman koodaus on aina (mahdollisimman laadukkaiden) tekstitiedostojen tekemistä. Ne sijaitsevat tiedostojärjestelmässä aina jossakin hakemistossa.

Tehtävä 2:

Kirjoita tekstitiedosto, jossa esittelet itsesi kurssikavereillesi ja kerrot, mitä odotat Ohjelmointi 1 -kurssilta. Tässä pitää olla vähintään 150 ja korkeintaan 400 sanaa. Muoto on tärkein: Jokainen rivi saa sisältää korkeintaan 80 merkkiä ja kappaleiden välissä on oltava tyhjä rivi! Laita alkuun naseva otsikko, joka erottuu muusta tekstistä selvästi.

Jotain tämän kaltaista tulisi tekstitiedostojen olla aina. Usein kannattaa olla jopa vielä lyhyempiä rivejä kuin maksimissaan 80 merkkiä.

Tehtävä 3:

Ota sekuntikellolla aika, kauanko juuri sinulla menee alla olevien ohjeiden mukaisen tekstitiedoston kirjoittamiseen. Ei saa huijata! Tämä on leikkimielinen mutta sitäkin vakavampi kilpailu.

Kun olet ensin sisäistänyt kaikki ohjeet, aloita tyhjästä tiedostosta ja käytä ainoastaan valitsemaasi tekstieditoria ja omia käsiäsi. (Tekstieditori on esimerkiksi ConTEXT. Mikään Word tai muu "Office"-tyyppinen ohjelma ei ole tekstieditori). Kaikki editorin ominaisuudet ovat tietysti käytössä (eli leikkaa-liimaa, etsi-ja-muokkaa ja vastaavat kumppanit). Aloita ajanotto siitä, kun kirjoitat ensimmäisen merkin, ja lopeta siihen kun viimeinen merkki on kirjoitettu. Sisällön tulee olla:

  • Alussa eli ihan ensiksi tasan sata riviä, joilla jokaisella lukee:

    Harjoittelen tekstitiedoston tekemistä!
    
  • Sen jälkeen tasan yksi rivi, jossa on tasan 80 kpl miinusmerkkiä '-' eikä mitään muuta, ei välilyöntejä, ei mitään...

  • Sitten neljäkymmentä riviä, joissa on luvut ykkösestä neljäänkymmeneen siten että jokaisella rivillä on yksi luku. Näin alkaisi se pätkä:

    1
    2
    3
    

    ... ja näin se päättyisi:

    39
    40
    
  • Loppuun pitää tulla taas sellainen rivi, jossa on tasan 80 kpl miinusmerkkiä.

  • Mitään muita rivejä tai tyhjiä rivejä ei saa olla.

Pysäytä ajanotto. Jälkeenpäin kirjoita vielä tiedoston loppuun (uudeksi viimeiseksi riviksi heti miinusmerkkirivin perään), kauanko sinulta meni. Ajan tulee olla muotoa mm:ss missä mm on minuuttien määrä ja ss on sekuntien määrä. Tässä on vastaustiedostosi tähän tehtävään. Muista tallentaa ja nimetä järkevästi. Tulos antaa itsellesi suuntaa nykyisestä tehokkuudestasi tekstin tuottajana suhteessa kurssikavereihin. Esim. Ohjelmointi 1 -kurssin lopussa voi tehdä testin uudelleen, ja kokeilla onko tapahtunut kehitystä.

(Mulla meni 01:37, joten tässä ei varmaan kellään mene kovin kauaa. Jälkeenpäin muistin pari lempparieditorini ominaisuutta, joita käyttäen tuli 01:04 -- mutta vain ensimmäinen tulos lasketaan!)

Työkaluihin tutustuminen

Tehtävä 4:

Varmista, että sinulla on jossakin käytössäsi minimityökalut Ohjelmointi 1:n suorittamiseen, ja että osaat käyttää niitä:

  • Järkevä tekstieditori
  • Java 5 SDK (tai uudempi; nimenomaan SDK)
  • Komentotulkki
  • Internet-yhteys
  • SSH-pääteyhteysohjelma (esim. PuTTY; demonpalautusjärjestelmämme tullee edellyttämään SSH-yhteyden ottamista)

Agoran mikroluokissa nämä löytyvät valmiina. Kotikoneisiin ne on saatavilla netistä, mutta niiden asentamista ei paljonkaan pystytä henkilökohtaisesti opastamaan. Kysy kaverilta ja/tai opiskele!

Kotoa käsin toimiminen edellyttää pidemmän päälle SDK:n asentamista!. Ihan alkuun voi hätätilassa tulla toimeen pelkästään SSH-pääteyhteysohjelmalla, jos editoi tiedostojaan suoraan yliopiston palvelinkoneella vaikkapa helppokäyttöisellä (mutta erittäin rajoittuneella) tekstieditorilla nimeltä nano. Ohjeet tähänkin julkaistaan ensimmäisen kurssiviikon aikana.

Kokeile käytännössä:

Syntaksi eli kielioppi

Ennakoivia tehtäviä. Aiempaa osaamista ei tarvita!

Tehtävä 5:

Ohjelman tekeminen edellyttää aina jonkun kieliopin noudattamista. Alla on pari kieliopillisesti ja muutenkin hieman väärää "ohjelmaa" kielillä, joita kaikkia et ehkä ole vielä edes nähnyt. Enempää tietoa etsimättä, arvaa säännöt, joita uskoaksesi on rikottu, ja korjaa tekstipätkät kieliopillisesti oikeiksi:

a):

f(x) = (2x + 1) / (x - 1

b):

(defun factorial (n)
  (if (= n 1)
     1
     (* n (factorial (- n 1)))
)

c):

% Kielioppiluennon aloituskalvo:
\begin{itemize}
\begin{slide}{Syntaksi eli kielioppi}
     \item Miksi kielioppi on tärkeää ohjelmoinnissa
     \item Mitä tarkoittaa formaali kielioppi
     \item Millainen on Javan syntaksi
  \end{itemize}
\end{slide}

d):

Ohjelmointi 1 -kurssin suorittaminen edellyttävät demojen,
harjoitustyöhön ja tentin tekeminen Kurssin. pisteytys perustuu
tehtyjen demon määrään ja tentistä saatuihin pisteeseen.

e):

"Terrifying are the attent sleek thrushes on the lawn" is a
lines from a poem Ted Hughes by. It an example used in plenty of
english laguage textbook is.

Huvin vuoksi: Pohdi eroja näiden kielten välillä. Voitko korjata ne monella eri tapaa syntaksin mukaisiksi, mutta eri merkityksisiksi?

Ohjelman muokkaaminen

(Viimeinen kerta, kun saat törkkiä ohjelmakoodia ilman että välttämättä ymmärrät siitä yhtään mitään. Ota ilo irti...)

Tehtävä 6:

Ennen kuin kurssilla on puhuttu itse ohjelmoinnista yhtään mitään, arvaa miten seuraavat muutokset tehtäisiin, ja muuta ohjelmia sillä tavoin. Voit kokeilla kääntää ja ajaa b-kohdan ohjelmaa kuten tehtävässä 4, vaikkei se liene välttämätöntä tämän tehtävän tekemiseksi. Kääntämiseen ja ajamiseen kannattaisi kuitenkin saada rutiinia, joten suosittelen jo kokeilemista.

  1. Muuta seuraava ohjelmanpätkä tulostamaan "Jippii" kaksikymmentä kertaa eikä vain kymmenen:

    ...
    for (int laskuri=1; laskuri <= 10; laskuri++){
        System.out.println("Jippii");
    }
    ...
    
  2. Muuta seuraava ohjelma kysymään vielä kolmas luku ja laskemaan sekin summaan:

    /* Oikeasti pitäisi aina olla peruskommentit,
     * mutta tehtäväpaperi on muutenkin jo kovin pitkä...
     */
    import java.util.Scanner;
    public class Summaaja{
        /** Kysyy käyttäjältä kaksi lukua ja tulostaa summan. */
        public static void main(String[] args){
            Scanner lukija = new Scanner(System.in);
            System.out.println("Anna kokonaisluku");
            int luku1 = lukija.nextInt();
            System.out.println("Anna toinen kokonaisluku");
            int luku2 = lukija.nextInt();
            int tulos = luku1 + luku2;
            System.out.printf("Antamiesi lukujen summa on %d\n", tulos);
        }
    }
    

    Jotta ohjelman voi kääntää, sen tiedostonimen pitää olla täsmälleen Summaaja.java.

Tiedon esitysmuodoista

Tehtävä 7:

Voi voi. Juhalta on mennyt USB-tikku rikki. Tikulla on vain pieniä tiedonsirpaleita eikä mitään tietoa, mikä sirpale kuuluu mihinkin. Siellä oli paljon MP3-tiedostoja ja kaikkea turhaa... Juha tietää, että yhdessä elintärkeässä tiedostossa hänellä luki selväkielinen teksti isoilla kirjaimilla. Alla oleva bittijono näyttää lupaavalta, mutta mikä teksti siihen on tallennettu:

01000111  01010010  01000001  01000100  01010101  01001110
00100000  01001010  01001111  01001000  01000100  01000001
01001110  01010100  01001001

Helpotetaan; seuraavassa on samat tavun mittaiset jonot 10-järjestelmän lukuina, ja malliksi on yksi luku muutettu ymmärrettäväksi kirjaimeksi alla olevan taulukon mukaan:

71  82  65  68  85  78  32  74  79  72  68  65  78  84  73
        =A

Tehtävät:

  1. Tulkitse kaikki muutkin merkit. Mikä teksti tuohon kohtaan USB-tikun muistia on tallentunut?
  2. Montako millimetriä Juha on painanut ohi yhdestä näppäimestä? Hänellä on samanlainen näppäimistö kuin sinulla.

Juha tietää, että hänen käyttämässään tiedostomuodossa merkeille on sovittu seuraavat koodit:

Desimaaliluku Binäärilukuna Vastaa merkkiä
32 00100000 [välilyönti]
33 00100001 !
46 00101110 .
65 01000001 A
66 01000010 B
67 01000011 C
68 01000100 D
69 01000101 E
70 01000110 F
71 01000111 G
72 01001000 H
73 01001001 I
74 01001010 J
75 01001011 K
76 01001100 L
77 01001101 M
78 01001110 N
79 01001111 O
80 01010000 P
81 01010001 Q
82 01010010 R
83 01010011 S
84 01010100 T
85 01010101 U
86 01010110 V
87 01010111 W
88 01011000 X
89 01011001 Y
90 01011010 Z

Ennakoivasti algoritmeista

Tehtävä 8:

Kirjoita suomen kielellä yksityiskohtainen ohje, joka kertoo kuinka kuljetaan jalan Jyväskylän Matkakeskukselta Agoraan. Ohjeen tulee olla riittävä, vaikka seuraava pätisi:

  • ohjeistettava henkilö ei tiedä Jyväskylästä mitään, edes katujen nimiä.
  • näkyvyys ulkoilmassa on sumun takia vain 50 metriä katselupisteestä
  • vastaan ei tule ketään, jolta voisi kysyä yhtään mitään; kännykästäkin on akku loppu. Ainoa tieto on kirjoittamasi ohje.

(Tietokoneohjelman kirjoittaminen on vähän niinkuin selittäisi paljon normaali-ihmistä tyhmemmälle otukselle, miten joku asia pitää hoitaa...)