Java-kielen perusteita Käyttäjän kanssa keskusteleva ohjelma 1
Kirjoittaminen konsolinäkymään //Java ohjelma, joka tulostaa konsoli-ikkunaan public class HeiMaailma { public void aja() { // kirjoitus ja rivinvaihto System.out.println("Hei maailma"); } public static void main(string[] args) { HeiMaailma ohjelma = new HeiMaailma(); ohjelma.aja(); } } 2
Kirjoittaminen konsolinäkymään, jatkuu.. HeiMaailma -ohjelma tulostaa tekstin Hei Maailma Eclipsen Consolekansioon: 3
Muotoiltu tulostus (5.4.3) Java-kielen versioon 5.0:ssa lisättiin printf-tulostusmetodi: public PrintStream printf( String format,tulostettava_tieto) Metodin avulla voidaan tulostaminen muokata tiettyyn muotoon Esim. double luku = 3.7890; // Varataan 5 merkin levyinen kenttä, tulostetaan kahdella // desimaalilla ja rivinvaihto System.out.printf( luku=%5.2f%n,luku); tulostaa: luku= 3,79 4
%konversio %d, lisää kokonaislukuna %f, lisää desimaalilukuna %c, lisää merkkinä %s, lisää merkkijonona %%, lisää %-merkin %n, lisää rivinvaihdon Esim. int kluku = 78; System.out.printf( "1) %8d%n", kluku); // kenttä 8 merkkiä 1) 78 double dluku = -45.67789; System.out.printf( "2) %9.3f%n", dluku); // kenttä 9 merkkiä 3 desim. 2) -45,678 5 Ohjelmointi - Irene Vilpponen, Seija Lahtinen
Hienosäätöä, flag -, tasaa vasempaan laitaan +, lisää aina etumerkin välilyönti, lisää positiivisilla luvuilla alkuun välilyönnin 0, lisää etunollat,, käytetään ryhmittelyä Esim. double dluku = -45.67789; System.out.printf( "3) %-8.3f%n", dluku); 3) -45,678 long lluku= 1234567890; System.out.printf( "4) %,d%n", lluku); 4) 1 234 567 890 6
double pos = 3.45678; double neg = -234.7890; double iso = 345678.456; // desimaaliluku System.out.printf("1) %f%n", pos); // 2 desimaalia ja 0 desimaalia System.out.printf("2) %.2f%n",pos); System.out.printf("3) %.0f%n",pos); // kentän leveys 8 desimaaleja 2 System.out.printf("4) %8.2f%n", pos); System.out.printf("4) %8.2f%n", neg); // vasen tasaus System.out.printf("5) %-8.2f%n",pos); // etumerkki System.out.printf("6) %+8.2f%n",pos); System.out.printf("7) %+8.2f%n",neg); // välilyönti System.out.printf("8) %- 8.2f%n",neg); System.out.printf("8) %- 8.2f%n",pos); // etunollat System.out.printf("9) %08.2f%n", neg); System.out.printf("9) %08.2f%n", pos); // ryhmittely System.out.printf("10) %,8.2f%n",iso); 1) 3,45678 2) 3,46 3) 3 4) 4) 3,46-234,79 5) 3,46 6) 7) +3,46-234,79 8) -234,79 8) 3,46 9) -0234,79 9) 00003,46 10) 345 678,46 7
Tiedon luku näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa näppäimistöä varten ns. syöttöpuskuri eli muistialue, johon menevät käyttäjän kuvaruudulle kirjoittamat merkit, kun käyttäjä painaa enter-näppäintä. Ohjelma saa käyttöönsä syöttöpuskurin esimerkiksi Scanner-luokan avulla. Esimerkki Ohjelma tulostaa käyttäjälle seuraavaa: Anna henkilön etunimi ja sukunimi: Käyttäjä kirjoittaa tekstin: Tarmo Manninen ja painaa enter-näppäintä syöttöpuskurin sisältö on: Tarmo Manninen\n Indeksi osoittaa kirjainta T Viimeinen merkki, \n, on rivinvaihtomerkki eli enter 8
Scanner-luokka Kun Scanner-luokkaa käytetään, se on ilmoitettava kääntäjälle ohjelmatiedoston alussa seuraavasti: import java.util.scanner;. Scanner-olion määrittely: Scanner muuttuja; muuttuja= new Scanner (System.in); tai Scanner muuttuja= new Scanner (System.in); 9
Scanner-luokka, kokonaisluvun lukeminen public int nextint() palauttaa arvonaan syöttöpuskurista seuraavana olevan kokonaisluvun nextint-metodi ohittaa kaikki tyhjät (välilyönnit, tabuloinnit ja rivinvaihdot) kunnes vastaan tulee numero tai muu merkki kuin tyhjä 1) Jos syöttöpuskurissa on seuraavana numero, metodi lukee numerot, kunnes vastaan tulee tyhjä, ja muodostaa lukemistaan numeroista kokonaisluvun, jonka palauttaa arvonaan. 2) jos syöttöpuskurissa on seuraava merkki muu kuin tyhjä tai numero, tapahtuu ajoaikainen poikkeus (virhe) 3) jos syöttöpuskuri on tyhjä tai siellä ei ole muuta kuin tyhjää, nextintmetodi ohittaa kaikki tyhjät ja jää odottamaan puskurin täyttymistä. 10
Scanner-luokka, kokonaisluvun lukeminen, jatkuu.. Esimerkki: int luku; Scanner input = new Scanner(System.in); System.out.print("Anna kokonaisluku: "); luku = input.nextint(); tulostuu: Anna kokonaisluku: 78 Muuttujan luku arvoksi tulee luku 78 11
Scanner-luokka, desimaaliluvun lukeminen public double nextdouble() ja public float nextfloat() palauttaa arvonaan syöttöpuskurista seuraavana olevan desimaaliluvun ohittaa kaikki tyhjät (välilyönnit, tabuloinnit ja rivinvaihdot) kunnes vastaan tulee numero, desimaalierotin tai muu merkki kuin tyhjä 1) jos syöttöpuskurissa on seuraavana numero, metodi lukee numerot. Jos seuraava merkki ei ole desimaalierotin vaan tyhjämerkki, metodi muodostaa luetuista numeroista desimaaliluvun, jonka palauttaa arvonaan. 2) Jos syöttöpuskurissa on numeroita ja desimaalierotin tai vain desimaalierotin, metodi lukee numerot ja erottimen ja jatkaa numeroiden lukemista, kunnes vastaan tulee tyhjä ja muodostaa lukemistaan numeroista desimaaliluvun, jonka palauttaa arvonaan. 3) Jos syöttöpuskurissa on vain desimaalierottimen, jota ei seuraa numero, tai muuta kuin tyhjää ja numeroita, tapahtuu ajoaikainen poikkeus (virhe). 4) jos syöttöpuskuri on tyhjä tai siellä ei ole muuta kuin tyhjää, metodi ohittaa kaikki tyhjät ja jää odottamaan puskurin täyttymistä 12
Scanner-luokka, desimaaliluvun lukeminen, jatkuu Esim. double luku; Scanner input = new Scanner (System.in); System.out.print( Anna desimaaliluku: ); luku = input.nextdouble(); tulostuu Anna desimaaliluku: 6,5 Muuttujan luku arvon tulee luku 6.5 13 Ohjelmointi - Irene Vilpponen, Seija Lahtinen
Scanner-luokka, desimaaliluvun lukeminen, jatkuu Kun käytettävän tietokoneen näppäimistömme on asetettu Suomen kielelle sopivaksi, desimaalierotin on desimaalipilkku, kuitenkin kun Javaohjelmasta tulostetaan desimaaliluku, se tulostuu desimaalipisteellä ristiriita. Ristiriita voidaan korjata, kutsumalla Scanner-luokan metodia: public Scanner uselocale ( Locale locale ) Esimerkki // Muutetaan desimaalierotin desimaalipisteeksi. import java.util.locale; Scanner input = new Scanner (System.in); // ota käyttöön Locale-luokka input.uselocale ( Locale.US ); 14
Scanner-luokka, desimaaliluvun lukeminen, jatkuu Esim. double dluku; System.out.print("Anna desimaaliluku desimaalipilkuin + dluku = input.nextdouble(); varustettuna:"); System.out.println( Annoit " + dluku); input.uselocale ( Locale.US ); System.out.print("Anna desimaaliluku desimaalipistein + dluku = input.nextdouble(); varustettuna:"); System.out.println( Annoit " + dluku); toiminta: Anna desimaaliluku desimaalipilkuin varustettuna:2,3 Annoit 2.3 Anna desimaaliluku desimaalipistein varustettuna:2.3 Annoit 2.3 15
Scanner-luokka, totuusarvon lukeminen public boolean nextboolean() palauttaa arvonaan totuusarvon true tai false jos syöttöpuskurissa on seuraavana sana true tai false, jota seuraa vähintään yksi tyhjä (välilyönti, tabulointi, rivinvaihto), metodi palauttaa arvonaan ko. boolean arvon, jos kuitenkin puskurissa ei ole em. arvoja tai em. sanan jälkeen ei ole tyhjää, tapahtuu ajoaikainen poikkeus (virhe). Esimerkki: boolean totuus; Scanner input = new Scanner (System.in); tulostuu: System.out.print( Kerro totuus (true/false): ); totuus = input.nextboolean(); Kerro totuus (true/false): true totuus = true 16
Scanner-luokka, sanan lukeminen public String next() palauttaa arvonaan syöttöpuskurista löytyvän ensimmäisen sanan, joka päättyy tyhjään (välilyönti, tabulointi, rivinvaihto) metodi ohittaa puskurin alusta tyhjät, kunnes löytää merkin, joka ei ole tyhjä. Tämän jälkeen se lukee merkkejä, kunnes vastaan tulee tyhjä, jota se ei lue, eli syöttöpuskurin indeksi jää osoittamaan luetusta sanasta seuraavaa tyhjää merkkiä. Esim. String sana; Scanner input = new Scanner (System.in); System.out.print( Anna sana: ); sana = input.next(); tulostuu: Anna sana: kissa istui puussa muuttujan sana arvoksi tulee sana kissa 17
Scanner-luokka, rivin lukeminen public String nextline() palauttaa arvonaan syöttöpuskurin koko sisällön metodi lukee merkkejä syöttöpuskurin indeksistä alkaen rivinvaihtomerkkiin saakka ja sijoittaa lukemansa String-olioon, jonka palauttaa arvonaan. metodi lukee rivinvaihtomerkin, mutta ei vie sitä String-olioon. 18
Scanner-luokka, rivin lukeminen, jatkuu Esimerkki: String rivi; Scanner input = new Scanner (System.in); System.out.print( Anna lause: ); rivi = input.nextline(); Tulostuu: Ohjelma tulostaa: Anna Lause: Käyttäjä kirjoittaa: Tama on lause, joka sisaltaa valilyonteja. Muuttujan rivi arvoksi tulee Tama on lause, joka sisaltaa valilyonteja. 19
Scanner-luokka, syöttöpuskurin tutkiminen ilman lukemista public boolean hasnextint() tutkii, onko seuraava luettava kokonaisluku, ja palauttaa arvonaan true-arvon, jos on public boolean hasnextdouble() public boolean hasnextfloat() tutkii, onko seuraava luettava desimaaliluku, ja palauttaa arvonaan true-arvon, jos on 20
Scanner-luokka, syöttöpuskurin tutkiminen ilman lukemista, jatkuu public boolean hasnextboolean() tutkii, onko seuraava luettava boolean arvo true tai false, ja palauttaa arvonaan true-arvon, jos on public boolean hasnextline() tutkii, onko syöttöpuskurissa merkkijono, joka päättyy rivinvaihtomerkkiin, ja palauttaa arvonaan true-arvon, jos on 21
Harjoitus Tee ohjelmaluokka LukemisHarjoitus, joka pyytää ensin kokonaisluvun, sitten lukee ja tulostaa sen. Seuraavaksi ohjelma pyytää sanan, lukee sen ja tulostaa sen. Tämän jälkeen ohjelma pyytää desimaaliluvun, lukee sen ja tulostaa sen. Lopuksi ohjelma pyytää rivin tekstiä, lukee sen ja tulostaa. 22 Ohjelmointi - Irene Vilpponen, Seija Lahtinen