• Non ci sono risultati.

Attività: Implementazione software di un conto corrente semplificato (strutture dati)

N/A
N/A
Protected

Academic year: 2021

Condividi "Attività: Implementazione software di un conto corrente semplificato (strutture dati)"

Copied!
9
0
0

Testo completo

(1)

Attività: Implementazione software di un conto corrente semplificato (strutture dati)

Si vuole realizzare una gestione semplificata di conti correnti bancari.

Ogni conto corrente è descritto da:

 un codice IBAN alfanumerico di 26 caratteri

 giorno, mese e anno di apertura (la gestione di un conto corrente è relativa all’esercizio di un unico anno)

 il saldo iniziale in euro

 un tasso % intera da applicare per il calcolo degli interessi attivi (a favore del cliente)

 un tasso % intera da applicare per il calcolo degli interessi passivi (a favore della banca)

Le operazioni che possono essere eseguite sul conto corrente sono descritte da:

 giorno, mese e anno di effettuazione (si suppone che la data di valuta coincida con quella dell’operazione)

 una breve descrizione

 un tipo di operazione P: prelievo, D:Deposito

 l’importo in euro dell’operazione

Ogni conto corrente può prevedere un numero variabile di movimenti ognuno dei quali contiene:

 un’operazione

 altri dati aggiuntivi che si ritiene possano essere funzionali a supportare le richieste che saranno descritte di seguito.

Implementare le classi, scegliendo le strutture dati più idonee, che permettano di realizzare la situazione descritta. Per ogni conto corrente è necessario scrivere i metodi che permettano:

 inserire movimenti (non è prevista la cancellazione: se un movimento è errato si inserisce come correttivo un movimento di pari importo e di segno contrario con opportuna descrizione) in ordine cronologico in funzione del valore della data.

 ottenere l’estratto conto completo di tutti movimenti in ordine cronologico con saldo finale

 ottenere il conto scalare completo con gli interessi calcolati a fine anno.

Per il riassunto a scalare si faccia riferimento a quanto esposto di seguito.

Il riassunto scalare di un conto corrente bancario contiene i numeri debitori e i numeri creditori dei saldi riferiti ai singoli movimenti assoggettati a interesse. I saldi per valuta vengono moltiplicati per i giorni di presenza e genereranno interessi creditori se il conto è attivo. Viceversa in presenza di un conto passivo si genereranno interessi debitori.

Di seguito riportiamo un esempio di riassunto a scalare spiegandone le relative voci che lo

compongono.

(2)

Valuta Saldo Giorni Numeri Creditori

Numeri Debitori

260.00 3 7.80

01/04/2013 -840.00 1 8.40

-1400.00 2 28.00

-1963.00 2 39.26

887.00 0

Saldo finale 887.00 7.80 75.66

Valuta. Come nell’estratto conto indica la data in cui l’operazione bancaria ha realmente effetto.

Saldo. In questa colonna vengono elencate tutte le somme dei singoli movimenti: se il saldo ha segno negativo, la banca sta facendo fronte a tale importo poiché il conto è in negativo e nel contempo il correntista pagherà interessi debitori.

Giorni. Sono i giorni in cui il conto in essere ha beneficiato di quel saldo di valuta.

Numeri debitori. Questa colonna rappresenta i saldi di valuta passivi finali, calcolati moltiplicando i giorni per i singoli saldi per valuta diviso 100. In seguito sul totale verranno applicati gli interessi passivi.

Numeri creditori. I saldi per valuta attivi saranno utilizzati per calcolare gli interessi creditori.

Il totale su cui applicare il tasso di interesse, anche in questo caso, sarà dato dalla sommatoria dei singoli saldi di valuta attivi moltiplicati per i giorni in cui hanno effetto, il tutto diviso 100.

Si fornisca il diagramma UML che schematizza la soluzione ipotizzata e si fornisca il codice

Java per le varie classi in modo da prevedere un’opportuna gestione dei conti correnti.

(3)

Possibile Soluzione:

UML

Codice Java Operazione.java

