Funzione booleana non funziona

di il
4 risposte

Funzione booleana non funziona

Un esercizio per l'università dice di fare una classe chiamata Orario che faccia diverse operazioni su di essi, una delle quali è un controllo di correttezza dell'ora inserita/usata nel costruttore di classe
Di conseguenza ho scritto questo codice:
#include <iostream>

using namespace std;

class Orario {
   private:
      int h;    
      int m;
	  int s;
	  bool controlla_orario() //controlla se l'orario è giusto//
	  {if (0<=h<24&&0<=m<60&&0<=s<60)
		 return true;
	   else return false;}	
   public:
      Orario() {                   // Costruttore senza parametri 
         h = 0;
         m = 0;
         s = 0;
         }
      Orario(int h1, int m1, int s1) {   // Costruttore con parametri
        	h = h1;
         	m = m1;
		 	s = s1;
			if (controlla_orario() == false)
			  {cout<<"Orario errato";
			   h = 0;
			   m = 0;
			   s = 0;}}
	  Orario(int sec) //costruttore che converte secondi nell'ora corrispondente
	  { h = sec/3600;
	    int temp = sec%3600;
	    m = temp/60;
	    s = temp%60;
	  }
      void leggi(istream& or_in) {		//lettura dell'ora in formato h:m:s
         char sep1, sep2;
         or_in >> h >> sep1 >> m >> sep2 >> s;
         	if (controlla_orario() == false)
        	   {cout<<"Orario errato";
        		h = 0;
        		m = 0;
        		s = 0;
				return;}
         return;
         }
      void stampa(ostream& or_out) {
		 or_out << h << ':' << m << ':' << s;
         return;
         }     
	  int get_ora() //fornisce solo l'ora
	  {return h;}
	  int get_minuti() //fornisce solo i minuti
	  {return m;}
	  int get_secondi() //fornisce solo i secondi
	  {return s;}
      int to_second() //converte l'ora in secondi
      {int secondi;
       secondi = secondi + (h*3600);
	   secondi = secondi + (m*60);
	   secondi = secondi + s;	
       return secondi;
	  }
	  Orario operator+(int x) { //somma tra un'ora e un numero x di secondi
         int n = to_second();
         n = n + x;
         Orario ris (n);
		 return ris;
         }
      bool operator==(Orario o) //controllo se un'ora è uguale ad un 'altra
      	  { if (h==o.h&&m==o.m&&s==o.s)
	  		return true;
	  	else return false;
			}
	  bool operator< (Orario o) //controllo se un'ora è più "piccola" di un'altra
	  { if (h<o.h)
	  		return true;
	  	else if (h>o.h)
	  		return false;
	  	else if (m<o.m)
	  		return true;
	  	else if (m>o.m)
	  		return false;
	  	else if (s<o.s)
	  		return true;
	  	else return false;
	  }
};

ostream& operator<<(ostream& or_out, Orario& o) {
  o.stampa(or_out);
  return or_out;
}

istream& operator>>(istream& or_in, Orario& o) {
  o.leggi(or_in);
  return or_in;
}
Che poi dovrà usare questo main NON modificabile:

#include <iostream>

using namespace std;

/* memorizzare la classe Orario in un file con nome esercizio_1.cpp
posto nella stessa cartella in cui è presente il file di questo programma.
La direttiva di preproccising #include "esercizio_1.cpp" si occuperà
di caricare tutto il contenuto del file esattamente nel punto  in cui si trova
la direttiva stessa.
In alternativa, inserire direttamente la dichiarazione della classe Orario
al posto della direttiva #include "esercizio_1.cpp".
*/

#include "esercizio_1.cpp"

int main() {
    Orario o1(9,42,10);  // crea un oggetto di classe Orario
    Orario o2(5221);   // crea un oggetto di classe Orario
    Orario o3;
    
    cout << "orario 1: " << o1 << endl;
    cout << "orario 2: " << o2 << endl;
    cout << "orario 3: " << o3 << endl << endl;
    
    cout << "ora di o2: " << o2.get_ora() << endl;
    cout << "minuti di o2: " << o2.get_minuti() << endl;
    cout << "secondi di o2: " << o2.get_secondi() << endl << endl;

    if (o1 < o2) cout << "o1 < o2" << endl;
	else cout << "o2 < o1" << endl;
	if (o1 == o2) cout << "o1 == o2" << endl;
	else cout << "o1 != o2" << endl;
	cout << endl;
	
	int o1_sec = o1.to_second();
	cout << "secondi corrispondenti a o1: " << o1_sec << endl;
	Orario o4(o1_sec);
	if (o4 == o1) cout << "ok" << endl;
	else  cout << "errore"  << endl;
	cout << endl;
		
	o3 = o1 + 5221;	
	cout << "il nuovo orario e: " << o3 << endl << endl;
	
    Orario orario_in;
	cout << "Immetti un orario corretto (h:m:s): ";
    cin >> orario_in;
    cout << "L'orario immesso e' " <<  orario_in << endl << endl;
    
    cout << "Immetti un orario errato (h:m:s): ";
    cin >> orario_in;
    cout << "L'orario immesso e' " <<  orario_in << endl << endl;

    return 0;    
}

/* traccia esecuzione

orario 1: 9:42:10
orario 2: 1:27:1
orario 3: 0:0:0

ora di o2: 1
minuti di o2: 27
secondi di o2: 1

o2 < o1
o1 != o2

secondi corrispondenti a o1: 34930
ok

il nuovo orario e': 11:9:11

Immetti un orario corretto (h:m:s): 12:3:14
L'orario immesso e' 12:3:14

Immetti un orario errato (h:m:s): 12:100:14
Orario errato
L'orario immesso e' 0:0:0


*/
I commenti in fondo del main sono i risultati che dovrei ottenere, cosa che succede fino a quando devo mettere un orario sbagliato. Ho notato che la funzione privata controlla_orario() non restituisce il valore falso quando dovrebbe e non riesco a capire cosa c'è che non va, qualcuno può aiutarmi?

4 Risposte

  • Re: Funzione booleana non funziona

    Questa sintassi
    
    0<=h<24 && 0<=m<60 && 0<=s<60
    
    in C++, NON FA QUELLO CHE PENSI.

    Il C++ NON E' Python!
  • Re: Funzione booleana non funziona

    migliorabile ha scritto:


    Questa sintassi
    
    0<=h<24 && 0<=m<60 && 0<=s<60
    
    in C++, NON FA QUELLO CHE PENSI.

    Il C++ NON E' Python!
    Purtroppo anche separando le condizioni non funziona, mi sai dire/consigliare un metodo per riuscire ad ottenere il valore falso?
  • Re: Funzione booleana non funziona

    Se non funziona è perché l'hai scritto sbagliato
  • Re: Funzione booleana non funziona

    Ender_Dragony ha scritto:


    migliorabile ha scritto:


    Questa sintassi
    
    0<=h<24 && 0<=m<60 && 0<=s<60
    
    in C++, NON FA QUELLO CHE PENSI.

    Il C++ NON E' Python!
    Purtroppo anche separando le condizioni non funziona, mi sai dire/consigliare un metodo per riuscire ad ottenere il valore falso?
    Il più immediato e capibile è usare l'OR || , qualsiasi delle condizioni date non fosse vera come risultato hai false.
    
        if (h<0 || h>24 || m<0 || m>59 || s<0 || s>59) printf("errore"); else printf("corretta");
    
Devi accedere o registrarti per scrivere nel forum
4 risposte