Czas - formatowanie wyjścia

Czas - formatowanie wyjścia
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0

Witam mam problem z programem dotyczącym czasu, nie mogę sformatować wyjścia :

Kopiuj

#include <iostream>

using namespace std;
class czas{
private:
   int godzina;
   int minuta;
public:
//czas();
czas(int h,int m){
godzina=h%24;
minuta=m%60;
}
void dodaj(int m){
minuta+=m;
godzina+=minuta/60;
minuta=minuta%60;
godzina=godzina%24;
}
int podajczas(){

cout<<godzina/10<<godzina%10<<":"<<minuta/10<<minuta%10<<endl;
}
};




int main()
{   char tmp[5];
    cin>>tmp;
    czas x((((int)tmp[0]-48)*10+(int)tmp[1]-48),(((int)tmp[3]-48)*10+(int)tmp[4]-48));
    int y,i=0;
    int tab[100];
    while(cin>>y){
        x.dodaj(y);
     tab[i]=x.podajczas();
        i++;
    }




    return 0;
}

Tak wygląda kod, lecz nie wiem jak zmienić sposób wprowadzania danych, muszę zrobić aby było tak:
21:14
15
10
14

Wyjście :21:53
W jaki sposób to policzyć?

edytowany 1x, ostatnio: Ktos
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
1

Ja mam wszystko na nie.

Zmiatanie overflołów pod dywan, zakres odpowiedzialności klas, magiczne stałe, zbędne elementy wynikające z nieznajomości języka, main() który nie wiadomo co ma pokazywać.
Nawet nie chce mi się ułożyć moich własnych zarzutów w kategoriach.


Bo C to najlepszy język, każdy uczeń ci to powie
MI
Naprawdę dopiero się uczę, tak napisałem, inaczej nie potrafię:/
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
1

Zacznij od formatowania kodu, potem przejdź do wyjścia. Takiego bloba to się czytać nie chce.


AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

Implementacja po to jest prywatna, abyś miał wolność JAK to zrobisz.
Jeśli dwa pola uwierają (a chyba tak), to możesz zmienić prywatną implementację na jedno pole MINUTY, w interpretację dwupolową (godziny / minuty 0-59) zrobić tylko na wyjściu.

UPDATE:
nie napisałem na liście zarzutów, że chyba nazwa klasy kłamie.
Więc to jest "obiektywny czas z zegarka" czy "różnica czasu, delta, odstęp"


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
MI
Czyli tak nie może być ? Nie wiem prawie nic o programowaniu obiektowym, a w internecie większość kursów jest słaba
MI
@AntKtokolwiek Pomógł byś mi ? Kod działa tak jak powinien, chciałbym tylko jakoś inaczej te dane wprowadzać i wyświetlać
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0
Kopiuj
#include <iostream>

using namespace std;
class roznica_czasu{
private:
   int godzina;
   int minuta;
public:
//czas();
    roznica_czasu(int h,int m){
    godzina=h%24;
    minuta=m%60;
    }
    void dodaj(int m){
        minuta+=m;
        godzina+=minuta/60;
        minuta=minuta%60;
        godzina=godzina%24;
        }
    int podajczas(){
        cout<<godzina/10<<godzina%10<<":"<<minuta/10<<minuta%10<<endl;
}
};




int main()
{   char tmp[5];
    cin>>tmp;
    roznica_czasu x((((int)tmp[0]-48)*10+(int)tmp[1]-48),(((int)tmp[3]-48)*10+(int)tmp[4]-48));
    int y,i=0;
    int tab[100];
        while(cin>>y){
            x.dodaj(y);
            x.podajczas();
            i++;
            }



    return 0;
}

edytowany 3x, ostatnio: mikko
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
1

Trochę poprawiłem formatowanie, kod działa i chciałbym go zostawić w tej formie, tylko nie mam pojęcia jak poprawić dane wyjściowe

MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0
Kopiuj

#include <iostream>

using namespace std;
class roznica_czasu {
private:
    int godzina;
    int minuta;

public:
    //czas();
    roznica_czasu(int h, int m)
    {
        godzina = h % 24;
        minuta = m % 60;
    }
    void dodaj(int m)
    {
        minuta += m;
        godzina += minuta / 60;
        minuta = minuta % 60;
        godzina = godzina % 24;
    }
    int podajczas()
    {

        cout << godzina / 10 << godzina % 10 << ":" << minuta / 10 << minuta % 10 << endl;
    }
};

