Esercizio 8
E' necessario scrivere una applicazione che simula il funzionamento di un frammento del sistema informativo di un operatore di telefonia cellulare.
Si devono quindi rappresentare i dati relativi ad una carta SIM ed in particolare:
- il numero di telefono
- il credito disponibile in euro
- la lista delle telefonate effettuate
Per ciascuna telefonata deve essere rappresentata la durata in minuti
La classe SIM dovrà fornire le seguenti funzionalità:
- un costruttore parametrizzato che crea una SIM con numero di telefono, un credito e la lista delle
telefonate vuota
- un metodo per l'inserimento di una telefonata con i dati forniti dall'utente.
- una funzione per il calcolo dei minuti totali di conversazione.
- una funzione per il calcolo delle telefonate effettuate verso un certo numero
- una procedura per la stampa dei dati della SIM e l'elenco delle telefonate.
Viene richiesto di rappresentare i dati
relativi ad una carta SIM, come il numero e il credito; inoltre
la carta deve poter collezionare e stampare la lista delle telefonate
effettuate, deve essere possibile calcolare i minuti totali di conversazione
e calcolare le chiamate effettuate verso un dato numero.
Esternamente alla classe principale 'simtel' si creano due classi, ovviamente
la classe SIM che contiene oltre agli attributi principali, come il numero
e un credito iniziale un vettore di oggetti della classe TEL
( telefonate). Si nota il costruttore della classe SIM:
SIM(String n, int c,int dim)
String n : numero di telefono
int c : credito iniziale
int dim : dimensione del vettore delle chiamate
Le variabili di istanza per la classe SIM:
private String numero;
private int eff;
private float credito;
private TEL T[ ] ;
Si nota il vettore delle chiamate e la variabile di istanza eff
che è il numero delle chiamate effettivamente effettuate; esso,
in pratica è l'indice massimo raggiunto all'interno del vettore.
In fase di inserimento deve essere rispettata la condizione:
eff < T.length
l'istanziazione di un oggetto di classe SIM viene invocato dal main()
con una chiamata del tipo
SIM s = new SIM("123", 20,5);
viene creata una sim di nome s che ha numero
123; 20? di credito e una lista delle chiamate di 5 posti, questo
spazio non può poi essere più modificato (se no ci
vuole un arraylist).
Il costruttore pone dunque il credito=20 il numero="123", inizializza
eff=0 ed effettua l'allocazione del vettore (lista) delle chiamate:
T = new TEL[dim];
Si nota come venga effettuato un controllo sul non superamento delle dimensioni
del vettore ArrayIndexOutOfBoundsException
if(eff < T.length) {
TEL t=new TEL(num,tempo);
T[eff]=t; credito-=(float)tempo/4;//25c/min
eff++;
}else System.out.println("max chiamate effettuate");
Si usa poi, un unico metodo toString() contenuti
nella classe SIM per stampare a video Sia i dati
della carta che i dati delle telefonate effettuate.
Col metodo della classe SIM
ins(String numero, int tempo);
Si inserisce nel vettore T un oggetto
istanziato della classe TEL, rappresentativo, appunto,
di una chiamata effettuata verso un cero numero ed avente una determinata
durata.
class simtel{
public static void main (String args []) {
String st="000";
SIM s = new SIM("123", 20,5);
s.ins("000",3);
s.ins("789",5);
System.out.println(s);
System.out.println("totale chiamate in min:"+s.cal());
s.ins("000",7);
s.ins("456",4);
System.out.println(s);
System.out.println("chiamate verso:"+st+":"+s.conta(st));
s.ins("000",7);
s.ins("789",4);
System.out.println(s);
System.out.println("chiamate verso:"+st+":"+s.conta(st));
}//fine main
}// fine classe
class SIM {
private String numero;
private int eff;
private float credito;
private TEL T[] ;//dichiarazione del vettore
delle chiamate
SIM(String n, int c,int dim) {
numero=n;
credito=c;
eff=0;//eff:chiamate effettuate
T = new TEL[dim];//allocazione
del vettore delle chiamate
}
public void ins(String num,int tempo){
if(eff < T.length) {
TEL t=new TEL(num,tempo);
T[eff]=t;
credito-=(float)tempo/4;//25cent/min
eff++;
}else System.out.println("max chiamate effettuate");
}//fine ins
public int cal(){
int tot=0;
for(int i=0;i < eff;i++)tot+=T[i].getd();
return tot;
}//fine cal
public int conta(String n){
int tot=0;
for(int i=0;i < eff;i++)
if(T[i].getn().equals( n ))tot++; return tot;
}//fine conta
public String getn() { return numero;}
public float getc() {return credito;}
public String toString() {
String st="numero:"+getn()+" credito:"+getc()+"\n";
for(int i=0;i < eff;i++)st+=T[i].getn()+" "+T[i].getd()+"\n";
return st;
}//fine toString()
}//fine classe SIM
class TEL {
private String numero;
private int durata;
TEL(String n,int d){numero=n;durata=d;}
public String getn() {return numero;}
public int getd() {return durata;}
}//fine classe TEL