001 import java.io.*; 002 import fi.jyu.mit.ohj2.*; 003 /** 004 * Ohjelma lukee tiedostoa tuotteet.dat, joka on muotoa: 005 * <pre> 006 * Volvo | 12300 | 1 007 * Audi | 55700 | 2 008 * Saab | 1500 | 4 009 * Volvo | 123400 | 1 010 * </pre> 011 * Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden 012 * yhteishinnat ja kappalemäärät sekä koko varaston yhteishinnan 013 * ja kappalemäärän. Eli em. tiedostosta tulostetaan: 014 * <pre> 015 * ------------------------------------------- 016 * Volvo 135700 2 017 * Audi 111400 2 018 * Saab 6000 4 019 * ------------------------------------------- 020 * Yhteensä 253100 8 021 * ------------------------------------------- 022 *</pre> 023 * @author Vesa Lappalainen 024 * @version 1.0, 09.03.2003 025 */ 026 public class LueTRek { 027 028 /****************************************************************************/ 029 /** 030 * Luokka yhden tuotteen tiedoille. 031 */ 032 static public class Tuote { 033 private String nimike = ""; 034 private double hinta = 0.0; 035 private int kpl = 0; 036 037 public Tuote() {} 038 public Tuote(String rivi) { 039 try { 040 parse(rivi); 041 } catch (NumberFormatException ex) { 042 } 043 } 044 045 public void parse(String s) throws NumberFormatException { 046 StringBuffer sb = new StringBuffer(s); 047 nimike = Mjonot.erotaEx(sb,'|',nimike); 048 hinta = Mjonot.erotaEx(sb,'|',hinta); 049 kpl = Mjonot.erotaEx(sb,'|',kpl); 050 } 051 052 public String toPrintString() { 053 return Mjonot.fmt(nimike,-20) + " " + Mjonot.fmt(hinta,7,0) + 054 Mjonot.fmt(kpl,4); 055 } 056 057 public void ynnaa(Tuote tuote) { 058 hinta += tuote.hinta * tuote.kpl; 059 kpl += tuote.kpl; 060 } 061 062 public String getNimike() { return nimike; } 063 public void setNimike(String nimike) { this.nimike = nimike; } 064 065 } 066 067 /****************************************************************************/ 068 /** 069 * Luokka joka säilyttää kunkin ero tuotteen yhteissumman ja lukumäär'n 070 * sekä kaikkien tuotteiden yhteissumman ja lukumäärän 071 */ 072 static public class Tuotteet { 073 private String nimi = ""; 074 private int lkm; 075 private Tuote alkiot[]; 076 private Tuote yhteensa = new Tuote("Yhteensä"); 077 078 public Tuotteet(String nimi) { 079 this.nimi = nimi; 080 alkiot = new Tuote[10]; 081 } 082 083 public int etsi(String tnimi) { 084 for (int i=0; i<lkm; i++) 085 if ( alkiot[i].getNimike().equalsIgnoreCase(tnimi) ) return i; 086 return -1; 087 } 088 089 public int lisaa(String tnimi) { 090 if ( alkiot.length <= lkm ) return -1; 091 alkiot[lkm] = new Tuote(tnimi); 092 return lkm++; 093 } 094 095 public boolean ynnaa(Tuote tuote) { 096 if ( tuote.getNimike().equals("") ) return false; 097 int i = etsi(tuote.getNimike()); 098 if ( i < 0 ) i = lisaa(tuote.getNimike()); 099 if ( i < 0 ) return false; 100 101 alkiot[i].ynnaa(tuote); 102 yhteensa.ynnaa(tuote); 103 return true; 104 } 105 106 107 public boolean lue() { 108 BufferedReader fi = Tiedosto.avaa_lukemista_varten("tuotteet.dat"); 109 if ( fi == null ) return false; 110 111 try { 112 String rivi; Tuote tuote = new Tuote(); 113 while ( ( rivi = fi.readLine() ) != null ) { 114 try { 115 tuote.parse(rivi); 116 ynnaa(tuote); 117 } catch (NumberFormatException ex) { 118 System.err.println("Rivillä jotakin pielessä " + rivi + " " + 119 ex.getMessage()); 120 continue; 121 } 122 } 123 } catch (IOException ex) { 124 System.err.println("Vikaa tiedostoa luettaessa"); 125 } finally { 126 try { 127 fi.close(); 128 } catch (IOException ex) { 129 System.err.println("Ongelmia tiedoston sulkemisessa"); 130 } 131 } 132 133 return true; 134 } 135 136 public void tulosta(OutputStream os) { 137 PrintStream out = Tiedosto.getPrintStream(os); 138 139 out.println(); out.println(); out.println(); 140 out.println("-------------------------------------------"); 141 142 for (int i=0; i<lkm; i++) 143 out.println(alkiot[i].toPrintString()); 144 145 out.println("-------------------------------------------"); 146 out.println(yhteensa.toPrintString()); 147 out.println("-------------------------------------------"); 148 out.println(); System.out.println(); System.out.println(); 149 } 150 151 } 152 153 /****************************************************************************/ 154 public static void main(String[] args) { 155 Tuotteet varasto = new Tuotteet("tuotteet.dat"); 156 if ( !varasto.lue() ) { 157 System.err.println("Tuotteita ei saada luetuksi"); 158 return; 159 } 160 varasto.tulosta(System.out); 161 } 162 } 163