9/20: Puhu mun stdinille

Samankaltaiset tiedostot
12/20: Bitit talteen

8/20: Luokat, oliot ja APIt

5/20: Algoritmirakenteita III

4/20: Algoritmirakenteita II

7/20: Paketti kasassa ensimmäistä kertaa

3/20: Algoritmirakenteita I

12. Näppäimistöltä lukeminen 12.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmointi 1 / syksy /20: IDE

8. Näppäimistöltä lukeminen 8.1

13/20: Kierrätys kannattaa koodaamisessakin

6/20: Tietorakenteita

Ohjelmoinnin perusteet Y Python

8. Näppäimistöltä lukeminen 8.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

11/20: Konepelti auki

14. Poikkeukset 14.1

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

14. Poikkeukset 14.1

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Poikkeustenkäsittely

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

19/20: Ikkuna olio-ohjelmoinnin maailmaan

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

17/20: Keittokirja IV

Metodien tekeminen Javalla

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Binäärioperaatiot Tiedostot ja I/O

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Java-API, rajapinnat, poikkeukset, UML,...

Java kahdessa tunnissa. Jyry Suvilehto

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Mitä poikkeuskäsittely tarkoittaa?

Ohjelmoinnin perusteet Y Python

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

20. Javan omat luokat 20.1

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Java-kielen perusteet

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

Mieleni minun tekevi (tavoiteasettelua)

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmointi 2 / 2010 Välikoe / 26.3

Luokat ja oliot. Ville Sundberg

Ohjelmoinnin jatkokurssi, kurssikoe

Taulukot. Jukka Harju, Jukka Juslin

7. Oliot ja viitteet 7.1

17. Javan omat luokat 17.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteet

Binäärioperaatiot Tiedostot ja I/O

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmoinnin perusteet Y Python

Harjoitus 3 (viikko 39)

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Lyhyt kertaus osoittimista

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

Harjoitus 5 (viikko 48)

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

Moduli 5: Kehittyneitä piirteitä

Olio-ohjelmointi Javalla

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmoinnin perusteet, syksy 2006

ITKP102 Ohjelmointi 1 (6 op)

17. Javan omat luokat 17.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Harjoitus 6 (viikko 42)

7. Näytölle tulostaminen 7.1

ITKP102 Ohjelmointi 1, syksy 2007

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

14/20: Keittokirja I

Ohjelmoinnin peruskurssi Y1

Olio-ohjelmointi Virhetilanteiden käsittely

Kielioppia: toisin kuin Javassa

Listarakenne (ArrayList-luokka)

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1, syksy 2007

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

ITKP102 Ohjelmointi 1, syksy 2007

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Transkriptio:

Ohjelmointi 1 / syksy 2007 9/20: Puhu mun stdinille Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/12

Tällä luennolla Lisää APIa: StringBuilder on muuttuvainen merkkijono. Kohti interaktiivisia ohjelmia... mitä ongelmia? Ohjelman kommunikointi ulkomaailman, esim. konsolin, kanssa. Standardisyöte ja -tuloste. System.in ja System.out. InputStream ja PrintStream -luokat. Mitä sinne syötteeseen oikein tulee? Tietovirran käsite. Scanner -luokka. Poikkeukset ja niiden käsittely. Konsolisyötteen kunnollinen lukeminen, tarkistaminen ja muuntaminen tarvittuun esitysmuotoon. Integer, Double, Character ym. luokat. Ohjelmointi 1 / syksy 2007 p.2/12

Lisää esimerkkejä Javan APIstaa: StringBuilder String -olion arvo ei voi muuttua olion luonnin jälkeen. Sanotaan, että String on luokkana muuttumaton ( immutable, kykenemätön mutatoimaan eli sen sisäinen tila on aina sama) StringBuilder puolestaan on muuttuvainen ( mutable, kykenevä mutatoimaan ) merkkijono. Eli siis sen rajapinnassa on metodeja sisällön muuttamiseen. Katsotaan APIa ja mahdollisuuksia jono-olion muuntamiseen. StringBuffer on samanlainen kuin StringBuilder (sitä tulee käyttää tilanteesta, jossa StringBuilder voi aiheuttaa synkronointiongelman yhdenaikaisohjelmoinnissa; ei ole Ohjelmointi 1:n asiaa, joten käytämme StringBuilderia). Aiempien Java-versioiden esimerkit käyttävät StringBufferia; kaikki mikä sillä toimii, toimii Java 6:n StringBuilderilla. Ohjelmointi 1 / syksy 2007 p.3/12

