2014-09-06 29 views
6
#include <cstdio> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    int seconds, hours, minutes; 
    cin >> seconds; 
    hours = seconds/3600; 
    cout << seconds << " seconds is equivalent to " << int(hours) << " hours " << seconds%(hours*60) 
     << " minutes " << (seconds%(hours*3600))-((seconds%(hours*60))*60) << " seconds."; 
} 

Per qualche motivo, questo programma funziona solo con numeri superiori a 3600. Qualcuno sa come risolvere questo problema? Ogni volta che eseguo un numero inferiore a 3600, lo schermo viene visualizzato con un messaggio da Windows che informa che il programma ha smesso di funzionare.Conversione dei secondi in ore, minuti e secondi

risposta

13

provare questo invece, testato e funziona:

int seconds, hours, minutes; 
cin >> seconds; 
minutes = seconds/60; 
hours = minutes/60; 
cout << seconds << " seconds is equivalent to " << int(hours) << " hours " << int(minutes%60) 
    << " minutes " << int(seconds%60) << " seconds."; 

Perché minuti è secondi/60, dividendolo di nuovo per 60 è equivalente ai secondi di immersione di 3600, ecco perché funziona.

3

seconds/3600 è divisione intera, quindi per seconds < 3600, hours è 0, quindi cose come seconds%(hours*3600) diventa seconds % 0, causando una divisione per zero.


Iniziamo ad ottenere la logica giusta. Si supponga di voler scrivere come x ore y minuti z secondi, in modo che tutti e tre siano numeri interi e né né z è maggiore di 59. Che cosa si fa?

Beh, è ​​possibile innanzitutto scrivere come q minuti z secondi, in modo tale che entrambi sono numeri interi e z non è superiore a 59. Tale è facile:

q = 5000/60 = 83 // integer division 
z = 5000 % 60 = 20 

Quindi 5000 secondi è di 83 minuti e 20 secondi. Ora come si scrive 83 minutes in x ore minuti, tale che entrambi sono numeri interi e y non è maggiore di 59? Tu fai la stessa cosa:

x = 83/60 = 1 
y = 83 % 60 = 23 

OK, cerchiamo di generalizzare questo:

int total, seconds, hours, minutes; 
cin >> total; 
minutes = total/60; 
seconds = total % 60; 
hours = minutes/60; 
minutes = minutes % 60; 
cout << total << " seconds is equivalent to " << hours << " hours " << minutes 
    << " minutes " << seconds << " seconds.\n" ; 
+0

come si rimedia a questo errore? –

+2

@SeanChen: pensando un po 'e facendo una "matematica" molto semplice. Come * convertire * (su carta con una matita!) Secondi a ore, minuti e secondi –

2

Hai un problema di divisione per zero qui:

seconds % (hours*60); 

hours è 0 per virtù della divisione intera.

hours = seconds/3600; 

Da quello che si sta cercando di fare, si dovrebbe considerare la logica condizionale per stampare i minuti se il numero totale dei secondi è maggiore di 3600. Si potrà anche indagare logica simile nella prossima parte di il tuo flusso di stampa.

mio C++ è arrugginito, quindi perdoni se questo non è esattamente sintassi valida:

cout << (seconds > 3600 ? seconds % (hours*60) : seconds) << endl; 
1

utilizzando la funzione;

#include<iostream> 

    using namespace std; 
    int hour(int h) 
    { 
     int second; 
     //second=(h/3600); 
     if (h>3600) 
      second=h/3600; 
     else 
      second=(h/3600); 
     return (second); 
    } 

    int minute(int m) 
    { 
     int second2; 
     second2=( ); 
     return(second2); 
    } 

    int second(int s) 
    { 
     int second3; 
     second3=((s-3600)%60); 
     return (second3); 
    } 

    void main() 
    { 
     int convert; 
     cout<<"please enter seconed to convert it to hour\b"; 

     cin>>convert; 
     cout<<"hr : min : sec \n"; 
     cout<<hour(convert)<<":"<<minute(convert)<<":"<<second(convert)<<endl; 
     system("pause"); 
    } 
Problemi correlati