Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzioni senza argomenti
Forum - C/C++ - Funzioni senza argomenti - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 21:33
Mercoledì, 24/02/2010
...si,ho visto,adesso funziona...anche se c'è ancora il problema sul controllo dei caratteri.Lo dico perchè mi è stato sempre detto che tutti questi controlli devono essere fatti in un programma quindi si dovrebbe valutare anche l'eventualità che l'utente inserisca un carattere anzichè un numero...

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 22:19
Mercoledì, 24/02/2010
Testo quotato

Postato originariamente da streghetta:

...si,ho visto,adesso funziona...anche se c'è ancora il problema sul controllo dei caratteri.Lo dico perchè mi è stato sempre detto che tutti questi controlli devono essere fatti in un programma quindi si dovrebbe valutare anche l'eventualità che l'utente inserisca un carattere anzichè un numero...


Puoi leggere in questo modo
Codice sorgente - presumibilmente Plain Text

  1. cin.ignore(numeric_limits<int>::max(),'\n');
  2. cin >> a;
  3. [...]
  4. cin.ignore(numeric_limits<char>::max(),'\n');
  5. cin >> operatore;


oppure usare cin.fail() (e cin.clear())...

Ma stiamo andando un po' fuori topic dato che il problema riguardava metodi senza parametri....
Mi sembra di averti fornito un esempio abbastanza completo per il problema e non ho eseguito ulteriori controlli sull'input proprio perchè era solo un esempio (e in particolare l'esempio è la classe Operazione e non il main che è da vedere come una semplice "unit test").
Non te la prendere a male ma se vuoi approfondire cin.fail, cin.clear o capire che cosa "c'è dentro" a cin.ignore puoi aprire un altra discussione...
... resta il fatto che questi metodi sono illustrati in ogni buon libro (o al massimo online, ad esempio sul sito cppreference) come anche tutta la teoria che sta dietro alla programmazione orientata agli oggetti.
Con l'esempio volevo solo mostrarti come si poteva creare una classe pulita, utile e riutilizzabile e non come si eseguiva una lettura da tastiera.

Dal punto di vista concettuale è corretto che un oggetto non legga da tastiera (a meno che non sia strettamente necessario) e che non disponga di un attributo public che l'utente andrà a controllare per decidere che metodo invocare... Un oggetto che si rispetti riceve valori e operando e "decide lui", in base ai dati ottenuti come input, cosa fare e come operare al meglio.

Per capirci: una macchina tu la guidi... possiede un acceleratore, un volante, una leva per cambiare marcia, etc. tutte queste cose compongono l'interfaccia dell'automobile. Tu la utilizzi tramite la sua interfaccia: non devi andare a spingere il pistone per farla partire e non devi soffiare nel cilindo la benzina anzi, poco ti importa se dentro c'è un pistone o un carburatore: a te importa girare la chiave, accelerare, frenare, etc.
Per gli oggetti il discorso è analogo: un programmatore che utilizzerà la tua classe la utilizzerà per semplificarsi la vita e non per complicarsela... chi se la compra una macchina senza carburatore ?

Spero che il concetto sia chiaro... propongo "C++ Fondamenti di programmazione" e "C++ Tecniche avanzate di programmazione" dei fratelli Deitel.

PS: Se leggi da tastiera magari un utente non utilizzerà la tua classe perchè dispone di dati salvati su file... un'alternativa sarebbe passare lo stream come parametro...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:29
Mercoledì, 24/02/2010
Effettivamente hai ragione.

Per risolvere il problema bisognerebbe scrivere una funzione da poter richiamare.

Il funzionamento potrebbe essere il seguente:
Come input il numero inserito dal' utente viene salvato in un vettore di caratteri, e successivamente la funzione opererà la conversione.

Ecco qui un esempio:

Codice sorgente - presumibilmente C++

  1. bool val(char *n, int &v)
  2. {
  3.  int s=1, i=0, fine=0;
  4.  v=0;
  5.  fine=strlen(n);
  6.  for (i=0; i<fine; i++)
  7.  {
  8.   switch (n[i])
  9.   {
  10.         case '-' :if (i==0)
  11.                                  {
  12.                                   s=0-1; // il numero è negativo
  13.                                  }
  14.                                  else
  15.                                  {
  16.                                   return false;
  17.                                  }
  18.                                  break;
  19.  
  20.         case '0' :
  21.         case '1' :
  22.         case '2' :
  23.         case '3' :
  24.         case '4' :
  25.         case '5' :
  26.         case '6' :
  27.         case '7' :
  28.         case '8' :
  29.         case '9' : v=10*v+(n[i]-'0'); break;
  30.         default  : return false;
  31.   }
  32.  }
  33.  v*=s;
  34.  return true;
  35. }