Merkkien ja merkkijonojen yhteenliittämisestä Esimerkkiohjelma: alleviivauksen tulostaminen. Toteutetaan Stringeillä ja plus-operaattorilla; mikä on suoritusaika merkkijonojen yhdistämisessä? Toteutetaan StringBuilderilla ja append-metodilla; mikä on suoritusaika merkkijonojen yhdistämisessä? Havaittaneen dramaattinen ero, joka johtuu konepellin alla tapahtuvista olioiden luonneista. Ohjelmointi 1 / syksy 2007 p.4/12

Kohti interaktiivisia ohjelmia Katsotaan aiempia demoista tuttuja esimerkkejä. Mitä tapahtuu, jos kokonaisluvuksi syötetään kilpikonna?... pitänee tutustua poikkeuksiin ( exceptions ) ja niiden käsittelyyn. Scanner-luokassa on apuja syötejonon tutkimiseen... niihin voinee tutustua myös. Mutta ensin katsotaan, miten konsolisyöte ilmenee ruohonjuuritasolla: Tietovirrat ja erityisesti syöttövirta. Ohjelmointi 1 / syksy 2007 p.5/12

Muistellaan vielä mustaa laatikkoa luukku auki String[] args on jo vanha tuttu ; virtuaalikone siirtää sen avulla sovellukselle argumenttilistan, joka tuli käyttöjärjestelmältä virtuaalikoneen käynnistyksessä. System.in on InputStream -luokan olio, jonka kautta virtuaalikone välittää sovellukselle 8-bittisistä tavuista koostuvan syötejonon. Sovellus ei voi ennakoida vauhtia, jolla tavut virtaavat sisään. System.out on PrintStream -luokan olio, joka käyttää apunaan jotain alkeellisempaa OutputStreamia ja jonka kautta virtuaalikone välittää sovelluksen tulosteet allaan olevalle käyttöjärjestelmälle. System.err samoin. Interaktiivisen Java-sovelluksen tekijän tarvitsee osata käyttää System.outin APIa (Osaamme jo! Siellä on mm. kätevä printf-metodi) ja System.iniä esim. luokan Scanner APIn avulla. Ohjelmointi 1 / syksy 2007 p.6/12

Tietovirta abstrahoi daattaputken pään Mitä ovat tietovirrat (oliomallina): Tietovirta on abstraktio, kuten olioluokat aina. Se on malli. Olioajattelua: Syöttövirta on erilainen kuin tulostusvirta. Syöttö- ja tulostusvirtoja voi luokitella täsmällisemmin (kuten Javan luokkakirjastossa on tehty) mutta ne kaikki ovat virtoja. Sellaisesta voi tehdä olion! Syöttövirtaolio kuvaa jostakin tulevaa bittivirtaa. Se on putken pää, josta voi noukkia aina seuraavan paketin bittejä käyttöön. Jostakin ne tulevat. Tulostusvirtaolio kuvaa johonkin menevää bittivirtaa. Se on putken pää, johon voi laittaa aina seuraavan paketin bittejä. Johonkin ne menevät. Olioista muodostuu verkosto, esim. Lukija joka lukee Syöttövirtaa ja koettaa tunnistaa sieltä tekstirivejä, kokonaislukuja, liukulukuja... Tai OhjelmakoodinLukija joka koettaa lukea virrasta Java-lähdekoodia... Abstrahoinnin ilo tässä tapauksessa: Soveltajan kannalta on ihan sama, mistä virta tulee tai mihin se menee (konsoli, tiedosto, Internet-yhteys, peliohjain, printteri... ) Olio-ohjelmointi on olioiden luomista, yhdistelemistä verkostoksi, ja aina käyttötarkoitukseen sopivimman luokan olioiden käyttämistä sovelluksessa. (Jos ei kätevää luokkaa vielä ole, sen voipi joutua tekemään itse.) Ohjelmointi 1 / syksy 2007 p.7/12

Syötejono on siis tavuja. Mitä niissä tavuissa on? Käyttäjästä kannattaa yleisesti ottaen olettaa: Hän ei osaa mitään. Hän ei ehdi tai halua opetella. Jos hän turhautuu, hän lähtee pois. Hän on pahantahtoinen ja valtaa välittömästi käyttöönsä järjestelmän, jossa on tietoturva-aukko. Tai vähintään rikkoo sen, jos pystyy. Johtopäätöksenä... syötettä oikein lukeva ohjelma: Varautuu kaikkeen erityisesti pahimpaan. Tarkistaa syötteen. Ilmoittaa väärästä syötteestä kärsivällisesti ja tarkasti, ohjeita antaen. (Kriittisissä sovelluksissa tekee myös temppuja kuten kirjaa erikoiset syötteet lokiin tai varoittaa ylläpitäjiä) Ohjelmointi 1 / syksy 2007 p.8/12

Konsolisyötteen lukeminen: yritteitä Kokeillaan erityyppisiä syötteitä lukevia ohjelmia ja katsotaan, millaiselta ongelmat voivat näyttää. Ohjelmointi 1 / syksy 2007 p.9/12

Konsolisyötteen kunnollinen lukeminen Toimiva periaate: Annetaan käyttäjälle kehote (tuttua: tulostus) Luetaan kokonainen rivi (tuttua: Scannerin getline) Tulkitaan rivi halutun syötetyypin mukaan (uutta) Jos ei ole kunnollinen, annetaan opastava ilmoitus Jatketaan em. toimintaa kunnes käyttäjä syöttää hyväksytyn syötteen. Käyttäjän syötteen kanssa pitää olla varuillaan, olipa ohjelmointityökalu mikä tahansa. Java kuitenkin jonkun verran helpottaa tietoturvaa. Jopa niin ettei asiaa tarvitse pahemmin käsitellä Ohjelmointi 1:llä, mikä on hyvä puoli. Huono puoli: Jos Ohjelmointi 1:n tiedoilla lähdet ohjelmoimaan esim. C-kielellä, siellä on vaaranpaikkoja joista et ole koskaan kuullutkaan... Ohjelmointi 1 / syksy 2007 p.10/12

Merkkijonon muunto primitiiviksi Ns. kääreluokat auttavat Jokaista primitiivityyppiä kohden on olemassa yksi luokka (char Character, int Integer, double Double,... ) katsotaan APIa. Kääremerkitys tulee muissa yhteyksissä eteen Nyt kiinnostaa aliohjelmat (eli staattiset metodit) joilla muunnetaan merkkijonona esitetty numerosarja primitiivityyppiseksi lukuarvoksi. Tarvitaan välttämättä poikkeusten käsittelyä! (Aiemminkin olisi voitu käyttää, mutta ei ollut pakko... ) Ohjelmointi 1 / syksy 2007 p.11/12

Poikkeusten käsittely Suoritus: Aliohjelmat voivat ns. heittää poikkeuksen, mikäli tulee joku ns. poikkeava tilanne. Poikkeus on olio. throw -lauseen suorituksessa kontrolli hyppää aliohjelmien kutsupinossa taaksepäin niin kauas kunnes joku kutsuja on varautunut koppaamaan heitetynlaisia poikkeuksia. Varautuminen tapahtuu try-catch-finally -rakenteella. Vilahti lyhyesti luennolla 5. Nyt nähdään käytännön sovellus. Toistaiseksi riittää ymmärtää, että jos metodin määrittelyssä on throws Jotakin niin Jotakin pitää varautua nappaamaan. Statement Block : Expression assert Expression ; else Statement if ParExpression Statement for ( ForControl ) Statement while ParExpression Statement do Statement while ParExpression ; try Block Catches Catches finally Block switch ParExpression { SwitchBlockStatementGroups } synchronized ParExpression Block Expression return ; throw Expression ; Identifier break Identifier continue ; StatementExpression ; Identifier : Statement Ohjelmointi 1 / syksy 2007 p.12/12