Esercizio 5
In un file viene memorizzato il magazzino di una azienda, secondo la notazione:
biella#7@5
ruota#3@8
stelo#2@9
prima del simbolo '#' vi è il nome del prodotto; fra il simbolo '#' e il simbolo '@' vi è il costo del prodotto; dopo il simbolo '@' vi è il quantitativo in pezzi di quel prodotto.
Il programma deve restituire il controvalore del magazzino .
E' chiaro che in questo problema, a parte le
operazioni sul file di testo, il lavoro maggiore sarà quello di
estrarre le sottostringhe rappresentative il prezzo 'prz' del prodotto
e il suo quantitativo 'qta' a magazzino.
Per ogni stringa deve essere calcolato il subtotale 'sub' dato dal
prodotto del costo 'prz' del prodotto per la sua quantità 'qta'.
Poi bisogna progressivamente sommare i subtotali.
Prima di procedere esaminiamo la questione di come estrarre dalla
stringa gli elementi che ci interessano. In questo programma, utilizzando
gli operatori indexOf e substring,
prima rileviamo la posizione dei marcatori che ci interessano, poi
estraiamo le sottostringhe comprese fra le posizioni dei marcatori,
qui memorizzati nelle variabili i ed f.
class parser {
public static void main (String args []) {
String s="biella#7@3";
char ch;
int i,f,prz,qta,somma;
i=s.indexOf('#')+1;
f=s.indexOf('@');
prz=Integer.parseInt(s.substring(i,f).trim());
i=s.indexOf('@')+1;
f=s.length();
qta=Integer.parseInt(s.substring(i,f).trim());
somma=prz+qta; System.out.println(somma);
}//fine main
}// fine classe
Qui viene restituita la somma fra il prezzo prz
e la quantità qta.
L'operazione è paradossale dal punto di vista logico ma ci serve
solo per capire se il programma fonziona. Basandoci su questo esperimento
preliminare, possiamo scrivere il programma che deve elaborare i
dati provenienti dal file di testo.
import java.io.*;
class maga{
public static void main (String args []){
BufferedReader f=null;
String s="";
int somma=0;
//leggo il file
try {
f=new BufferedReader(new FileReader("maga.txt"));
while(s!=null){
System.out.println(s);
s=f.readLine();
if(s!=null){
somma+=subtotale(s);
}//fine
if
}//fine
while
f.close();
}catch (IOException e){System.err.println("errore");}
System.out.println(somma);
}//fine main
static int subtotale(String s){
char ch;
int i,f,prz,qta,sub;
i=s.indexOf('#')+1;
f=s.indexOf('@');
prz=Integer.parseInt(s.substring(i,f).trim());
i=s.indexOf('@')+1;
f=s.length();
qta=Integer.parseInt(s.substring(i,f).trim());
sub=prz*qta;
return sub;
}//fine subtotale
}//fine class
Come si nota, il lavoro di estrazione delle sottostringhe di interesse e la loro conversione in numeri, viene eseguita dal metodo subtotale() che viene richiamato dal ciclo while che rileva ogni occorrenza di una stringa all'interno del file.