La funzione riceve in ingresso rispettivamente la stringa e una variabile int in cui verrà salvato il risultato.
Inoltre restituirà true in caso di successo, false altrimenti.

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 22:39
Mercoledì, 24/02/2010
Testo quotato

Postato originariamente da Poggi Marco:

Effettivamente hai ragione.

Per risolvere il problema bisognerebbe scrivere una funzione da poter richiamare.

Il funzionamento potrebbe essere il seguente:
Come input il numero inserito dal' utente viene salvato in un vettore di caratteri, e successivamente la funzione opererà la conversione.

Ecco qui un esempio:

Codice sorgente - presumibilmente C++

  1. bool val(char *n, int &v)
  2. {
  3.  int s=1, i=0, fine=0;
  4.  v=0;
  5.  fine=strlen(n);
  6.  for (i=0; i<fine; i++)
  7.  {
  8.   switch (n[i])
  9.   {
  10.         case '-' :if (i==0)
  11.                                  {
  12.                                   s=0-1; // il numero è negativo
  13.                                  }
  14.                                  else
  15.                                  {
  16.                                   return false;
  17.                                  }
  18.                                  break;
  19.  
  20.         case '0' :
  21.         case '1' :
  22.         case '2' :
  23.         case '3' :
  24.         case '4' :
  25.         case '5' :
  26.         case '6' :
  27.         case '7' :
  28.         case '8' :
  29.         case '9' : v=10*v+(n[i]-'0'); break;
  30.         default  : return false;
  31.   }
  32.  }
  33.  v*=s;
  34.  return true;
  35. }



La funzione riceve in ingresso rispettivamente la stringa e una variabile int in cui verrà salvato il risultato.
Inoltre restituirà true in caso di successo, false altrimenti.


Perchè non usare atoi ?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:21
Mercoledì, 24/02/2010
:_doubt: Caspita! E' vero!

Scusa, 8-| mi è proprio sfuggito di mente. Si vede che è sera!

PM Quote
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 23:56
Mercoledì, 24/02/2010
@ Xaratroom:
grazie di tutte le spiegazioni che mi hai dato,ho ancora qualche dubbio su alcune cose ma sei stato molto gentile nel darmi tutte queste dritte...e scusa se ti ho portato un pò fuori topic.
Vorrei dire l'ultima cosa però:a questo punto per il controllo/conversione dei carartteri si poteva anche utilizzare atof che avevo inserito in uno dei codici che ho postato...

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 0:13
Giovedì, 25/02/2010
Testo quotato

Postato originariamente da streghetta:

@ Xaratroom:
grazie di tutte le spiegazioni che mi hai dato,ho ancora qualche dubbio su alcune cose ma sei stato molto gentile nel darmi tutte queste dritte...e scusa se ti ho portato un pò fuori topic.
Vorrei dire l'ultima cosa però:a questo punto per il controllo/conversione dei carartteri si poteva anche utilizzare atof che avevo inserito in uno dei codici che ho postato...


atof server per convertire una stringa in double...

All'inizio è un po' difficile da capire... Immagina la tua classe utilizzata in un contesto grafico: non piace a nessuno vedere apparire il prompt perchè la tua classe esegue un cout o un cin... le letture le devi fare all'esterno: la classe deve interagire con l'ambiente in cui si trova solo mediante la sua interfaccia (e quindi mediante il passaggio di tipi di dato semplici, strutturati o astratti)...

Una volta acquistata la forma mentis vedrai che non è poi così difficile come sembra...

PM Quote
Avatar
streghetta (Normal User)
Newbie


Messaggi: 20
Iscritto: 19/02/2010

Segnala al moderatore
Postato alle 0:16
Giovedì, 25/02/2010
...si si...ho letto quando viene usata atof e l'ho "proposta" proprio perchè nel codice in cui l'avevo inserita i tipi che avevo dichiarato erano tutti double...

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo