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.

223 lines
7.9 KiB

4 years ago
  1. Kirjoita ohjelma Lotto, joka hyödyntää aikaisemmassa tehtävässä kirjoittamaasi Leikkaus-luokkaa.
  2. Ohjelmasi tulee ensin pyytää käyttäjältä oikea rivi sekä lisänumero ja niiden jälkeen käyttäjän oma lottorivi. Oikea rivi ja lisänumero syötetään samalle riville välilyönneillä eroteltuina.
  3. Ohjelmasi tehtävä on tarkastaa, kuinka monta numeroa käyttäjän riviltä osui oikeisiin numeroihin ja osuiko lisänumero. Hyödynnä osumien laskemisessa Leikkaus-luokan laskeLeikkaus-metodia ja lisänumeron tarkastamisessa listan contains-metodia.
  4. Tulosta lopputulos muodossa "N oikein ja lisänumero." tai "N oikein." riippuen siitä, osuiko lisänumero käyttäjän riviin.
  5. ✂ Sinun ei tarvitse erikseen palauttaa Leikkaus-luokkaa, se löytyy Viopesta valmiina. Huomaa että tässä tehtävässä Leikkaus-luokalle ei ole määritetty pakettia, eli se on tavallaan samassa paketissa toteuttamasi Lotto-luokan kanssa. Poista siis mahdollinen import-komento, mikäli olet omassa kehitysympäristössäsi sijoittanut nämä kaksi luokkaa eri paketteihin. ✂
  6. ```
  7. Example output:
  8. Anna oikea rivi (7 numeroa + lisänumero): 4 12 14 17 23 33 35 8
  9. Anna tarkastettava rivi (7 numeroa): 4 6 7 8 12 16 28
  10. 2 oikein ja lisänumero.
  11. ```
  12. --------------------
  13. **Lotto.java**
  14. 1) Hakee Leikkaus -luokan ulkopuolelta (Viopessa automaattisesti, ei käytetä importia)
  15. ```
  16. import java.util.ArrayList;
  17. import java.util.Arrays;
  18. import java.util.List;
  19. import java.util.Scanner;
  20. public class Lotto {
  21. public static void main(String[] args) {
  22. Scanner syote = new Scanner(System.in);
  23. int oikeaMaxNumCount = 8;
  24. int arvausMaxNumCount = 7;
  25. System.out.print("Anna oikea rivi (7 numeroa + lisänumero): ");
  26. String riviOikea = syote.nextLine();
  27. List<Integer> riviOikeaInt = Lotto.tarkistaSyote(oikeaMaxNumCount, riviOikea);
  28. System.out.print("Anna tarkastettava rivi (7 numeroa): ");
  29. String riviArvaus = syote.nextLine();
  30. List<Integer> riviArvausInt = Lotto.tarkistaSyote(arvausMaxNumCount, riviArvaus);
  31. int i = 0;
  32. List<Integer> riviOikeaIntEqualSize = new ArrayList<Integer>();
  33. while (i < arvausMaxNumCount) {
  34. riviOikeaIntEqualSize.add(riviOikeaInt.get(i));
  35. i++;
  36. }
  37. List<Integer> leikkausLista = Leikkaus.laskeLeikkaus(
  38. riviOikeaIntEqualSize,
  39. riviArvausInt
  40. );
  41. // if riviArvausInt contains extra number (lisänumero) defined as the last value in riviOikeaInt
  42. if (riviArvausInt.contains(riviOikeaInt.get(oikeaMaxNumCount - 1))) {
  43. System.out.printf("%d oikein ja lisänumero.", leikkausLista.size());
  44. } else {
  45. System.out.printf("%d oikein.", leikkausLista.size());
  46. }
  47. }
  48. private static List<Integer> tarkistaSyote(int luvutMaxCount, String numeroListaStr) {
  49. int i = 0;
  50. int lottoMin = 1;
  51. int lottoMax = 42;
  52. List<Integer> numeroLista = new ArrayList<Integer>();
  53. List<String> numeroListaRaw = Arrays.asList(numeroListaStr.split(" "));
  54. if ( numeroListaRaw.size() != luvutMaxCount) {
  55. System.err.printf("Väärä määrä syötettyjä arvoja (sallittu: %d, syötetty: %d)",
  56. luvutMaxCount, numeroListaRaw.size()
  57. );
  58. System.exit(1);
  59. }
  60. while (i < numeroListaRaw.size()) {
  61. try {
  62. int numero = Integer.parseInt(numeroListaRaw.get(i));
  63. if (numero < lottoMin || numero > lottoMax) {
  64. System.err.printf(
  65. "Syötetty arvo %d ei ole hyväksyllä arvovälillä %d - %d.\n",
  66. numero, lottoMin, lottoMax
  67. );
  68. }
  69. numeroLista.add(numero);
  70. } catch (NumberFormatException e) {
  71. System.err.printf("Syötetty arvo %s ei ole kokonaisluku\n", numeroListaRaw.get(i));
  72. System.exit(1);
  73. }
  74. i++;
  75. }
  76. return numeroLista;
  77. }
  78. }
  79. ```
  80. /* ---------- ---------- */
  81. **Lotto.java**
  82. 2) Sisältää integroidun/optimoidun leikkaus-luokan
  83. ```
  84. public class Lotto {
  85. public static void main(String[] args) {
  86. Scanner syote = new Scanner(System.in);
  87. int oikeaMaxNumCount = 8;
  88. int arvausMaxNumCount = 7;
  89. System.out.print("Anna oikea rivi (7 numeroa + lisänumero): ");
  90. String riviOikea = syote.nextLine();
  91. List<Integer> riviOikeaInt = Lotto.tarkistaSyote(oikeaMaxNumCount, riviOikea);
  92. System.out.print("Anna tarkastettava rivi (7 numeroa): ");
  93. String riviArvaus = syote.nextLine();
  94. List<Integer> riviArvausInt = Lotto.tarkistaSyote(arvausMaxNumCount, riviArvaus);
  95. int i = 0;
  96. List<Integer> riviOikeaIntEqualSize = new ArrayList<Integer>();
  97. while (i < arvausMaxNumCount) {
  98. riviOikeaIntEqualSize.add(riviOikeaInt.get(i));
  99. i++;
  100. }
  101. List<Integer> leikkausLista = Leikkaus.laskeLeikkaus(
  102. riviOikeaIntEqualSize,
  103. riviArvausInt
  104. );
  105. // if riviArvausInt contains extra number (lisänumero) defined as the last value in riviOikeaInt
  106. if (riviArvausInt.contains(riviOikeaInt.get(oikeaMaxNumCount - 1))) {
  107. System.out.printf("%d oikein ja lisänumero.", leikkausLista.size());
  108. } else {
  109. System.out.printf("%d oikein.", leikkausLista.size());
  110. }
  111. }
  112. private static List<Integer> tarkistaSyote(int luvutMaxCount, String numeroListaStr) {
  113. int i = 0;
  114. int lottoMin = 1;
  115. int lottoMax = 42;
  116. List<Integer> numeroLista = new ArrayList<Integer>();
  117. List<String> numeroListaRaw = Arrays.asList(numeroListaStr.split(" "));
  118. if ( numeroListaRaw.size() != luvutMaxCount) {
  119. System.err.printf("Väärä määrä syötettyjä arvoja (sallittu: %d, syötetty: %d)",
  120. luvutMaxCount, numeroListaRaw.size()
  121. );
  122. System.exit(1);
  123. }
  124. while (i < numeroListaRaw.size()) {
  125. try {
  126. int numero = Integer.parseInt(numeroListaRaw.get(i));
  127. if (numero < lottoMin || numero > lottoMax) {
  128. System.err.printf(
  129. "Syötetty arvo %d ei ole hyväksyllä arvovälillä %d - %d.\n",
  130. numero, lottoMin, lottoMax
  131. );
  132. }
  133. numeroLista.add(numero);
  134. } catch (NumberFormatException e) {
  135. System.err.printf("Syötetty arvo %s ei ole kokonaisluku\n", numeroListaRaw.get(i));
  136. System.exit(1);
  137. }
  138. i++;
  139. }
  140. return numeroLista;
  141. }
  142. /*
  143. * public static PrintStream laskeLeikkaus(List<Integer> ekaLista, List<Integer> tokaLista) {
  144. *
  145. * List<Integer> leikkausLista = new ArrayList<Integer>();
  146. * int i = 0;
  147. *
  148. * // Intersection, exclude extra number (lisänumero)
  149. * while (i < ( ekaLista.size() - 1)) {
  150. * int a = 0;
  151. * while (a < tokaLista.size()) {
  152. *
  153. * // Get common values if leikkausLista does not contain the value already
  154. * if (ekaLista.get(i) == tokaLista.get(a) && !leikkausLista.contains(tokaLista.get(a))) {
  155. * leikkausLista.add(tokaLista.get(a));
  156. }
  157. a++;
  158. }
  159. i++;
  160. }
  161. Collections.sort(leikkausLista);
  162. // if tokaLista contains extra number (lisänumero) defined as the last value in ekaLista
  163. if (tokaLista.contains(ekaLista.get(ekaLista.size() - 1))) {
  164. return System.out.printf("%d oikein ja lisänumero.", leikkausLista.size());
  165. } else {
  166. return System.out.printf("%d oikein.", leikkausLista.size());
  167. }
  168. ```