public class Operazione { private int giorno;

private int mese;

private int anno;

private String descrizione;

private char tipoMovimento; //(d: deposito, p: prelievo) private double importo;

(4)

public Operazione(int giorno, int mese, int anno,String descrizione, char tipoMovimento, double importo) {

setData(anno, mese, giorno);

this.descrizione=descrizione;

this.tipoMovimento = tipoMovimento;

this.importo = importo;

}

public int getAnno() { return anno;

}

public String getDescrizione() { return descrizione;

}

public void setDescrizione(String descrizione) { this.descrizione = descrizione;

}

public int getMese() { return mese;

}

public void setData(int anno, int mese, int giorno) { this.anno = anno;

this.mese = mese;

this.giorno = giorno;

}

public int getGiorno() { return giorno;

}

public double getImporto() { return importo;

}

public void setImporto(double importo) { this.importo = importo;

}

public char getTipoMovimento() { return tipoMovimento;

}

public void setTipoMovimento(char tipoMovimento) { this.tipoMovimento = tipoMovimento;

} }

ContoCorrente.java

import java.util.*;

public class ContoCorrente { private String iban;

private double saldoIniziale;

private int giorno;

private int mese;

private int anno;

private int tassoInteressiAttivi;

private int tassoInteressiPassivi;

private Movimento head;

private int nMovimenti;

public ContoCorrente(String iban, double saldoIniziale, int giorno, int mese, int anno, int tassoInteressiAttivi, int tassoInteressiPassivi) {

this.iban = iban;

this.saldoIniziale = saldoIniziale;

setDataIniziale(anno,mese,giorno);

this.tassoInteressiAttivi = tassoInteressiAttivi;

(5)

this.tassoInteressiPassivi = tassoInteressiPassivi;

this.head = null;

nMovimenti=1;

Operazione op1=new Operazione(giorno,mese,anno,"Saldo iniziale c/c",'D',saldoIniziale);

inserisciMovimento(op1);

}

public int getAnno() { return anno;

}

public int getMese() { return mese;

}

public int getGiorno() { return giorno;

}

public void setDataIniziale(int anno, int mese, int giorno) { this.anno = anno;

this.mese = mese;

this.giorno = giorno;

}

public String getIban() { return iban;

}

public void setIban(String iban) { this.iban = iban;

}

public double getSaldoIniziale() { return saldoIniziale;

}

public void setSaldoIniziale(double saldoIniziale) { this.saldoIniziale = saldoIniziale;

}

public int getTassoInteressiAttivi() { return tassoInteressiAttivi;

}

public void setTassoInteressiAttivi(int tassoInteressiAttivi) { this.tassoInteressiAttivi = tassoInteressiAttivi;

}

public int getTassoInteressiPassivi() { return tassoInteressiPassivi;

}

public void setTassoInteressiPassivi(int tassoInteressiPassivi) { this.tassoInteressiPassivi = tassoInteressiPassivi;

}

public int inserisciMovimento (Operazione operazione){ //inserimento cronologico if ((operazione.getAnno()!=anno)||(operazione.getMese()<mese)||

(operazione.getGiorno()<giorno))

return -1; // data inferiore data apertura conto Movimento m=new Movimento(operazione);

if (head==null){

head=m;

head.setLink(null);

return 1;

}

Movimento p,pp;

p=head;

pp=p;

while (p!=null){

if (differenzaDate(p.getInfo().getGiorno(),p.getInfo().getMese(),p.getInfo().getAnno(), operazione.getGiorno(),operazione.getMese(),operazione.getAnno())>=0){

pp=p;

p=p.getLink();

}

(6)

else {

nMovimenti++;

m.setLink(p);

pp.setLink(m);

return 1;

} }

nMovimenti++;

m.setLink(p);

pp.setLink(m);

return 1;

}