int main()
{
    char tmp[5];
    cin >> tmp;
    roznica_czasu x((((int)tmp[0] - 48) * 10 + (int)tmp[1] - 48), (((int)tmp[3] - 48) * 10 + (int)tmp[4] - 48));
    int y, i = 0;
    int tab[100];
    while (cin >> y) {
        x.dodaj(y);
        x.podajczas();
        i++;
    }

    return 0;
}

MI
jeśli to wiele zmieniło to program poprawił za mnie
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:530
2

Zamiast męczyć się, skorzystaj z już istniejących bibliotek np. chrono
Możesz to przecież napisać w prostszy sposób:

Kopiuj
#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>

using namespace std;

struct timef
{
    int hours {0};
    int minutes {0};
    int seconds {0};

    timef( int hours_ , int minutes_ , int seconds_ )
    : hours {abs(hours_)%24} , minutes {abs(minutes_)%60} , seconds {abs(seconds_)%60}
    {}

    operator chrono::system_clock::time_point()
    {
       chrono::system_clock::time_point set_time_point {chrono::seconds(hours*60*60+minutes*60+seconds)};
       return set_time_point;
    }
};


class TimeManager
{

private:

    chrono::system_clock::time_point time_point {chrono::system_clock::now()};

public:

    TimeManager() = default;
    TimeManager( chrono::system_clock::time_point time_point_ ): time_point {time_point_} {}

    TimeManager& operator=( chrono::system_clock::time_point time_point_ )
    {
       time_point = time_point_;
       return *this;
    }

    template< typename T >
    TimeManager operator+( T value )
    {
        TimeManager tm {time_point};
        tm.time_point += value;
        return tm;
    }

    friend ostream& operator<<( ostream& os , const TimeManager& tm )
    {
        time_t time = chrono::system_clock::to_time_t(tm.time_point);
        os << "Time is = " << put_time(gmtime(&time), "%H:%M:%S") << '\n';
        return os;
    }
};

int main()
{
    TimeManager time {timef{5,20,21}};

    cout << time;
    cout << time + 120s;
    cout << time + 30min;
    cout << time + 1h;

    time = time + 12min;
    cout << time;

    time = timef{21,13,51};
    cout << time;
}
edytowany 13x, ostatnio: TomaszLiMoon
MI
Wygląda bardziej skomplikowanie, mój kod działa poprawnie, i liczy wszystko tak jak powinien, ale nie wiem jak sformatować wyjście
MI
Program pięknie działa, ale nadal jest ten sam problem co u mnie Wejście: 23:47 15 12 10 Wyjście: 23:47 00:02 00:14 00:24
AK
Czyli jednak nie "działa" ....
AK
Prawdopodobnie obaj trudność z północą zamiatacie pod dywan.
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
mikko napisał(a):

Trochę poprawiłem formatowanie, kod działa i chciałbym go zostawić w tej formie, tylko nie mam pojęcia jak poprawić dane wyjściowe

Potrafię uwierzyć, że input (wejście) bywa trudny, mogą być dopasowania się do wymogów wymagające chwili zatrzymania i pomyślenia.

Ale output po prostu się siada, i się robi. Dostałeś we własnych wątkach sporo ciekawego i prawidłowego kodu nt wyjścia. Nie mam pojęcia, jakie w tym mogą być problemy.

Jakie masz cele i jakie próby robiłeś?


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

Program pięknie działa, ale nadal jest ten sam problem co u mnie Wejście: 23:47 15 12 10 Wyjście: 23:47 00:02 00:14 00:24 - mikko 30 minut temu

Arytmetyka w dodaj() wywołuje moją niepewność i bezradność.. A racjonalność nie chce tego czytać. Właśnie wyznałem to psychoanalitykowi.

Moja propozycja już padła: przejście na jedną liczbę (minut / sekund, obojętne), i zrobienie extra geterów do godzin i minut. Dla intelektualnej uczciwości geter do dób.
(Tylko nie myśleć o d..ch, ciurlać wam się zachciewa)


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
TomaszLiMoon napisał(a):
cout << time + 120s;

Tomasz, ten literał mnie (pozytywnie) męczy.
Widziałem coś podobnego w Groovym (jest to częścią oficjalnej dokumentacji), ale tam jest pisownia 30.min (czyli mówiąc po cplusowemu przeciążenie operatora kropka).
Jakie są podstawy, że to w ogóle jest legalne? Bo widzę, że jest.
MSVC wymagało dodania #define _CRT_SECURE_NO_WARNINGS ale bez związku z pytaniem, na gmttime


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:530
0

Jakie są podstawy, że to w ogóle jest legalne?

Od C++11 są dostępne user-defined literals. Ja skorzystałem z już predefiniowanych w bibliotece <chrono>.

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

