3.Laadi vuorovaikutteinen eli keskusteleva sovellus, jolla voi muuntaa rahamääriä Suomen markoista johonkin toiseen valuuttaan (kaava:tulos = kurssi * markkamäärä). Ohjelma pyytää ensin valuuttakurssin ja vieraan valuutan nimen. Sen jälkeen sillä voi laskea useita muunnoksia markoista vieraaseen valuuttaan. Ohjelma tarkistaa numeeristen syöttötietojensa järkevyyden ja valittaa virheistä. Tuloksensa ohjelma ilmoittaa selkeästi. Suunnittele ohjelman lopettamisen tapa. (5 pistettä) Tehtävässä pyydettiin tekemään vuorovaikutteinen sovellus, jolle käyttäjä voi antaa vieraan valuutan nimen ja kurssin, ja muuntaa tämän jälkeen useita markkamääriä annettuun valuuttaan. Arvostelussa keskityttiin tietysti arvioimaan ohjelmoinnin "perustyökalujen" l. toistorakenteiden ja ehtolausekkeiden hallintaa, mutta lisäksi kiinnitettiin huomiota vuorovaikutteisen ohjelman toteutukseen liittyviin asioihin: * Selkeä keskustelu ohjelman ja käyttäjän välillä. * Syöttöarvojen tarkistus, ja ohjelman reagointi virheellisiin arvoihin * Ohjelman lopettaminen. Ohjelmassahan käyttäjä voi muuntaa useita markkamääriä, ja lopettaa halutessaan. Virheellisiä syöttöarvoja olivat negatiiviset kurssit ja markkamäärät, jotkut olivat sallineet negatiiviset markkamäärät ikäänkuin velkojen laskemisena, mutta tästä täytyi erikseen mainita, muuten tulkittiin, että markkamäärien tarkistus oli jätetty toteuttamatta. Syöttöarvot oli hyvä tarkistaa heti, ja reagoida virheisiin ilmoittamalla niistä ja kysymällä heti uusi arvo. Markkamäärän tarkistukseltahan vältyttiin, jos lopetusehdoksi valittiin negatiivinen markkamäärä. Ohjelma ei tällöin kuitenkaan saanut tulostaa vastausta ! Ohjelman tulisi tarkistaa myös uudelleen pyydetyt syötteet, toisin sanoen, ei ihan riitä, että tarkistetaan ensimmäinen syöte, ja pyydetään järkevää arvoa, mutta uutta syötettä ei tarkisteta. Jonkinlainen toistorakenne oli syytä tarkistuksiin tehdä. Valuutan nimeä ei voi oikein tarkistaa, ainoa suht järkevä tarkistus saattaisi olla esimerkiksi varmistaa, ettei nimi ole tyhjä merkkijono. Lopetusehtoja oli monia, pääsääntöisesti kuitenkin käyttäjällä tuli olla mahdollisuus lopettaa muunnosten tekeminen halutessaan. Tämä oli mahdollista toteuttaa esim. pitämällä negatiivisia markkamääriä lopettamisen merkkinä (tämä lopetusehto oli syytä kertoa käyttäjälle !) tai kysymällä joka muunnoksen jälkeen haluaako käyttäjä lopettaa. Pisteytys: Jos oli pyritty jollakin toistorakenteella toteuttamaan ohjelma, jonka avulla pystyi muuntamaan _useita_ rahamääriä, pisteitä tuli 1 1/2 - 5. Näissä tapauksissa pisteitä vähennettiin alla olevien sääntöjen mukaan maksimista, kuitenkin siten, että pistemäärä kuvaisi tekijän osaamista. Vajaammat ratkaisut arviotiin siten, että lähtöpisteksi annettiin 0, ja sitten katsottiin, että mitä keskeisten asioiden osaamista vastauksesta löytyi, ja annettiin niistä pisteitä, kuitenkin niin, että 1 1/2 pistettä oli maksimi. Vähennykset, esimerkkeinä annettu yleisiä virheitä -0p: *kirjoitus- tai huolimattomuusvirhe (tulkintakysymys !) Esim. - puolipisteitä puuttuu sieltä täältä, - aaltosulut unohtuneet joistakin kohdista, mutta sisennys kertoo idean *hassu rakenne Esim. - tehty if-do-while -rakenne, joka täysin vastaa while-rakennetta *väärinmuistettu Lue-luokan metodi Esim. - Lue.mjono() kunhan käytetään samalla tavalla kuin Lue.rivi() *käyttäjälle ei alussa kerrota mitä ohjelma tekee (Esittely!) Tästä ei vähennetty, mutta jos esittelyä ei ollut oli sillä negatiivista impaktia rajatapauksissa, ja toisaalta jos esittely oli hyvä, sai plussaa rajatapauksia varten... Jos ohjelma kuitenkin alkaa karusti kysymyksellä "Anna kurssi:", niin käyttäjällä voi mennä sormi suuhun, että "mikä kurssi?", ja tällaisissa tapauksissa vähennettiin 1/2 p. Käyttäjän olisi syytä olla aina perillä siitä mistä on kysymys. "Anna vieraan valuutan kurssi:" kertoo jo mistä on kyse, vaikka esittely olisi tällöinkin suotavaa. * käytetty kurssin laskemiseen kaavaa tulos=markkamäärä/kurssi, tämähän kaava vastaa enemmän suomalaista kurssin ilmoittamiskäytäntöä kuin tuo tehtävässä annettu -1/2 * systemaattinen syntaksivirhe Esim. -ehtojen ympäriltä puuttuu sulut * epäselvä keskustelu ohjelman ja käyttäjän välillä Esim. - karu aloitus "Anna kurssi:" kts. yllä - kysytään samalla kertaa nimi ja kurssi, jolloin käyttäjän antaessa vastauksensa samalle riville, ohjelman suoritus pysähtyy, kunnes käyttäjä tajuaa (jos tajuaa !) antaa kurssin uudestaan toiselle riville * vastauksen tulostus sekava Pisteitä ei otettu kuitenkaan mistään välilyöntien puuttumisesta tms. pikkuviilauksista Esim. - valuutan nimeä oli syytä käyttää jossain, esim. tulosta ilmoitettaessa, muutenhan sen kysymisessä ei ole mitään järkeä ! * pieni looginen virhe Esim. - ehto väärinpäin * käytetty lukemiseen jotain muuta kuin Lue-luokan metodia (kts. yllä -0p) * rajoitettu kurssi ylhäältä esim. 10:een tällaisia rajoituksia ei kannata, tehdä -1 * käsitevirhe Esim. - ilmentymämuuttujien käyttö ilman mitään oliota, ikäänkuin luokkamuuttujina, luokkamuuttujia sai käyttää, vaikka se paha tapa onkin. (Kukaan ei kuitenkaan tainnut tehdä näin) * pieni looginen virhe systemaattisesti Esim. - kaikissa ehtolauseissa ehdot väärinpäin) * isommat loogiset virheet -2 syöttötietojen tarkistus puuttuu kokonaan -1/2 jos toteutettu ohjelma, joka kysyy joka toistolla valuutan nimeä ja kurssia Harvinaisempia virheitä arvioitiin tapauskohtaisesti. Esimerkkiratkaisu. /** * --------Ohjelman toiminnan kuvaus--------- * Valuuttalaskin on ohjelma, jolla käyttäjä voi muuntaa rahamääriä Suomen * markoista johonkin toiseen valuuttaan. * Ohjelma kysyy käyttäjältä valuutan nimen ja kurssin. * * Käyttäjä voi tämän jälkeen laskea useita muunnoksia markoista * kohdevaluuttaan. Käyttäjä voi lopettaa ohjelman käytön halutessaan. * * */ public class ValuuttaLaskin { public static void main(String[] args) { String nimi; double maara; double kurssi; boolean jatko; tulostaEsittely(); nimi = kysyValuutanNimi(); kurssi = kysyValuutanKurssi(); do { System.out.println("++++++++++++++++++++++++"); //Selventää tulostusta maara = kysyMaara(); tulostaTulos(nimi, kurssi, maara); jatko = kysyJatko(); }while (jatko); tulostaHeiHei(); } /* Kysytään käyttäjältä valuutan nimi, mitään tarkastuksia ei tehdä */ private static String kysyValuutanNimi() { String vastaus; System.out.println("Anna valuutan nimi, johon haluat markkoja vaihtaa: "); vastaus = Lue.rivi(); return vastaus; } /* Kysytään valuutan kurssi, ja tarkistetaan, että se on positiivinen. * Jos ei ole, kysytään kurssi uudelleen. Palautetaan kelvolliseksi todettu * kurssi. */ private static double kysyValuutanKurssi() { double kurssi; System.out.println("Anna valuutan kurssi: "); kurssi=Lue.dluku(); while(kurssi<=0) { System.out.println("Valuutan kurssin tulee olla positiivinen!\n" + "Anna kurssi uudelleen:"); kurssi = Lue.dluku(); } return kurssi; } /* Kysytään vaihdettava markkamäärä, ja tarkistetaan, ettei se ole negatiivinen * Jos on, kysytään markkamäärä uudelleen. Palautetaan kelvolliseksi todettu * markkamäärä. */ private static double kysyMaara() { double maara; System.out.println("Anna markkamäärä, jonka haluat vaihtaa ?"); maara = Lue.dluku(); while(maara<0) { System.out.println("Määrä ei voi olla negatiivinen! \n"+ "Anna markkamäärä uudelleen"); maara=Lue.dluku(); } return maara; } /* Kysytään käyttäjältä haluaako tämä jatkaa. Jos haluaa, palautetaan * true, jos ei palautetaan false */ private static boolean kysyJatko() { char vastaus; System.out.println("Haluatko vaihtaa vielä ? Paina 'k', jos haluat."); vastaus = Lue.merkki(); if(vastaus=='k' || vastaus=='K') return true; else return false; } /* Metodi tulostaa ohjelman esittelyn */ private static void tulostaEsittely() { System.out.println("+++++++++++++++++ VALUUTTALASKIN +++++++++++++++++++++"); System.out.println("ValuuttaLaskimella voit muuttaa Suomen markkoja \n"+ "johonkin toiseen valuuttaan. Ohjelma kysyy aluksi \n"+ "valuutan nimen ja kurssin, jonka jälkeen voit vaihtaa\n"+ "useita eri markkamääriä kyseiseen valuuttaan.\n"); System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++"); } private static void tulostaHeiHei() { System.out.println("Valuuttalaskin kiittää mielenkiinnostasi ..."); } /* Metodi tulostaa vastauksen. Esimerkki: valuutan nimeksi on * syötetty 'kruunu', kurssiksi 1.6, vaihdettava markkamäärä on 100 * Vastaus: * 100 Suomen markkaa on 160 kruunua. */ private static void tulostaTulos(String vnimi, double vkurssi, double mmaara) { double tulos = vkurssi*mmaara; System.out.println(mmaara + " Suomen markkaa on "+ tulos + " " + vnimi + "a. "); } }