public String[] estrattoConto(){

int i=0;

double saldo=0;

String[] estratto=new String[nMovimenti+2];

estratto[i++]="Data operazione\t|Descr. Operazione\t|D/P\t|Importo";

Movimento p=head;

while (p!=null){

saldo=saldo+((p.getInfo().getTipoMovimento()=='D')

?+p.getInfo().getImporto():-p.getInfo().getImporto());

estratto[i]=""+p.getInfo().getGiorno()+"/"+p.getInfo().getMese()+"/"+

p.getInfo().getAnno()+"\t|"+p.getInfo().getDescrizione()+"\t|"+

p.getInfo().getTipoMovimento()+"\t|"+p.getInfo().getImporto();

p=p.getLink();

i++;

}

estratto[i]=" Saldo attuale "+saldo;

return estratto;

}

private int differenzaDate(int giorno1,int mese1,int anno1,int giorno2,int mese2,int anno2){

GregorianCalendar data1 = new GregorianCalendar(anno1, mese1, giorno1);

long millisecondi1= data1.getTimeInMillis();

GregorianCalendar data2 = new GregorianCalendar(anno2, mese2, giorno2);

long millisecondi2= data2.getTimeInMillis();

return (int)((millisecondi2-millisecondi1)/86400000);

}

private void calcolaNumeri(){

int gg=0;

double saldo=0;

double numeri;

Movimento p=head.getLink();

Movimento pp=head;

while (p.getLink()!=null){

saldo=saldo+((p.getInfo().getTipoMovimento()=='D')

?+p.getInfo().getImporto():-p.getInfo().getImporto());

gg=differenzaDate(pp.getInfo().getGiorno(),pp.getInfo().getMese(), pp.getInfo().getAnno(),p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno())+1;

p.setGiorni(gg);

pp=p;

p=p.getLink();

}

gg=differenzaDate(p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno(),31,12,anno)+1;

p.setGiorni(gg);

return;

}

private void calcolaGiorni(){

int gg=0;

Movimento p=head.getLink();

Movimento pp=head;

while (p.getLink()!=null){

gg=differenzaDate(pp.getInfo().getGiorno(),pp.getInfo().getMese(), pp.getInfo().getAnno(),p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno())+1;

p.setGiorni(gg);

pp=p;

(7)

p=p.getLink();

}

gg=differenzaDate(p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno(),31,12,anno)+1;

p.setGiorni(gg);

return;

}

public String[] scalareInteressi(){

calcolaGiorni();

int i=0;

double saldo=0, tNumeriCredito=0, tNumeriDebito=0;

int gg,g=giorno, m=mese, a=anno;

String[] scalare=new String[nMovimenti+2];

scalare[i++]="Data saldo \t|Saldo\t|Giorni\t|N.cred.|N.deb.";

Movimento p=head;

Movimento pp=head;

while (p!=null){

while ((p!=null)&&(differenzaDate(g,m,a,p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno())==0)){

saldo=saldo+((p.getInfo().getTipoMovimento()=='D')

?+p.getInfo().getImporto():-p.getInfo().getImporto());

pp=p;

p=p.getLink();

}

if (p!=null){

gg=differenzaDate(g,m,a,p.getInfo().getGiorno(),p.getInfo().getMese(), p.getInfo().getAnno())+1;

scalare[i]=""+g+"/"+m+"/"+a+"\t|"+saldo+ "\t|"+pp.getGiorni();

if (saldo>=0) {

scalare[i]+="\t|"+saldo*pp.getGiorni()/100+"\t| 0";

tNumeriCredito+=saldo*pp.getGiorni()/100;

} else{

tNumeriDebito-=saldo*pp.getGiorni()/100;

scalare[i]+="\t| 0 \t|"+saldo*-pp.getGiorni()/100;

}

g=p.getInfo().getGiorno();

m=p.getInfo().getMese();

a=p.getInfo().getAnno();

i++;

} }

scalare[i]=""+g+"/"+m+"/"+a+"\t|"+saldo+ "\t|"+pp.getGiorni();

if (saldo>=0) {

scalare[i]+="\t|"+saldo*pp.getGiorni()/100+"\t| 0";

tNumeriCredito+=saldo*pp.getGiorni()/100;

} else{

tNumeriDebito+=saldo*pp.getGiorni()/100;

scalare[i]+="\t|0 \t|"+saldo*-pp.getGiorni()/100;

}

scalare[++i]="Saldo Finale "+saldo+" Totale numeri creditori " +

tNumeriCredito+" Totale numeri debitori "+ tNumeriDebito;

double sbilancio=(tNumeriCredito*tassoInteressiAttivi/100) -(tNumeriDebito*tassoInteressiPassivi/100);

scalare[++i]="Competenze a credito "+tNumeriCredito*tassoInteressiAttivi/100+

"€ Competenze a debito "+(tNumeriDebito*tassoInteressiPassivi/100) + "€ Sbilancio "+sbilancio+"€";

for (i=i+1;i<scalare.length;i++) scalare[i]="";

return scalare;

}

public static void main (String[] args){

Operazione op1=new Operazione(1, 1, 2013,"Deposito contanti", 'D', 100.0);

Operazione op2=new Operazione(1, 1, 2013,"Prelievo bancomat", 'P', 210.0);

Operazione op3=new Operazione(5, 3, 2013,"Prelievo bancomat", 'P', 10.0);

Operazione op31=new Operazione(5, 3, 2013,"Deposito assegno", 'D', 50.0);

Operazione op4=new Operazione(4, 3, 2013,"Prelievo bancomat", 'P', 10.0);

Operazione op5=new Operazione(4, 2, 2013,"Deposito assegno ", 'D', 120.0);

Operazione op6=new Operazione(10, 4, 2013,"Pagamento utenze", 'P', 100.0);

Operazione op7=new Operazione(20, 5, 2013,"Deposito contanti", 'D', 25.0);

(8)

ContoCorrente c1=new ContoCorrente("IT17X0605502100000001234567",100,01,01,2013,2,5);

c1.inserisciMovimento(op1);

c1.inserisciMovimento(op2);

c1.inserisciMovimento(op3);

c1.inserisciMovimento(op4);

c1.inserisciMovimento(op5);

c1.inserisciMovimento(op6);

c1.inserisciMovimento(op7);

c1.inserisciMovimento(op31);

//estratto conto

String[] estratto=c1.estrattoConto();

int i;

for (i=0;i<estratto.length;i++) System.out.println(estratto[i]);

//conto scalare con interessi (competenze) String[] scalare=c1.scalareInteressi();

for (i=0;i<scalare.length;i++) System.out.println(scalare[i]);

} }

Movimento.java

public class Movimento { private Operazione info;

private Movimento link;

private int giorni;

public int getGiorni() { return giorni;

}

public void setGiorni(int giorni) { this.giorni = giorni;

}

public Movimento(Operazione info) { this.info = info;

link=null;

}

public Operazione getInfo() { return info;

}

public void setInfo(Operazione info) { this.info = info;

}

public Movimento getLink() { return link;

}

public void setLink(Movimento link) { this.link = link;

} }

Riferimenti

Documenti correlati

La voce è soggetta a spese di scritturazione contabile (cfr. sezione “Causali che danno origine a scritturazione contabile cui corrisponde un onere economico”) come da sezione

Il Cliente ha facoltà di recedere dal rapporto di conto corrente senza penalità e senza spese di chiusura, dandone comunicazione per iscritto alla Banca, con effetto dalla data

Il FGD rimborserà i Suoi depositi (fino a 100.000 Euro) entro 7 giorni lavorativi decorrenti dalla data in cui si producono gli effetti del provvedimento di liquidazione

Il conto BASE (allegato A) prevede, a fronte del pagamento di un canone annuale onnicomprensivo, i seguenti servizi/operazioni: accesso a internet banking, 6 liste movimenti,

Tipo causale di registrazione contabile da sommare alla voce di spesa sopra indicata.. Spesa per singola scrittura eseguita

Bonifico all'estero in divisa estera spese dell'operazione 1,500 per mille con un minimo di euro 12,00 spese di registrazione euro 1,03 Per bonifici non STP (anche se in euro e

L’elenco aggiornato delle società a cui saranno comunicati i dati personali dell’Interessato, che potranno agire, a seconda dei casi, in qualità di responsabili del trattamento

La voce è soggetta a spese di scritturazione contabile (cfr. sezione “Causali che danno origine a scritturazione contabile cui corrisponde un onere economico”) come da sezione