1   package demo11;
2   
3   import java.io.BufferedReader;
4   import java.io.IOException;
5   import java.util.Iterator;
6   import java.util.Map;
7   import java.util.Set;
8   import java.util.TreeMap;
9   
10  import fi.jyu.mit.ohj2.Mjonot;
11  import fi.jyu.mit.ohj2.Syotto;
12  import fi.jyu.mit.ohj2.Tiedosto;
13  
14  /**
15   * Tulostaa k?ytt?j?n antaman rahasumman ja vaaluutan perusteella kurssin mukaisen
16   * uuden raham??r?n.
17   * 
18   * @author    Antti My?h?nen
19   * @version   0.1
20   *
21   */
22  public class Rahanvaihto {
23  
24      private Map<String, Double> kurssit = new TreeMap<String, Double>();
25      
26      /**
27       * Oletuskonstruktori
28       */
29      public Rahanvaihto() {
30          
31      }
32      /**
33       * Asettaa valuuttakurssit
34       * 
35       * @example
36       * <pre name="test">
37       * #CLASSIMPORT
38       * 
39       * Rahanvaihto raha = new Rahanvaihto();
40       * raha.getKurssitSize() === 0;
41       * raha.lueKurssit();
42       * raha.getKurssitSize() === 4;
43       * raha.getKurssi("mk") ~~~ 1;
44       * raha.getKurssi("yeni") ~~~ 0;
45       * 
46       * </pre>
47       * 
48       */
49      public void lueKurssit() {
50          kurssit.put("mk", 1.0);
51          kurssit.put("$", 5.7);
52          kurssit.put("EUROA", 5.94573);
53          kurssit.put("SKr", 0.6);
54  
55      }
56      
57      
58      /**
59       * Palauttaa valuuttatietojen lukum??r?n
60       * @return    valuuttatietojen lukum??r?
61       */
62      public int getKurssitSize() {
63          return kurssit.size();
64      }
65      
66      
67      /**
68       * Palauttaa parametrina saadun yksik?n kurssin
69       * 
70       * @param avain    valuutan nimi
71       * @return         valuuttakurssi
72       */
73      public double getKurssi(String avain) {
74          if (kurssit.get(avain) == null) return 0;
75          return kurssit.get(avain);
76      }
77      
78      /**
79       * Lukee valuuttakurssit tiedostosta. Testattu edellisiss? demoissa.
80       * 
81       * @param nimi Tiedoston nimi, josta kurssit luetaan
82       * @return    true jos onnistui
83       * 
84       */
85      public boolean lueKurssitTiedostosta(String nimi) {
86          BufferedReader f = Tiedosto.avaa_lukemista_varten(nimi);
87  
88          if (f == null) {
89              System.out.println("Tiedosto " + nimi + " ei aukea!");
90              return false;
91          }
92  
93          String rivi;
94          try {
95              try {
96                  while ((rivi = f.readLine()) != null && ("".equals(rivi.trim()) == false)) {
97    
98                      parsi(rivi);
99                      
100                 }
101             } catch (IOException e) {
102                 System.out.println("Tiedoston " + nimi + " kanssa ongelmia!");
103             }
104         } finally {
105             try {
106                 f.close();
107             } catch (IOException e) {
108                 System.out.println("Tiedosto " + nimi + " ei sulkeudu!");
109             }
110         }
111         return true;
112     }
113 
114     /**
115      * Parsii ja lis?? tietorakenteeseen valuutan tiedot
116      * 
117      * @param rivi    yhden valuutan tiedot
118      * 
119      * @example
120      * <pre name="test">
121      * 
122      * </pre>
123      */
124     private void parsi(String rivi) {
125         StringBuffer sb = new StringBuffer(rivi.trim());
126         
127         String nimi = Mjonot.erota(sb, '|');
128         double kurssi = Mjonot.erotaDouble(sb, 0);
129         
130         kurssit.put(nimi, kurssi);
131         
132     }
133 
134     /**
135      * Aliohjelma, jossa ikuinen silmukka, joka hoitaa k?ytt?j?lt? kysymisen 
136      * ja tulostamisen.
137      */
138     public void vaihdaRahat() {
139         double rahasumma;
140         String valuutta;
141        
142        
143         while (true) {
144 
145             String s = Syotto.kysy("M??r? ja valuutta");
146             StringBuffer sb = new StringBuffer(s);
147             
148             if ("".equals(sb.toString().trim())) {
149                 System.out.println("Kiitos!");
150                 return;
151             }
152             
153             rahasumma = Mjonot.erotaDouble(sb, ' ');
154             valuutta = sb.toString().trim();
155             
156             if ("".equals(valuutta) != true && rahasumma > 0
157                     && (kurssit.get(valuutta) != null)) {
158 
159                 double vaihdettuSumma = laskeUusiYksikko(rahasumma, valuutta);
160 
161                 System.out.println(rahasumma + " " + valuutta + " on "
162                         + vaihdettuSumma + " mk");
163 
164             }
165 
166         }
167     }
168 
169     /**
170      * Laskee kurssin mukaisen rahasumman
171      * 
172      * @param summa              vaihdettava summa
173      * @param valuutta           valuutta, joksi vaihdetaan
174      * @return uusi rahasumma    vaihdettu raham??r?
175      * 
176      * @example
177      * <pre name="test">
178      * Rahanvaihto raha = new Rahanvaihto();
179      * raha.lueKurssit();
180      * 
181      * raha.laskeUusiYksikko(10, "mk") ~~~ 10;
182      * raha.laskeUusiYksikko(100000, "en") ~~~ 0;
183      * 
184      * </pre>
185      * 
186      */
187     public double laskeUusiYksikko(double summa, String valuutta) {
188         double kurssi = getKurssi(valuutta);
189         return summa * kurssi;
190     }
191     
192     
193     
194     /**
195      * Tulostaa infoa ohjelman tuntemista valuutoista
196      */
197     @SuppressWarnings("unchecked")
198     public void tulostaInfo() {
199         
200         StringBuffer sb = new StringBuffer();
201         sb.append("Ohjelma tuntee seuraavat valuutat: ");
202         
203         Set entrySet = kurssit.entrySet();
204         Iterator iteraattori = entrySet.iterator();
205         while (iteraattori.hasNext()) {
206             Map.Entry<String, Double> e = (Map.Entry<String, Double>)iteraattori.next();
207             sb.append(e.getKey());
208             sb.append(" ");
209         }
210         System.out.println(sb.toString());
211     }
212     
213     
214     /**
215      * P??ohjelma
216      * 
217      * @param args    ei k?yt?ss?
218      */
219     public static void main(String args[]) {
220         Rahanvaihto rahaa = new Rahanvaihto();
221         //lueKurssit();
222         rahaa.lueKurssitTiedostosta("valuuttakurssit.txt");
223         rahaa.tulostaInfo();
224         rahaa.vaihdaRahat();
225     }
226 }
227