Classe conto corrente

di Anonimizzato20258 il
16 risposte
Salve, ho progettato una classe conto corrente, a richiesta del mio professore, con la particolarità che la classe doveva salvare la parte in
euro e in centesimi separatamente. Io lo progettata ed è funzionante tranne in casi particolari come, il prelievo nel caso in cui i centesimi superino
i centesimi precedenti oppure nel caso di deposito che invece di darmi ad esempio 10.10 + 10.90= 21 mi genera 20.100 nonostante gli if.
ho cercato altrove pensando che si dovesse fare uso di eventuali this-> , ma nulla.
questo è il mio lavoro: (file contocorrente.hpp che contiene la classe con i metodi pubblici ma i campi tasso, unità, centesimi privati)
(file driver che contiene il main con la creazione del oggetto e lavorazione)
file contocorrente.cpp

#include <iostream>
#include "contocorrenti.hpp"

ContoCorrente::ContoCorrente()
{
unita = 0;
centesimi = 0;
tasso = 0.0;

}


ContoCorrente::ContoCorrente(float t)
{
unita = 0;
centesimi = 0;
tasso = t;
}

float ContoCorrente::TassoInteresse()
{ return tasso; }

int ContoCorrente::SaldoInEuro()
{ return unita; }

int ContoCorrente::SaldoCentesimi()
{ return centesimi; }



void ContoCorrente::FissaTassoInteresse(float t)
{
tasso = t;

}

void ContoCorrente::DepositaEuro(int u, int c)
{
int cent;
int eur;
cent = centesimi + c;
eur = unita + u;
if (cent >= 100)
{
centesimi = cent - 100;
unita += 1;
}
else
{
unita = eur;
centesimi = cent;
}
}



void ContoCorrente::PrelevaEuro(int u, int c)
{
if (u > unita && c > centesimi)
cerr << "importo non disponibile";
unita = unita - u;
if (centesimi < c)
{
centesimi = centesimi + 100 - c;
unita = unita - 1;
}
else
{
centesimi -= c;
unita -= u;
}
}

#include <iostream>
#include <iomanip>
#include "contocorrenti.hpp"

using namespace std;

void InputEuro(int& e, int& c);

int main()
{
int euro, cent;
int scelta;
float t;
ContoCorrente cc;

do
{ cout << "Saldo corrente: " << cc.SaldoInEuro() << "."
<< setw(2) << setfill('0') // istruzioni di formato: per vedere i cent
// sempre con due cifre: 13.05 e non 13.5
<< cc.SaldoCentesimi() << " (lire: "
<< cc.SaldoInLire() << ")" << endl
<< "Quale operazione vuoi effettuare?\n"
<< "1: Fissa Tasso\n"
<< "2: Deposita Euro\n"
<< "3: Preleva Euro\n"
<< "4: Aggiorna Saldo\n"
<< "0: Esci\n\n"
<< "Scelta: ";
cin >> scelta;
cout << endl;
switch (scelta)
{
case 1:
cout << "Nuovo tasso : ";
cin >> t;
cc.FissaTassoInteresse(t);
break;
case 2:
InputEuro(euro,cent);
cc.DepositaEuro(euro,cent);
break;
case 3:
InputEuro(euro,cent);
cc.PrelevaEuro(euro,cent);
break;
case 4:
cc.AggiornaSaldo();
break;
}
}
while (scelta != 0);
}

void InputEuro(int& e, int& c)
{
cout << "Euro: ";
cin >> e;
cout << "Centesimi: ";
cin >> c;
}


Non capisco dove stia l'errore. Grazie per la disponibiltà.

16 Risposte

  • Un consiglio ... Scrivi un paio di funzioni private che trasformino tutto in centesimi e da centesimi. In questo modo tutte le operazioni saranno più semplici.
  • Mi sembra già abbastanza semplice cosi, sarebbero funzioni in più :/ evitabili da semplici 2 if nelle rispettive funzioni deposità e preleva.
  • Fai come vuoi ...
  • Funziona tutto, solo che nel momento ad esempio in cui ho 10.70 e faccio un prelievo di 5.90 mi da come saldo corrente: 5.4294967286.
    non capisco da dove derivi quel numero che dovrebbe essere salvato nel campo centesimi.
  • Dove sta il codice per visualizzare il saldo?
  • Nel file driver messo all inizio sotto il file contocorrente.cpp nel ciclo while ad ogni operazione scelta ti dice in automatico la situazione, da cui le prime funzioni nel file contocorrente.cpp dopo il costruttore saldoineuro e saldoincentesimi.
  • Lo ricopio che sopra sembra un tutt'uno.
    driver.cpp


    #include <iostream>
    #include <iomanip>
    #include "contocorrenti.hpp"

    using namespace std;

    void InputEuro(int& e, int& c);

    int main()
    {
    int euro, cent;
    int scelta;
    float t;
    ContoCorrente cc;

    do
    { cout << "Saldo corrente: " << cc.SaldoInEuro() << "."
    << setw(2) << setfill('0') // istruzioni di formato: per vedere i cent
    // sempre con due cifre: 13.05 e non 13.5
    << cc.SaldoCentesimi() << " (lire: "
    << cc.SaldoInLire() << ")" << endl
    << "Quale operazione vuoi effettuare?\n"
    << "1: Fissa Tasso\n"
    << "2: Deposita Euro\n"
    << "3: Preleva Euro\n"
    << "4: Aggiorna Saldo\n"
    << "0: Esci\n\n"
    << "Scelta: ";
    cin >> scelta;
    cout << endl;
    switch (scelta)
    {
    case 1:
    cout << "Nuovo tasso : ";
    cin >> t;
    cc.FissaTassoInteresse(t);
    break;
    case 2:
    InputEuro(euro,cent);
    cc.DepositaEuro(euro,cent);
    break;
    case 3:
    InputEuro(euro,cent);
    cc.PrelevaEuro(euro,cent);
    break;
    case 4:
    cc.AggiornaSaldo();
    break;
    }
    }
    while (scelta != 0);
    }

    void InputEuro(int& e, int& c)
    {
    cout << "Euro: ";
    cin >> e;
    cout << "Centesimi: ";
    cin >> c;
    }
  • Questo è il file contocorrenti.hpp



    #ifndef CONTOCORRENTI_HPP
    #define CONTOCORRENTI_HPP

    #include <iostream>

    using namespace std;

    class ContoCorrente
    {
    public:

    ContoCorrente();
    ContoCorrente(float t);
    float TassoInteresse();
    int SaldoInEuro();
    int SaldoCentesimi();
    int SaldoInLire();
    void FissaTassoInteresse(float t);
    void DepositaEuro(int u, int c);
    void PrelevaEuro(int u, int c);
    void AggiornaSaldo();

    private:
    int unita;
    int centesimi;
    float tasso;
    };



    #endif
  • File driver? Ma che intendi con "file driver"?

    Comunque, manca il codice di un paio di metodi ... AggiornaSaldo e SaldoInLire
  • Per file driver intendo il file.cpp che contiene sostanzialmente il main che poi con un include includerà le librerie, il prof insiste nella divisione in 3 file: il file hpp con la classe , il file cpp con la definizione dei metodi, il file driver che contiene il main.
    per quanto riguarda i metodi rimanenti non li ho fatti perchè è inutile che le faccia se non risolvo questo problema
  • Ma se non li fai NON è possibile compilare il programma e lo stesso non può essere provato. Che senso ha quello che dici?
  • Si ma basta metterli come commenti, oppure non chiamarle mai perchè nel switch non scieglierò mai quell'opzione! :/
  • Comunque le ho fatte, non le ho messe perchè non son sicuro nemmeno di quelle, anche perchè non è possibile provarle finche non mi funzionano le due funzioni indicate nel problema, per averle fatte le ho fatte
  • Sapresti invece darmi un aiuto con il deposita/preleva, che è li se non nel main il problema
Devi accedere o registrarti per scrivere nel forum
16 risposte