2012-12-22 9 views
7

Hey Leute, ich bin neu in C++ - Ich wollte ein Programm zum Hinzufügen und Subtrahieren von Zeit mit einem HH: MM-Format machen. Probe Input:Hinzufügen und Subtrahieren von Zeit

12:00 + 3:00 - 6:00 

Beispielausgabe:

9:00 

Ein weiteres Beispiel Input:

9:00 + 8:00 + 13:00 - 2:25 

Beispielausgabe:

27:35 

Wie bekam ich dazu? Ich überlegte, alles in Sekunden umzuwandeln und dann die Mathematik anzuwenden und dann eine Modulo-60-Funktion zu verwenden, um die Zeit zurückzugeben. Gibt es Hilfe beim Aufbau eines solchen Programms?

+0

Scheint, wie Sie es haben. Viel Glück!. – littleadv

+0

Das einzige Problem ist, dass ich die folgende Header-Datei und Zeitklasse verwenden muss – Emptypeace

+1

Sie brauchen nicht die Zeitklasse für das .. das wäre eine Verschwendung von Zeit .. (kein Wortspiel beabsichtigt) .. was Sie require ist ziemlich einfach und kann leicht mit normalen arithmetischen Operationen erreicht werden. – iKlsR

Antwort

1

this (Teil 1) und this (Teil 2) sollte genau, was Sie wollen ..

Sie eine klare Erklärung und der Autor Schritte durch den Code Zeile für Zeile zu bekommen und er nutzt auch Best-Practice .

+1

Also, was ist die beste Praxis? Wirst du es hier in der Antwort beschreiben? (Ansonsten ist dies eine Link-Only-Antwort, von der abgeraten wird.) – jogojapan

+0

..durch Best Practice, ich war ein bisschen vage, denke ich ..aber für mich die organisation und die darstellung, er hat klar umrissen, was er wollte und der code ist in separaten dateien angelegt ... usw. und in diesem fall gab es nichts anderes, das ich hätte tippen können, das nicht gründlich erklärt worden wäre Link (s) .. – iKlsR

+0

Bitte geben Sie beim nächsten Mal einen Code ein. Lediglich die Verlinkung zu einem 20-minütigen Video ist keine gute Möglichkeit, eine Frage zu beantworten. –

0

Die einfachste Lösung ist nur die Eingabe in ganzen Zahlen zu analysieren (mit std::istream), legen Sie sie in einen tm (Typ in <time.h> definiert), und rufen Sie mktime (auch in <time.h>). (Es gibt einige neue Sachen für die Bearbeitung von Zeit in C++ 11, aber ich bin noch nicht wirklich damit vertraut.)

1

Sie müssen berücksichtigen, was Sie mit "Zeit" meinen. Es gibt zwei Konzepte, Zeitpunkte und Dauer. Es macht keinen Sinn, Zeitpunkte voneinander zu addieren oder zu subtrahieren. Es macht Sinn, Dauern zu addieren und subtrahieren (was zu einer Dauer führt), und es ist sinnvoll, eine Dauer mit einem Zeitpunkt zu addieren und zu subtrahieren (was zu einem Zeitpunkt führt.

) Viele Zeit-APIs sind nicht gut Aufgabe der Unterscheidung zwischen den beiden Begriffen, aber die Standard-C++ <chrono> Bibliothek funktioniert ziemlich gut.

Hier einige Code, der Mißbräuche der C tm Typ, um ein paar Dauern von dem Benutzer zu erhalten, so dass sie zusammen addiert, und dann wieder Mißbräuche tm um das Ergebnis auszugeben

#include <iostream> // cout, cin 
#include <iomanip> // get_time, put_time 
#include <chrono> // hours, minutes, duration_cast 

int main() { 
    // input, get a couple durations to do arithmetic on 
    // technically std::tm represents a time point and get_time is supposed to 
    // parse a time point, but we treat the results as a duration 
    std::tm t; 
    std::cin >> std::get_time(&t, "%H:%M"); 

    auto duration1 = std::chrono::hours(t.tm_hour) + std::chrono::minutes(t.tm_min); 

    std::cin >> std::get_time(&t, "%H:%M"); 
    auto duration2 = std::chrono::hours(t.tm_hour) + std::chrono::minutes(t.tm_min); 

    // do the arithmetic 
    auto sum = duration1 + duration2; 

    // output 
    auto hours = std::chrono::duration_cast<std::chrono::hours>(sum); 
    auto minutes = std::chrono::duration_cast<std::chrono::minutes>(sum - hours); 

    t.tm_hour = hours.count(); 
    t.tm_min = minutes.count(); 

    std::cout << std::put_time(&t, "%H:%M") << '\n'; 
} 
0

ich w Anted, um Code als die Frage zu teilen, fragt nach einem Programm als Neuling zu C++. Dies ist nicht der perfekte Code, aber kann eine gute praktische Erfahrung für jemanden, der neu in C++ ist. Es befasst sich mit der Addition und Subtraktion von Zeitstempeln. d.h Möglicherweise müssen Sie zusätzliche Validierungen hinzufügen und kann verlängert werden, um Tage, Sekunden und Millisekunden zu repräsentieren ...

#include <iostream> 
#include <string> 

using namespace std; 

/// Represents the timestamp in HH:MM format 
class Time { 
public: 
    // Construct the time with hours and minutes 
    Time(size_t hours, size_t mins); 

    // Construct the time using a string 
    Time(const string& str); 

    // Destructor 
    ~Time() {} 

    // Add a given time 
    Time operator + (const Time& rTime) const; 

    // Subtract a given time 
    Time operator - (const Time& rTime) const; 

    // Get the members 
    int Hours() const { return m_Hours; } 
    int Minutes() const { return m_Minutes; } 

    // Get the time as a string in HH:MM format 
    string TimeStr(); 

private: 
    // Private members 
    int m_Hours; // Hours 
    int m_Minutes; // Minutes 
}; 

// Constructor 
Time::Time(size_t hours, size_t mins) { 
    if (hours >= 60 || mins >= 60) { 
     cout << "Invalid input" << endl;  
     exit(0); 
    } 

    // Update the members 
    m_Hours = hours; 
    m_Minutes = mins; 
} 

// Add the given time to this 
Time Time::operator + (const Time& rTime) const { 
    // Construct the time 
    int nTotalMinutes(m_Minutes + rTime.Minutes()); 
    int nMinutes(nTotalMinutes % 60); 
    int nHours(nTotalMinutes/60 + (m_Hours + rTime.Hours())); 

    // Return the constructed time 
    return Time(nHours, nMinutes); 
} 

// Construct the time using a string 
Time::Time(const string& str) { 
    if(str.length() != 5 || str[2] != ':') { 
     cout << "Invalid time string. Expected format [HH:MM]" << endl; 
     exit(0); 
    } 

    // Update the members 
    m_Hours = stoi(str.substr(0, 2)); 
    m_Minutes = stoi(str.substr(3, 2)); 
} 

// Substact the given time from this 
Time Time::operator - (const Time& rTime) const { 
    // Get the diff in seconds 
    int nDiff(m_Hours*3600 + m_Minutes*60 - (rTime.Hours()*3600 + rTime.Minutes()*60)); 

    int nHours(nDiff/3600); 
    int nMins((nDiff%3600)/60); 

    // Return the constructed time 
    return Time(nHours, nMins); 
} 

// Get the time in "HH:MM" format 
string Time::TimeStr() { 
    // Fill with a leading 0 if HH/MM are in single digits 
    return ((m_Hours < 10) ? string("0") + to_string(m_Hours) : to_string(m_Hours)) 
      + string(":") 
      + ((m_Minutes < 10) ? string("0") + to_string(m_Minutes) : to_string(m_Minutes)); 
} 


int main() { 
    Time time1("09:00"); // Time 1 
    Time time2("08:00"); // Time 2 
    Time time3("13:00"); // Time 3 
    Time time4("02:25"); // Time 4 

    //time1 + time 2 + time3 - time4 
    cout << (time1 + time2 + time3 - time4).TimeStr() << endl; 

    return 0; 
} 

Ausgang: 27:35

Verwandte Themen