| Rakkauslaskuri.java |
1 package tentti09;
2
3
4 import java.util.Scanner;
5
6 /**
7 * Ohjelma kysyy kaksi nimeä ja laskee nimien perusteella
8 * kaksinumeroisen rakkausprosentin. Rakkausprosentti lasketaan
9 * laskemalla "LOVES"-sanan jokaisen kirjaimen lukumäärät kummassakin
10 * nimessä. Esimerkiksi nimissä "Lotta" ja "Esko" on yhteensä
11 * <pre>
12 * - 1 kpl L-kirjainta
13 * - 2 kpl O-kirjaimia
14 * - 0 kpl V-kirjainta
15 * - 1 kpl E-kirjainta
16 * - 1 kpl S-kirjainta.
17 * </pre>
18 * Suur- ja pienaakkosilla ei ole merkitystä.
19 * Kirjaimien lukumäärät summataan vierekkäisten kirjaimien lukumäärien
20 * kanssa yhteen, jolloin jäljelle jää neljä lukumäärää.
21 * Jos lukumäärien summasta tulee kaksi- tai useampinumeroinen,
22 * niin silloin luvun numerot summataan yhteen
23 * (esimerkiksi luvusta 12 tulee 3).
24 * Vierekkäisten kirjaimien lukumäärien summaamista jatketaan kunnes
25 * jäljellä on kaksi lukua. Nämä kaksi lukua muodostavat rakkausprosentin.
26 * @author Ohj1 tuntiopet
27 * @version 16.12.2009
28 */
29 public class Rakkauslaskuri {
30
31 /** Sana jonka kirjaimiin verrataan */
32 public static final String RAKKAUSSANA = "LOVES";
33
34
35 /**
36 * Laskee yhteen luvun numerot
37 * @param luku tutkittava luku
38 * @return luvun numeroiden summa
39 * @example
40 * <pre name="test">
41 * summaaNumerot(0) === 0
42 * summaaNumerot(12) === 3
43 * summaaNumerot(123) === 6
44 * summaaNumerot(78) === 15
45 * </pre>
46 */
47 public static int summaaNumerot(int luku) {
48 int summa = 0;
49 int n = luku;
50 while ( n > 0 ) {
51 summa += n % 10;
52 n = n / 10;
53 }
54 return summa;
55 }
56
57 /**
58 * Muuttaa luvun yksinumeroikseksi laskemalla luvun numerot
59 * yhteen niin kauan että tulos on yksinumeroinen.
60 * @param luku tutkittava luku
61 * @return luvun numeroiden summa (aina yksi numero)
62 * @example
63 * <pre name="test">
64 * yksiNumeroinenSumma(1) === 1;
65 * yksiNumeroinenSumma(12) === 3;
66 * yksiNumeroinenSumma(123) === 6;
67 * yksiNumeroinenSumma(78) === 6;
68 * </pre>
69 */
70 public static int yksiNumeroinenSumma(int luku) {
71 int tulos = luku;
72 while ( tulos > 9 ) tulos = summaaNumerot(tulos);
73 return tulos;
74 }
75
76 /**
77 * Laskee taulukon vierekkäiset luvut yhteen ja palauttaa
78 * uuden taulukon, jossa on vierekkäisten lukujen summa.
79 * Jos summan luvusta tulee kaksi tai useampinumeroinen,
80 * sen numerot lasketaan yhteen kunnes se on yksinumeroinen.
81 * @param a laskettava taulukko
82 * @return vierekkäisten summa (yhtä lyhyempi kuin a)
83 * @example
84 * <pre name="test">
85 * Arrays.toString(laskeVierekkaisetYhteen(new int[]{1})) === "[]";
86 * Arrays.toString(laskeVierekkaisetYhteen(new int[]{1,1})) === "[2]";
87 * Arrays.toString(laskeVierekkaisetYhteen(new int[]{2,3,5})) === "[5, 8]";
88 * </pre>
89 */
90 public static int[] laskeVierekkaisetYhteen(int[] a) {
91 int[] a2 = new int[a.length - 1]; // Lukujen määrä vähenee aina yhdellä.
92 // Käydään kerralla läpi kaksi vierekkäistä alkiota.
93 // Lopetetaan kun jälkimmäinen (j) on lopussa.
94 for (int i = 0, j = 1; j < a.length; i++, j++) {
95 a2[i] = yksiNumeroinenSumma(a[i] + a[j]);
96 }
97 return a2;
98 }
99
100 /**
101 * Laskee kuinka monta mitäkin sanan kirjainta löytyy jonosta.
102 * @param sana jonka kirjaimia tutkitaan
103 * @param jono josta kirjaimia etsitään
104 * @return kirjainten lukumäärät kokonaislukutaulukossa
105 * @example
106 * <pre name="test">
107 * #import java.util.Arrays;
108 * Arrays.toString(laskeKirjaimet("apu","saapas")) === "[3, 1, 0]";
109 * Arrays.toString(laskeKirjaimet("apu","")) === "[0, 0, 0]";
110 * Arrays.toString(laskeKirjaimet("Apua","saapas")) === "[0, 1, 0, 3]";
111 * </pre>
112 */
113 public static int[] laskeKirjaimet(String sana,String jono) {
114 int[] a = new int[sana.length()];
115 for (int si = 0; si < a.length; si++) {
116 char c = sana.charAt(si);
117
118 int lkm = 0;
119 for (int ji=0; ji<jono.length(); ji++)
120 if ( jono.charAt(ji) == c ) lkm++;
121
122 a[si] = lkm;
123 }
124 return a;
125 }
126
127 /**
128 * Lasketaan sanojen rakkausprosentti.
129 * @param nimi1
130 * @param nimi2
131 * @return nimien rakkausprosentti
132 *
133 * @example
134 * <pre name="test">
135 * laskeRakkausprosentti("Lotta","Esko") === 86
136 * laskeRakkausprosentti("Viivi-Loviisa","Lasse-Sylvester") === 39
137 * laskeRakkausprosentti("SUSU","VOSSO") === 99
138 * </pre>
139 */
140 public static int laskeRakkausprosentti(String nimi1, String nimi2) {
141 int[] luvut = laskeKirjaimet(RAKKAUSSANA, (nimi1 + nimi2).toUpperCase());
142
143 while (luvut.length > 2) {
144 luvut = laskeVierekkaisetYhteen(luvut);
145 }
146 return luvut[0]*10 + luvut[1];
147 }
148
149 /**
150 * Lasketaan rakkausprosentti käyttäjän syötteistä
151 * @param args ei käytössä
152 */
153 public static void main(String[] args) {
154 System.out.println("Ohjelma laskee kahdesta nimestä rakkausprosentin.");
155 Scanner scan = new Scanner(System.in);
156 System.out.print("Anna ensimmäinen nimi: ");
157 String nimi1 = scan.nextLine();
158 System.out.print("Anna toinen nimi: ");
159 String nimi2 = scan.nextLine();
160 System.out.printf("Rakkausprosenttinne on %d!%n",
161 laskeRakkausprosentti(nimi1, nimi2));
162 }
163
164 }
165