edutecnica

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