```cpp <- dawaj to przy wklejaniu kodu to będzie numeracja w poście i precyzyjniej ktoś może wskazać błąd

zamiast robić jakieś modulo i dzielenia przy wyświetlaniu, przekaż manipulatory do strumienia:

Kopiuj
#include <iomanip>
    int podajczas() {
        cout << setw(2) << setfill('0') << godzina << ':'
             << setw(2) << setfill('0') << minuta << endl;

poza tym ten kod się nie kompiluje int podajczas() nie ma returna, więc mówisz o działającym kodzie a pokazujesz inną wersję

Jeżeli chodzi o formatowanie kodu to chyba tylko notatnik tego nie ma. Jest AStyle, a przy instalacji clang dodatkowo dostajemy clang-format w pakiecie, więc wystarczy clang-format -i -style=google main.cpp i gotowe. Wklejanie niesformatowanego kodu to trochę jak pójście do dentysty z nieumytymi zębami.

Jak program jest interaktywny to trzeba użytkownika informować co się od niego oczekuję. Uruchomiłem go, zobaczyłem czarny ekran i nie wiem czy się zawiesił, czy ostro pracuje? Jakiś prompt musi być, chciałbym widzieć coś w tym stylu:

Kopiuj
Podaj czas (HH:MM):
23:45
ok, podano czas 23:45
podaj roznice czasu w minutach:
16
ok, podano 16, biezacy czas 23:45, roznica 00:01

EDIT:
odczytanie z wejścia czasu można zrobić trochę inaczej i pozbyć się tego potworka w mainie:

Kopiuj
    string input;
    cin >> input;

    stringstream ss(input);

    int godzina;
    char separator;
    int minuta;

    ss >> godzina >> separator >> minuta;

    roznica_czasu x(godzina, minuta);
edytowany 1x, ostatnio: jvoytech
MI
Niestety w moim przypadku nie może być tego ponieważ mam specjalnego bota sprawdzającego to, dane wejściowe i wyjściowe muszą się pokrywać wraz z jego ,, nauczonymi" odpowiedziami
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0
Kopiuj

#include <iostream>
#include <iomanip>

using namespace std;
class roznica_czasu {
private:
    int godzina;
    int minuta;

public:
    // czas();
    roznica_czasu(int h, int m)
    {
        godzina = h % 24;
        minuta = m % 60;
    }
    void dodaj(int m)
    {
        minuta += m;
        godzina += minuta / 60;
        minuta = minuta % 60;
        godzina = godzina % 24;
    }
    int podajczas()
    {
        cout << setw(2) << setfill('0') << godzina << ':' << setw(2) << setfill('0')
             << minuta << endl;
    }
};

int main()
{
    int tmp;
    string input;
    cin >> input;

    stringstream ss(input);

    int godzina;
    char separator;
    int minuta;

    ss >> godzina >> separator >> minuta;

    roznica_czasu x(godzina, minuta);

    int y, i = 0;
    int tab[100];
    while (cin >> y) {
        x.dodaj(y);
        i++;
        ;
    }
    cout << input << endl;
    x.podajczas();
    return 0;
}


Teraz już mam w ładniejszy sposób wczytywanie oraz wyświetlanie czasu, jak mogę przechwycić poszczególne godziny pomiędzy operacjami, aby móc wszystkie później wypisać ?

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

przed while stwórz sobie vector<roznica_czasu> etapy, a w pętli po uaktualnieniu czasu o wczytane minuty dodaj etap do wektora etapy.push_back(x). Wyświetlenie później etapów będzie banalnie proste:

Kopiuj
for (auto etap : etapy) {
    etap.podajczas();
}

Zastanów się nad zmianą roznica_czasu na np. po prostu Czas, poza tym klasy zwykle zaczyna się z dużej litery. Zamiast podajczas zastosuj przeciążenie operatora <<. Metoda dodaj(int) może lepiej żeby się nazywała dodajMinuty, albo powinna akceptować jako parametr nie int a np. obiekt typu Minuty.

MI
Bardzo Panu dziękuję, widzę że nie dodał się mój komentarz, wszystko pięknie działa, lecz niestety nie może być c++11 Można w inny sposób wyświetlić te auto etap ?
BO
Zamiast auto użyj po prostu nazwy twojego obiektu, czyli roznica_czasu.
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0

Niestety takie błedy sypie screenshot-20200416205854.png

Kod aktualnie wygląda tak:

Kopiuj

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

class roznica_czasu {
private:
    int godzina;
    int minuta;

public:
    // czas();
    roznica_czasu(int h, int m)
    {
        godzina = h % 24;
        minuta = m % 60;
    }
    void dodaj(int m)
    {
        minuta += m;
        godzina += minuta / 60;
        minuta = minuta % 60;
        godzina = godzina % 24;
    }
    int podajczas()
    {
        cout << setw(2) << setfill('0') << godzina << ':' << setw(2) << setfill('0')
             << minuta << endl;
    }
};

int main()
{
    int tmp;
    string input;
    cin >> input;

    stringstream ss(input);

    int godzina;
    char separator;
    int minuta;

    ss >> godzina >> separator >> minuta;

    roznica_czasu x(godzina, minuta);

    int y, i = 0;
    int tab[100];

    vector<roznica_czasu> etapy;
    while (cin >> y) {
        x.dodaj(y);
        etapy.push_back(x);
        i++;
    }
    cout << input << endl;
    for (auto etap : etapy) {
        etap.podajczas();
    }
    return 0;
}
JV
w main możesz usunąć zmienne tmp, tab, i bo są nieużywane. oprócz <sstream> którego już ci zasugerował kq możesz dodać jeszcze <string>. int podajczas zmień na void wyswietlczaswtedy nazwa będzie odpowiednia do tego co ta funkcja faktycznie robi
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
0

#include <sstream>


MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0

screenshot-20200416224536.png
dziękuję za rady, już prawie jest zamierzony efekt, niestety krzyczy odnośnie roznica_czasu

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0
Kopiuj
    for (vector<roznica_czasu>::iterator it = etapy.begin(); it != etapy.end(); ++it) {
        it->podajczas();
    }

albo dodaj do opcji kompilacji -std=c++11 lub c++14 a nawet c++17

MI
-std+c++11 nie mogę dodać do kodu, czyż nie ? To musi być w ustawieniach kompilatora, zgadza się ?
JV
tak, w ustawieniach kompilacji to gdzieś powinno być jako checkerbox do odhaczenia, albo w polu tekstowym do kompilatora trzeba dopisać -std=c++17
MI
Chyba gdzies literówka jest ale nie widzę :( po wpisaniu godziny następne godziny to 15 zawsze a minuty dodaje poprawnie
MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0

screenshot-20200416233520.png

BO
U mnie przy tych samych danych działa dobrze.
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

nie wklejaj obrazków, wystarczy tekst skopiować z konsoli. Pokaż ostateczny kod bo nie jestem jasnowidzem, jedynie co mogę teraz napisać to "u mnie działa"

MI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:58
0
Kopiuj
#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

class roznica_czasu {
private:
    int godzina;
    int minuta;

public:
    // czas();
    roznica_czasu(int h, int m)
    {
        godzina = h % 24;
        minuta = m % 60;
    }
    void dodaj(int m)
    {
        minuta += m;
        godzina += minuta / 60;
        minuta = minuta % 60;
        godzina = godzina % 24;
    }
    int podajczas()
    {
        cout << setw(2) << setfill('0') << godzina << ':' << setw(2) << setfill('0')
             << minuta << endl;
    }
};

int main()
{
    int tmp;
    string input;
    cin >> input;

    //stringstream ss(input);

    int godzina;
    char separator;
    int minuta;

   // ss >> godzina >> separator >> minuta;

    roznica_czasu x(godzina, minuta);

    int y=0, i = 0;
    int tab[100];

    vector<roznica_czasu> etapy;
    while (cin >> y) {
        x.dodaj(y);
        etapy.push_back(x);
        i++;
    }
    cout << input << endl;
   for (vector<roznica_czasu>::iterator it = etapy.begin(); it != etapy.end(); ++it) {
        it->podajczas();
    }
    return 0;
}

Zobacz pozostałe 2 komentarze
JV
no ale poprzednio @kq ci napisał, żebyś dołączył nagłówek <sstream>
MI
Przepraszam, pracuję na 3 komputerach, i gdzieś na jednym zmienię na innym nie, teraz faktycznie wszysko jest oki, Bardzo, bardzo dziękuję za pomoc
JV
to super, ale domyślasz się może dlaczego wyświetlały ci się takie dziwne godziny gdy te linie były zakomentowane?
MI
Szczerze, na innym komputerze z zakomentowanym działa :D nie wiem dlaczego
JV
ale czy działa poprawnie? dodaj do opcji kompilacji -Wall -Wextra -pedantic to dostaniesz podpowiedź w warningach co jest nie tak. Przy następnych programach lepiej je sobie dodaj a jak jesteś odważny to dodatkowo -Werror

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.