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++ - inserire orario in c++
Forum - C/C++ - inserire orario in c++

Avatar
alenunin14 (Normal User)
Newbie


Messaggi: 3
Iscritto: 28/11/2017

Segnala al moderatore
Postato alle 16:53
Martedì, 28/11/2017
buonasera a tutti, mi sto avvicinando al mondo della programmazione tramite un percorso extrascolastico. Il linguaggio usato è il c++.
Purtroppo trovo il primo scoglio nell'inserire un orario.
L'esercizio da fare infatti prevede l'inserimento di un'ora iniziale e un'ora finale per calcolare le ore lavorative di un individuo.
spero di essere stato più chiaro possibile e che mi possiate essere di aiuto.
Grazie in anticipo.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 17:25
Martedì, 28/11/2017
Puoi semplicemente chiedere l'ora finale e iniziale, e se ti servissero i minuti li chiedi separatamente.
Se invece vuoi che il testo in input abbia un formato preciso, dovresti dirci quale e si può ragionare partendo da lì.

PM Quote
Avatar
alenunin14 (Normal User)
Newbie


Messaggi: 3
Iscritto: 28/11/2017

Segnala al moderatore
Postato alle 17:29
Martedì, 28/11/2017
dovrei chiedere l'orario con un solo input e non uno per le ore e uno per i minuti. Naturalmente un input per l'ora iniziale e un altro per l'ora finale.Grazie

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 17:36
Martedì, 28/11/2017
Facendo finta che il formato testuale sia:
Codice sorgente - presumibilmente Plain Text

  1. hh:mm


Devi prendere una stringa in input, e dopodiché separarla in due parti basandoti sulla posizione dei :
Questo è il metodo più sicuro, perché se l'utente sbaglia e scrive "8:13" al posto di "08:13", il programma accetta lo stesso il testo.
Altrimenti, assumendo un input sempre corretto, puoi accedere direttamente a s[0], s[1], s[3], e s[4] per prenderti i valori.
Dopodiché con i due pezzi rimanenti puoi ricavare due interi corrispondenti a ore e minuti e li salvi in due variabili separate (oppure no, puoi anche convertire tutto in minuti ad esempio, dipende da che calcoli devi fare).

Ci sono molti modi per fare questo nella pratica, cos'hai studiato?


PM Quote
Avatar
alenunin14 (Normal User)
Newbie


Messaggi: 3
Iscritto: 28/11/2017

Segnala al moderatore
Postato alle 17:42
Martedì, 28/11/2017
fino ad ora ho studiato le if i cicli for, while e do while oltre alle "basi". Grazie mille per la risposta

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:00
Martedì, 28/11/2017
Ok, quello che devi fare lo puoi fare con un ciclo for al cui interno va un if che si occupa di trovare il separatore.
Per l'input della stringa, il metodo più facile è usare std::string ma se non l'hai fatto usa semplicemente un array di char.
Fa un po' di prove, se dopo hai ancora problemi possiamo sempre aiutarti.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:00
Giovedì, 30/11/2017
Non che costituisca risposta rispetto al quesito posto, però direi che resto in tema riportando una funzione che uso abitualmente quando voglio ricevere in input una data tramite stringa.

