streghetta (Normal User)
Newbie
Messaggi: 20
Iscritto: 19/02/2010
|
Ho rifatto il programma ex novo e ho inserito anche la funzione di sottrazione.Ma ho ancora dei problemi.Posto il codice e poi ti spiego.
Codice sorgente - presumibilmente C++ |
#include <iostream> using namespace std; class Operazione { public: Operazione(); int addizione(); int sottrazione(); char operatore; void setx(); void sety(); private: int x; int y; }; Operazione::Operazione() { x=y=0; } int Operazione::addizione() { return (x + y); } int Operazione::sottrazione() { return (x - y); } //definizione funzione di acquisizione void Operazione::setx() { int a; cin >> a; //associazione del valori immesso //in input alla variabile privata x=a; } void Operazione::sety() { int b; cin >> b; y=b; } int main() { int risultato; int scelta; scelta = 0; Operazione op; while( scelta == 0) { cout << "Inserisci il primo numero: "; op.setx(); cout << "Inserisci il secondo numero: "; op.sety(); cout << "Operatore: "; cin >> op.operatore; switch(op.operatore) { case '+': risultato = op.addizione(); break; case '-': risultato = op.sottrazione(); break; default: cout << "L'operatore che hai inserito non e' valido!" <<std::endl; continue; } cout << std::endl; cout <<"Il risultato dell'operazione e': " << risultato <<std::endl; cout <<"Voui eseguire altre operazioni?" <<std::endl; cout <<"Premi 0 per continuare,qualsiasi altro numero per uscire!" <<std::endl; cin >> scelta; } return 0; }
|
Il programma funzione,ma:
1.l'operatore l'ho messo pubblico perchè mettendolo privato non sono riuscita ad applicare la funzione set() su un char (...non so se si può fare)
2.ho utilizzato solo set() e non get():è corretto lo stesso?
3.se inserisco un carattere anzichè un numero...è la fine!non funziona!ci vorrebbe un controllo nelle funzioni setx() e sety()...potresti aiutarmi?
spero di essermi spiegata...e grazie ancora!
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
Ci sono parecchie cose da vedere....magari prima di proseguire dovresti prenderti una pausa per leggerti qualche manuale sul c++.
comunque, passiamo al programma:
-"char operatore" deve essere messo come private, non lasciarlo come public. Si può fare e DEVE essere fatto.
-setx e sety non ricevono in ingresso nessun parametro. Come ti avevo detto, non è bene che i metodi di classe usino funzioni di I/O. La cin deve essere usata dal programmatore, che deve essere libero di scegliere se prendere i dati dalla console o da un file di testo(per esempio). Quindi, è bene che i set prendano in ingresso il dato da salvare nella classe.
-Il get deve essere usato quando vuoi permettere all'utilizzatore di leggere i valori salvati: devi decidere tu se usarlo o no. Di norma è bene metterlo per tutti quei parametri che non è essenziale nascondere all'interno della classe.
-Se tu inserisci un carattere al compilatore va bene lo stesso perché tutto avviene a runtime ma la cin "mette" il risultato in una variabile intera. Ovvio che ti manda tutto in palla. Ci sono dei modi ovviamente per risolvere il problema ma non devi pensarci tu: se la persona inserisce un carattere quando tu chiedi un numero allora la colpa è sua, tu devi infischiartene.
|
|
streghetta (Normal User)
Newbie
Messaggi: 20
Iscritto: 19/02/2010
|
Per la questione dell'iserimento di un carattere avevo pensato a questa soluzione,ma ovviamente non so se è giusta.Ti posto solo ciò che ho cambiato
Codice sorgente - presumibilmente C# |
class Operazione { public: Operazione(); double addizione(); double sottrazione(); char operatore; void setx(); void sety(); private: double x; double y; char x1[20]; char y1[20]; } void Operazione::setx() { cin >> x1; x=atof(x1); } void Operazione::sety() { cin >> y1; y=atof(y1); }
|
In questo modo è come se il compilatore considerasse 0 tutto ciò che viene inserito al posto di un numero.
Per quanto riguarda il char operatore...sto leggendo un manuale,thinking in c++,ma su questa cosa mi sono bloccata e non sono riuscita ad andare avanti...vedrò cosa riesco a fare perchè non è una mancanza di lettura ma un non riuscire ad applicare le cose.
Ho provato ad applicare la funzione set() su un char ma non va.
Cmq grazie...
Ultima modifica effettuata da streghetta il 24/02/2010 alle 19:42 |
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da streghetta:
Per la questione dell'iserimento di un carattere avevo pensato a questa soluzione,ma ovviamente non so se è giusta.Ti posto solo ciò che ho cambiato
Codice sorgente - presumibilmente C# |
class Operazione { public: Operazione(); double addizione(); double sottrazione(); char operatore; void setx(); void sety(); private: double x; double y; char x1[20]; char y1[20]; } void Operazione::setx() { cin >> x1; x=atof(x1); } void Operazione::sety() { cin >> y1; y=atof(y1); }
|
In questo modo è come se il compilatore considerasse 0 tutto ciò che viene inserito al posto di un numero.
Per quanto riguarda il char operatore...sto leggendo un manuale,thinking in c++,ma su questa cosa mi sono bloccata e non sono riuscita ad andare avanti...vedrò cosa riesco a fare perchè non è una mancanza di lettura ma un non riuscire ad applicare le cose.
Ho provato ad applicare la funzione set() su un char ma non va.
Cmq grazie... |
Non ci sei ancora !!!
A che serve creare una classe che storicizza un operatore, se poi devi fare tu un controllo ?
Se fai così è più figo ed è anche più corretto:
Codice sorgente - presumibilmente C++ |
#include <iostream> using namespace std; class Operazione { private: int x; int y; char operatore; int addizione (); int sottrazione (); public: Operazione (); int risultato (); void setx (int a); void sety (int b); bool setOperazione (char operazione); bool setAll (int a, char op, int b); }; int main() { bool controllo = false; while (!controllo) { char operatore; int a, b; Operazione op; cout << "Insere il calcolo da eseguire nella forma <primo numero> <operatore> <secondo numero>\n>> "; cin >> a >> operatore >> b; if (!op.setAll (a, operatore, b)) { cout << "Errore di lettura!!!\n"; continue; } cout <<"Risultato: " << op.risultato() << endl; cout <<"Voui eseguire altre operazioni?" << endl; cout <<"Premi 0 per continuare, qualsiasi altro numero per uscire!" << endl; cin >> controllo; } return 0; } Operazione::Operazione() { x = y = 0; } int Operazione::addizione() { return (x + y); } int Operazione::sottrazione() { return (x - y); } int Operazione::risultato () { if (operatore == '+') return addizione(); else return sottrazione(); } void Operazione::setx(int a) { x = a; } void Operazione::sety(int b) { y = b; } bool Operazione::setOperazione (char operazione) { if (operazione != '-') if (operazione != '+') return false; operatore = operazione; return true; } bool Operazione::setAll(int a, char op, int b) { setx(a); sety(b); return setOperazione (op); }
|
E senza far leggere all'oggetto *_* Ultima modifica effettuata da Xaratroom il 24/02/2010 alle 19:57 |
|
streghetta (Normal User)
Newbie
Messaggi: 20
Iscritto: 19/02/2010
|
1.perchè metti le operazioni private?
2.non ho capito le due funzioni bool setOperazione (char operazione);
bool setAll (int a, char op, int b);
E cmq non funziona nè se inserisco un carattere (va tutto in palla),nè se inserisco un operatore diverso da + e -, nè se voglio uscire:va sempre in palla!quindi...perchè più corretto??
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da streghetta:
1.perchè metti le operazioni private?
2.non ho capito le due funzioni bool setOperazione (char operazione);
bool setAll (int a, char op, int b);
E cmq non funziona nè se inserisco un carattere (va tutto in palla),nè se inserisco un operatore diverso da + e -, nè se voglio uscire:va sempre in palla!quindi...perchè più corretto?? |
Guarda che a me funziona abbastanza bene ... devi solo mettere un controllo sul cin.
I metodi di somma e sottrazione puoi tranquillamente metterli pubblici se ti aggrada (sono privati solo per coerenza, dal momento che l'oggetto storicizza l'operatore), ma gli attributi no
Nel costruttore c'è un errore
Codice sorgente - presumibilmente Plain Text |
Operazione::Operazione() {
x = y = 0;
operatore = '+';
}
|
Ultima modifica effettuata da Xaratroom il 24/02/2010 alle 20:23 |
|
streghetta (Normal User)
Newbie
Messaggi: 20
Iscritto: 19/02/2010
|
Quando dico che non funziona mi riferisco al controlla sull'inserimento dei caratteri e all'uscita:inserendo 0 va avanti ma inserendo un altro intero va in palla,come per il carattere!
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da streghetta:
Quando dico che non funziona mi riferisco al controlla sull'inserimento dei caratteri e all'uscita:inserendo 0 va avanti ma inserendo un altro intero va in palla,come per il carattere! |
Si avevo messo controllo bool
Codice sorgente - presumibilmente C++ |
int main() { int controllo = 0; while (!controllo) { char operatore; int a, b; Operazione op; cout << "Insere il calcolo da eseguire nella forma <primo numero> <operatore> <secondo numero>\n>> "; cin >> a >> operatore >> b; if (!op.setAll (a, operatore, b)) { cout << "Errore di lettura!!!\n"; continue; } cout <<"Risultato: " << op.risultato() << endl; cout <<"Voui eseguire altre operazioni?" << endl; cout <<"Premi 0 per continuare, qualsiasi altro numero per uscire!" << endl; cin >> controllo; } return 0; }
|
|
|