Java fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.9 KiB

  1. # Kello ja poikkeukset
  2. ## 1. Kello-luokka
  3. Kirjoita luokka `Kello`. Kello-luokassa on oltava seuraavat ominaisuudet:
  4. - yksityiset oliomuuttujat `tunnit` (int) ja `minuutit` (int)
  5. - konstruktori `Kello(int tunnit, int minuutit)`, joka asettaa annetut arvot oliomuuttujiin
  6. - getterit ja setterit molemmille oliomuuttujille
  7. - `public void lisaaMinuutit(int mins)` -metodi, joka kasvattaa kellonaikaa annettujen minuuttien verran. Jos minuutit ovat lisäyksen jälkeen 60 tai yli, kasvatetaan myös tunteja siten, että minuuttiosuus pysyy aina välillä 0 ≤ minuutit ≤ 59. Jos vastaavasti tunnit ovat lisäyksen jälkeen 24 tai enemmän, pyörähtää kello ympäri ja tunnit alkavat jälleen nollasta.
  8. - `toString`-metodi, joka palauttaa kellonajan merkkijonoesityksen muodossa "22:52". Jos kellonajan minuutit ovat alle 10, tulee minuuttien edessä olla etunolla, esim. "0:06".
  9. ## 2. Parametriarvojen tarkastaminen ja poikkeusten heittäminen
  10. Toteuta `Kello`-luokkaan tarkastukset, joissa tarkastetaan, että luokalle annetut tunnit ovat väliltä `0` ≤ tunnit ≤ `23` ja minuutit väliltä `0` ≤ minuutit ≤ `59`. Mikäli kellolle annetaan aika sallitun välin ulkopuolelta, tulee sen heittää `IllegalArgumentException`-poikkeus. Joudut huomioimaan oikeellisen ajan tarkastamisen sekä konstruktorissa että set-metodeissa.
  11. Tarkasta myös `lisaaMinuutit`-metodissa, että kelloon ei yritetä lisätä negatiivista aikaa. Mikäli lisättävät minuutit on negatiivinen luku, heitä `IllegalArgumentException`.
  12. `IllegalArgumentException`-luokan konstruktorille tulee antaa parametrina virheilmoitus. Tämän tehtävän kannalta ei ole merkitystä, minkä virheviestin annat poikkeuksille, esim:
  13. ```
  14. throw new IllegalArgumentException("Virheellinen kellonaika");
  15. ```
  16. Tässä tehtävässä sinun ei tarvitse toteuttaa tekstikäyttöliittymää, mutta sinun kannattaa testata luokkasi erillisellä main-metodilla.
  17. ## ESIMERKKI
  18. ```
  19. === Suoritettava testikoodi ===
  20. public class KelloTest {
  21. public static void main(String[] args) {
  22. Kello kello = new Kello(22, 12);
  23. System.out.println(kello);
  24. kello.lisaaMinuutit(40);
  25. System.out.println(kello);
  26. kello.lisaaMinuutit(29);
  27. System.out.println(kello);
  28. kello.lisaaMinuutit(45);
  29. System.out.println(kello);
  30. }
  31. }
  32. === Ohjelman tulosteet ===
  33. 22:12
  34. 22:52
  35. 23:21
  36. 0:06
  37. ```
  38. **Kello.java**
  39. ```
  40. public class Kello {
  41. private int tunnit, minuutit;
  42. private static int hour_min = 0;
  43. private static int hour_max = 23;
  44. private static int mins_min = 0;
  45. private static int mins_max = 59;
  46. public void setTunnit(int tunnit) {
  47. this.tarkistaKello(tunnit,hour_min,hour_max);
  48. this.tunnit = tunnit;
  49. }
  50. public void setMinuutit(int minuutit) {
  51. this.tarkistaKello(minuutit, mins_min, mins_max);
  52. this.minuutit = minuutit;
  53. }
  54. public int getTunnit(){
  55. return this.tunnit;
  56. }
  57. public int getMinuutit() {
  58. return this.minuutit;
  59. }
  60. public void lisaaMinuutit(int mins) throws IllegalArgumentException {
  61. // kasvattaa kellonaikaa annettujen minuuttien verran
  62. // jos minuutit yli 60, kasvattaa tunteja siten, että minuutit pysyvät välillä 0-59
  63. //
  64. // jos tunnit ovat lisäyksen jälkeen 24 tai enemmän, "pyörähtää kello ympäri" ja
  65. // tunnit alkavat jälleen nollasta.
  66. if (mins < 0) {
  67. throw new IllegalArgumentException("Virheellinen minuuttiarvo");
  68. }
  69. this.minuutit += mins;
  70. if (this.minuutit > 60) {
  71. // kokonaiset tunnit kaikista minuuteista
  72. int hours = (int)((double)this.minuutit/60.0);
  73. this.tunnit += hours;
  74. // (minuutit/60 - kokonaiset tunnit) * 60 = jäljelle jäävät minuutit
  75. this.minuutit = (int)((((double)this.minuutit/60.0) - hours) * 60);
  76. }
  77. if (this.tunnit >= 24) {
  78. this.tunnit = 0;
  79. }
  80. }
  81. public Kello(int tunnit, int minuutit) {
  82. // konstruktori, joka asettaa annetut arvot (tunnit, minuutit) oliomuuttujiin 'tunnit' ja 'minuutit'
  83. this.tarkistaKello(minuutit, mins_min, mins_max);
  84. this.tarkistaKello(tunnit,hour_min,hour_max);
  85. this.setTunnit(tunnit);
  86. this.setMinuutit(minuutit);
  87. }
  88. private void tarkistaKello(int tyyppi, int min, int max) {
  89. if (!(tyyppi >= min && tyyppi <= max)) {
  90. throw new IllegalArgumentException("Virheellinen kellonaika");
  91. }
  92. }
  93. @Override
  94. public String toString() {
  95. // palauttaa kellonajan merkkijonoesityksen muodossa "22:52"
  96. // jos minuutit alle 10, tulee minuuttien edessä olla etunolla, esim. "0:06".
  97. if (this.minuutit < 10) {
  98. return this.tunnit + ":" + "0" + this.minuutit;
  99. } else {
  100. return this.tunnit + ":" + this.minuutit;
  101. }
  102. }
  103. }
  104. ```