Codice sorgente - presumibilmente C/C++

  1. #include <stdlib.h>
  2. #include <ctype.h>
  3. #include <time.h>
  4.  
  5. /*==============================================================================
  6. Analizza la stringa puntata dal parametro s e ne immette le componenti giorno,
  7. mese e anno agli indirizzi puntati rispettivamente da gPtr, mPtr e aPtr.
  8.  
  9. Il formato considera l'ordine 1) giorno, 2) mese e 3) anno, e ammette separatori
  10. di qualsiasi tipo (vengono infatti ignorati tutti i caratteri non numerici
  11. precedenti o interposti tra i dati significativi).
  12. Ne consegue che, ad esempio...
  13.  
  14.     "jdf24pp12/sfe2006pa" => 24/12/2006
  15.  
  16. Se l'anno viene omesso, la funzione impiega l'anno tratto dalla data di sistema.
  17. Ad esempio, se oggi e' il 10/7/2017...
  18.  
  19.     "12/5" => 12/5/2017
  20.  
  21. Se vengono omessi il mese e l'anno, la funzione impiega il mese e l'anno tratti
  22. dalla data di sistema.
  23. Ad esempio, se oggi e' il 10/07/2017...
  24.  
  25.     "12" => 12/7/2017
  26.  
  27. Se l'anno viene espresso con meno di quattro cifre, la funzione "presume" che un
  28. anno espresso a una o due cifre appartenga al terzo millennio (2000), mentre un
  29. anno espresso a tre cifre appartenga al secondo millennio (1000).
  30. Ad esempio...
  31.  
  32.     "24/12/05"  => 24/12/2005
  33.     "24/12/905" => 24/12/1905
  34.  
  35. Se il mese non e' compreso nell'ambito 1-12 la data viene rigettata.
  36.  
  37. Se il giorno non e' compreso nell'ambito tipico del mese indicato (considerando,
  38. per il mese di febbraio, la bisestilita') la data viene rigettata.
  39.  
  40. Se la funzione ha successo e la data immessa e' accettata, viene restituito 1.
  41. In caso d'errore o di data inaccettabile, la funzione restituisce 0.
  42. ==============================================================================*/
  43.  
  44. int interpreta_data( const char *s, int *gPtr, int *mPtr, int *aPtr ) {
  45.     if( s && *s && gPtr && mPtr && aPtr ) { /* verifica i parametri */
  46.         long g, m, a;
  47.  
  48.         long estrai_numero_positivo( const char **s ) {
  49.             if( **s ) {
  50.                 char *fine; /* richiesto da strtol() */
  51.                 long n; /* il numero letto con strtol() */
  52.  
  53.                 /* elimina i caratteri non numerici iniziali */
  54.                 while( **s && !isdigit(**s) ) ++(*s);
  55.  
  56.                 n = strtol( *s, &fine, 10 ); /* tenta di leggere il numero */
  57.                 if( *s == fine ) return -1; /* -1: errore */
  58.  
  59.                 *s = fine; /* aggiorna il puntatore alla stringa */
  60.                 return n;
  61.             } else return -1; /* -1: errore */
  62.         }
  63.  
  64.         /* legge i dati numerici dalla stringa */
  65.         g = estrai_numero_positivo( &s );
  66.         m = estrai_numero_positivo( &s );
  67.         a = estrai_numero_positivo( &s );
  68.  
  69.         /* controlla la validita' dei dati letti */
  70.  
  71.         if( g<0 || m<0 || a<0 ) { /* ci sono dati non espressi? */
  72.             time_t t;
  73.  
  74.             /* se il giorno non e' espresso, errore */
  75.             if( g<0 ) return 0; /* 0: errore */
  76.  
  77.             t = time(NULL); /* occorre leggere la data di sistema */
  78.  
  79.             /* se il mese non e' espresso usa il mese di sistema */
  80.             if( m<0 ) m = localtime(&t)->tm_mon+1;
  81.  
  82.             /* se l'anno non e' espresso usa l'anno di sistema */
  83.             if( a<0 ) a = localtime(&t)->tm_year+1900;
  84.         }
  85.  
  86.         int bisestile( long a ) { /* a: anno */
  87.             if( a > 1582 ) /* calendario gregoriano */
  88.                 return (!(a%400)) || ( (!(a%4)) && (a%100) );
  89.             else /* calendario giuliano (non fa la verifica dei 400 anni) */
  90.                 return (!(a%4)) && (a%100);
  91.         }
  92.  
  93.         if( a<100 )         /* se l'anno <100                      */
  94.             a += 2000;      /* presume il terzo millennio (2000)   */
  95.         else if( a<1000 )   /* se l'anno <100                      */
  96.             a += 1000;      /* presume il secondo millennio (1000) */
  97.  
  98.         switch( m ) { /* verifica gli intervalli dei valori per il giorno */
  99.             case 2:
  100.                 if( g>0 && g<(29+bisestile(a)) )
  101.                     break;
  102.                 else return 0; /* 0: errore */
  103.             case 4: case 6: case 9: case 11:
  104.                 if( g>0 && g<31 )
  105.                     break;
  106.                 else return 0; /* 0: errore */
  107.             default:
  108.                 if( g>0 && g<32 )
  109.                     break;
  110.                 else return 0; /* 0: errore */
  111.         }
  112.  
  113.         *gPtr = g; /* i dati sono validi,         */
  114.         *mPtr = m; /* comunichiamoli al chiamante */
  115.         *aPtr = a;
  116.        
  117.         return 1; /* 1: tutto bene */
  118.     }
  119.  
  120.     return 0; /* 0: errore */
  121. }



ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote