2012-12-22 25 views
7

Hej, jestem nowy w C++ - Chciałem stworzyć program do dodawania i odejmowania czasu przy użyciu formatu HH: MM. Wejście Próbka: WyjścieDodawanie i odejmowanie czasu

12:00 + 3:00 - 6:00 

Próbka:

9:00 

innej próbki wejściowe: Wyjście

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

Próbka:

27:35 

Jak mam na ten temat? Myślałem, że przerobię wszystko na kilka sekund, a następnie zastosuję matematykę, a następnie zastosuję funkcję modulus 60, aby zwrócić czas. Jakąkolwiek pomoc w budowaniu takiego programu?

+0

Wydaje się, że masz go. Powodzenia!. – littleadv

+0

Jedynym problemem jest to, że muszę użyć poniższego pliku nagłówkowego i klasy czasowej – Emptypeace

+1

nie "potrzebujesz" klasy czasu dla tego .. byłoby stratą czasu .. (gra słów nie przeznaczonych) .. co ty wymaganie jest dość proste i można je łatwo uzyskać za pomocą normalnych operacji arytmetycznych. – iKlsR

Odpowiedz

1

this (część 1) i this (część 2) powinny być dokładnie co chcesz ..

masz jasne wyjaśnienie i kroki autor przez linię kodu po linii i on również wykorzystuje najlepsze praktyki .

+1

Jaka jest najlepsza praktyka? Czy opiszecie to tutaj w odpowiedzi? (W przeciwnym razie jest to odpowiedź typu "link only", która jest odradzana.) – jogojapan

+0

.. przez najlepszą praktykę, byłem trochę niejasny, myślę, że ..ale dla mnie, jego organizacji i prezentacji, jasno nakreślił, czego chciał, a kod jest dobrze ułożony w oddzielnych plikach ... itd. iw tym przypadku nie było nic innego, co mógłbym napisać, co nie zostałoby dokładnie wyjaśnione przez link (s) .. – iKlsR

+0

Proszę podać trochę kodu następnym razem. Samo połączenie z 20-minutowym filmem nie jest dobrym sposobem na odpowiedź na pytanie. –

0

Najprostszym rozwiązaniem jest po prostu przetwarza wejście do liczby całkowite (przy użyciu std::istream) wstawić je w tm (typu opisanego w <time.h>) i wywołać mktime (również <time.h>). (Jest trochę nowych rzeczy do obsługi czasu w C++ 11, ale jeszcze go nie znam).

1

Musisz zastanowić się, co masz na myśli przez "czas". Istnieją dwa pojęcia, punkty czasowe i czasy trwania. Nie ma sensu dodawać ani odejmować od siebie punktów czasowych. Sensowne jest dodawanie i odejmowanie czasu trwania (co daje czas trwania), a sensowne jest dodawanie i odejmowanie czasu z punktem czasowym (co daje punkt czasowy:

Wiele interfejsów API nie działa dobrze praca rozróżnienia pomiędzy dwoma pojęciami, ale standard C++ <chrono> biblioteka robi dość dobrze.

Oto niektóre kod, który nadużywa C tm typu w celu dostać parę trwania od użytkownika, dodaje je razem, a następnie nadużycia tm ponownie aby uzyskać wynik.

#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

anted, aby udostępnić kod jako pytanie o program jako początkujący do C++. To nie jest idealny kod, ale może być dobrym rozwiązaniem dla kogoś nowego w C++. Będzie adresować dodawanie i odejmowanie znaczników czasu. tj Być może trzeba dodać dodatkowe walidacje i może zostać przedłużony do reprezentowania dni, sekundy i milisekundy ...

#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; 
} 

wyjściowa: 27:35