stoper

0

Witam, mógłby mi ktoś pomóc zrobić najprostszy możliwy stoper? Mam zadanie, że ma on odmierzać czas biegu zawodnika, więc zakładam że musi się zatrzymać na życzenie użytkownika. Jestem zielona w temacie programowania, a czas goni. Wiem, że pewnie trzeba będzie użyć funkcji time ale nie mam pojęcia nawet od czego zacząć.

0

ja wiem, że są ksiązki, ale nie naucze sie tego w 3 dni (chociaz probuje), mam ten przedmiot na studiach, a przez obecna sytuacje nie odbywaja sie zadne zajecia, jedynie rzucone zadania, projekty i "radzcie sobie sami", dajac tydzien na zostanie super mistrzami c++

2

Wystarczy chcieć:

https://www.google.com/search?q=c%2B%2B+odliczanie+czasu

a jak się nie chce to uż na to nie ma rady...

radźcie sobie sami.

Na tym polegają studia. Studia to nie przedszkole. A odliczanie czasu w c++ to jeszcze żadne mistrzostwo a nawet nie wystarczająca podstawa.

p.s.
czy to kolejny "student" oczekujący, że wykładowca magiczną pałeczką przeniesie wiedzę do główki?

6
  1. Pobierasz czas przy pomocy std::chrono
  2. Tworzysz pętlę która przyjmuje input dopóki nie zostanie wprowadzony konkretny znak (np. q) bądź fraza (np. stop)
  3. Pobierasz czas przy pomocy std::chrono
  4. Obliczasz czas trwania poprzez odjęcie czasu z pkt 1 od czasu z pkt 3
  5. Wyświetlasz czas obliczony w pkt. 4

Wczytywanie => https://en.cppreference.com/w/cpp/io/cin
std::chrono => https://en.cppreference.com/w/cpp/chrono
Wyświetlanie => https://en.cppreference.com/w/cpp/io/cout

Koniec prost stoper skończony :)

1
katakrowa napisał(a):

radźcie sobie sami.

Na tym polegają studia. Studia to nie przedszkole. A odliczanie czasu w c++ to jeszcze żadne mistrzostwo a nawet nie wystarczająca podstawa.

p.s.
czy to kolejny "student" oczekujący, że wykładowca magiczną pałeczką przeniesie wiedzę do główki?

@katakrowa: Niby masz rację, ale bez przesady -- jakieś zajęcia/konsultacje (w formie zdalnej) powinny się odbyć... Inaczej to jest olewanie studenta i tyle.
@koszyk1: Co to za studia???

1

@koszyk1: pokaż co już masz. Chyba nie oczekujesz, że wykonamy za kogoś pracę domową?

4

dajac tydzien na zostanie super mistrzami c++

Nie kłam. Tydzień temu dowiedziałaś się, że będziesz programować na studiach? Przedmiot nazywa się "historia ludów pierwotncyh", że to dla Ciebie takie zaskoczenie? Zadanie wymaga bardzo podstawowej znajomości języka, osoba która programowała w czymkolwiek wcześniej poradzi sobie z tym w jeden wieczór. Dla osoby całkowie zielonej tydzień to wystarczająca ilość czasu.

0

jakbym nie chciala to bym nie pytala jak to zrobic, oczywiscie wcale nie wpisalam w google jak odliczac czas, teraz juz wszystko jasne, dzieki;))
a tak powaznie to dla mnie to jest czarna magia i to w ogole nie ma sensu, jak mam to zlozyc w calosc zeby po prostu ten czas sie odliczal po wlaczeniu i zatrzymywal jesli sie cos nacisnie...

2
koszyk1 napisał(a):

Witam, mógłby mi ktoś pomóc zrobić najprostszy możliwy stoper?

Skoro chcesz pomocy a nie wyręczania, to pokaż co masz zrobione. Ktoś mógłby cię wyręczyć, ale na tym forum z reguły nie chcemy tak robić. Idąc na studia trzeba mieć świadomość, że będą zaliczenia.

0

Skąd w niektórych z was jest tyle jadu, jezu ludzie, nie każdy jest i chce być świetny w programowaniu:)
Studiuje matematykę (już widzę fale wiadomości, że to przecież jest związane z programowaniem - ja o tym wiem, gdyby zajęcia odbywały się normalnie, pewnie więcej bym z nich wyniosła), przedmiot ten zaczął się w tym semestrze, więc mieliśmy kilka zajęć, po których umiem napisać Hello world i zrobić równanie kwadratowe w waszym wielbionym c++. Teraz, gdy zajęcia są online (a raczej ich nie ma) dostajemy zadania do wykonania, z tego przedmiotu akurat bez żadnego wyjaśnienia co i jak. Próbuje się sama uczyć z jakimiś kursami na yt, rozumiem już niektóre pętle, czy funkcje ale jest to bardzo mało, w porównaniu z tym, co jest wymagane. Dlatego pytam o ten głupi stoper.

P.S: Nie no, myślałam, że na studiach to się nic nie robi i zdaje. Dzięki za uświadomienie, że to nie przedszkole. I jeśli według niektórych studia powinny wyglądać tak, że przychodzisz, dostajesz zagadnienia i radzisz sobie ze wszystkim sam, to życzę powodzenia waszym dzieciom w ich przyszłej edukacji.

2
koszyk1 napisał(a):

Skąd w niektórych z was jest tyle jadu, jezu ludzie, nie każdy jest i chce być świetny w programowaniu:)

Akurat w tym wątku jeszcze nie ma jadu. "nie każdy jest i chce być świetny w programowaniu" - powiedz to prowadzącemu zajęcia, nie nam. Jak dla mnie przychodzisz na forum, chcesz czegoś od ludzi i jeszcze na nas narzekasz. Lubię pomagać, ale bez przesady.

3

@koszyk1:
Po prostu post który napisałeś przypomina X innych w których konkretne osoby liczą tylko na gotowca, odniesienie wiele osób do pomocy mocno się zmienia wraz z wstawieniem choćby kawałka kodu ;)
Ode mnie dostałeś gotową instrukcję co masz zrobić, jedyne co musisz to przepisać to na C++.
Dostałeś od @several link gdzie możesz znaleźć książki w których mógł byś doczytać o pętlach, wprowadzaniu i wyprowadzaniu danych do/z programy.
Owszem, istnieje szansa że nasz wielbiony c++ ci się nie przyda (poza tym pisząc w kategorii C++ powinieneś się spodziewać fanów :) ), ale już sama umiejętność programowania (choćby żeby w przyszłości normalnie operować w Fortranie, matlabu bądź wolframie) i o zgrozo myślenia (w twoim problemie wymagane jest minimalne) już ci się może przydać.

Dlatego proponuję ci takie rozwiązanie:
Spróbuj zaimplementować to co wcześniej napisałem, jak staniesz na czymś to odpowiedz tutaj, a my ci podamy źródło do materiału gdzie uzyskasz wiedze.
Pamiętaj także że sarkazm źle wpływa na chęć pomocy z naszej strony ;)

0

No właśnie, jeszcze to dobre słowo. Chyba to forum jest przeznaczone również do tego, by prosić o pomoc, a dostałam jedną odpowiedź, która może się do czegoś przydać i którą sprawdzę, reszta to niepotrzebne komentarze. I nie narzekam na nikogo, ale jak ktoś odpowiada mi w sposób, jakby zapomniał, że sam kiedyś był na starcie z tym tematem, to dziękuje bardzo.

0
plx211 napisał(a):

@koszyk1:
Po prostu post który napisałeś przypomina X innych w których konkretne osoby liczą tylko na gotowca, odniesienie wiele osób do pomocy mocno się zmienia wraz z wstawieniem choćby kawałka kodu ;)
Ode mnie dostałeś gotową instrukcję co masz zrobić, jedyne co musisz to przepisać to na C++.
Dostałeś od @several link gdzie możesz znaleźć książki w których mógł byś doczytać o pętlach, wprowadzaniu i wyprowadzaniu danych do/z programy.
Owszem, istnieje szansa że nasz wielbiony c++ ci się nie przyda (poza tym pisząc w kategorii C++ powinieneś się spodziewać fanów :) ), ale już sama umiejętność programowania (choćby żeby w przyszłości normalnie operować w Fortranie, matlabu bądź wolframie) i o zgrozo myślenia (w twoim problemie wymagane jest minimalne) już ci się może przydać.

Dlatego proponuję ci takie rozwiązanie:
Spróbuj zaimplementować to co wcześniej napisałem, jak staniesz na czymś to odpowiedz tutaj, a my ci podamy źródło do materiału gdzie uzyskasz wiedze.
Pamiętaj także że sarkazm źle wpływa na chęć pomocy z naszej strony ;)

Postaram się, dziękuje bardzo, może ja też przesadzam, ale dla mnie to trudna sytuacja i jestem powoli tym załamana

0

``Więc po wielu próbach, błędach i łzach mam coś takiego i trzy pytanka (albo i więcej)
Czy ten czas odlicza się poprawnie? Czy czyszczenie ekranu z clear jest dobrze zrobione? Dlaczego kbhit nie działa? (chciałam, żeby zatrzymało się po wciśnięciu p i znowu zaczęło działać po wciśnięciu r) Czy można z tego kodu coś usunąć żeby wyglądał estetyczniej? (bo może coś jest niepotrzebne, a ja o tym nie wiem...)
[code]

#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <ctime>
#include <cstdlib>
#include <conio.h>
using namespace std;

int hours = 0;
int minutes = 0;
int seconds = 0;

void displayClock()
{

void clear_screen()
;std::system("cls");



cout << setfill( ' ' ) << setw( 55 ) << "         STOPER         \n";
cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
cout << setfill( ' ' ) << setw( 29 );
cout << "| " << setfill( '0' ) << setw( 2 ) << hours << " hrs | ";
cout << setfill( '0' ) << setw( 2 ) << minutes << " min | ";
cout << setfill( '0' ) << setw( 2 ) << seconds << " sec |" << endl;
cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";

}

void timer()
{

while( true ) {
  time_t sekundy = time( 0 );
    displayClock();
    
    sleep( 1 );
  
    seconds++;
   
  
    if( seconds == 60 ) {
      
      
        minutes++;
      
      
        if( minutes == 60 ) {
          
          
            hours++;
            minutes = 0;
        }
        seconds = 0;
    }
}

}

int main()
{

timer();
{


        if(kbhit()){
        auto got=getch();
        if(got=='p'||got=='P'){
            cout<<"PAUSED, R to resume.\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
            do auto got=getch(); while(got!='r'&&got!='R');

}
}
}
return 0;
}

[/code]

1

Dlaczego kbhit nie działa?

Bo blokujesz sobie główny wątek w funkcji timer().

Pętla:

while( true ) 
{
  .....
}

nigdy się nie skończy (*).

(*) Chyba że sam zamkniesz konsolę, wyłączysz komputer lub zabraknie prądu.

0

Jeżeli chcesz aby w trakcie odmierzania czasu, można było w miarę bezproblemowo obsługiwać wczytywanie danych z klawiatury, możesz wykorzystać wątki, tak jak to jest zrobione na poniższym przykładzie, działającym tylko pod windowsem.

#include <conio.h>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <chrono>
#include <thread>
#include <memory>
#include <atomic>

using namespace std;

class CurrentTime
{
    int hours {};
    int minutes {};
    int seconds {};

    atomic<bool> pauseflag {false};
    atomic<bool> endflag {false};

    void tick()
    {
        ++seconds;
        if( seconds==60 ) { ++minutes ; seconds = 0; }
        if( minutes==60 ) { ++hours   ; minutes = 0; }
    }

    void display()
    {
        system("cls");

        cout << setfill( ' ' ) << setw( 55 ) << "         STOPER         \n";
        cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
        cout << setfill( ' ' ) << setw( 29 );
        cout << "| " << setfill( '0' ) << setw( 2 ) << hours << " hrs | ";
        cout << setfill( '0' ) << setw( 2 ) << minutes << " min | ";
        cout << setfill( '0' ) << setw( 2 ) << seconds << " sec |" << endl;
        cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
    }

    void run()
    {
        while( endflag.load() == false )
        {
          if( pauseflag.load() == false )
          {
              display();
              tick();
              this_thread::sleep_for(chrono::seconds(1));
          }
        }
    }

public:

    void pause()  { pauseflag.store(true);  }
    void resume() { pauseflag.store(false); }
    void end()    { endflag.store(true);    }

    thread start()
    {
        return thread( &CurrentTime::run , this );
    }
};

int main()
{
    auto timer = make_unique<CurrentTime>();
    auto thread = timer->start();

    char sign {};   
    while( sign != 'e' )
    {
        if( _kbhit() ) sign = _getch();
        if( sign == 'p' ) timer->pause();
        if( sign == 'r' ) timer->resume();
        if( sign == 'e' ) timer->end();
    }

    thread.join();

    return 0;
}
0

Potrzebuję chyba jakiegoś prostszego sposobu..

0

Można prościej.

int main()
{ 
    bool ispause {false};
    auto tzero {chrono::system_clock::to_time_t(chrono::system_clock::now())};
    auto pause {chrono::system_clock::now()};
    char sign {};

    while( sign != 'e' )
    {
        if( !ispause )
        {
            auto time = chrono::system_clock::to_time_t(chrono::system_clock::now()) - tzero;
            system("cls");
            cout << put_time(gmtime(&time),"%H %M %S");
            this_thread::sleep_for(chrono::seconds(1));
        }
        if( _kbhit() ) sign = _getch();
        if( sign == 'p' )
        {
            pause = chrono::system_clock::now(); ispause = true; sign = ' ';
        }
        if( sign == 'r' )
        {
            tzero += (chrono::system_clock::to_time_t(chrono::system_clock::now())-chrono::system_clock::to_time_t(pause)); sign = ' ';
            ispause = false;
        }

    }

    return 0;
}
0

Okej, ale troszeczkę pozmieniałam na górze i nadal coś jest nie tak :(

#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <ctime>
#include <cstdlib>
#include <chrono>

using namespace std;
 
int hours = 0;
int minutes = 0;
int seconds = 0;
 
void displayClock()
{
   
    void clear_screen();
    std::system("cls");
 
   
    cout << setfill( ' ' ) << setw( 55 ) << "         STOPER         \n";
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
    cout << setfill( ' ' ) << setw( 29 );
    cout << "| " << setfill( '0' ) << setw( 2 ) << hours << " hrs | ";
    cout << setfill( '0' ) << setw( 2 ) << minutes << " min | ";
    cout << setfill( '0' ) << setw( 2 ) << seconds << " sec |" << endl;
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
}
 
void timer()
{
   
{
    auto startTime = std::chrono::system_clock::now();
     
    while (true) {
        displayClock();
        sleep(1);
        auto currentTime = std::chrono::system_clock::now();
        seconds = std::chrono::duration<double>(currentTime - startTime).count();
        hours = seconds / 3600;
        seconds %= 3600;
        minutes = seconds / 60;
        seconds %= 60;
    }
}
}     
     
        
 

int main()
{
bool ispause {false};
    auto tzero {chrono::system_clock::to_time_t(chrono::system_clock::now())};
    auto pause {chrono::system_clock::now()};
    char sign {};

    while( sign != 'e' )
    {
        if( !ispause )
        {
            auto time = chrono::system_clock::to_time_t(chrono::system_clock::now()) - tzero;
            system("cls");
            cout << put_time(gmtime(&time),"%H %M %S");
            this_thread::sleep_for(chrono::seconds(1));
        }
        if( _kbhit() ) sign = _getch();
        if( sign == 'p' )
        {
            pause = chrono::system_clock::now(); ispause = true; sign = ' ';
        }
        if( sign == 'r' )
        {
            tzero += (chrono::system_clock::to_time_t(chrono::system_clock::now())-chrono::system_clock::to_time_t(pause)); sign = ' ';
            ispause = false;
        }
    }
}


    timer();
    
    return 0;
}
1

Ok, no to ważna lekcja, jak coś nie działa, to bynajmniej nie jest zadowalające nie powiedzieć co.

0

Mój błąd, chodzi mi o końcówkę kodu, czyli zatrzymywanie mojego stopera, przed funkcją int main

0

main.cpp13: error: ‘this_thread’ has not been declared
this_thread::sleep_for(chrono::seconds(1));
^~~~~~~~~~~
main.cpp20: error: ‘_kbhit’ was not declared in this scope
if( _kbhit() ) sign = _getch();

takie błędy się pojawiają....

0

main.cpp13: error: ‘this_thread’ has not been declared
this_thread::sleep_for(chrono::seconds(1));

brakuje std:: lub #include <thread>
https://en.cppreference.com/w/cpp/header/thread

main.cpp20: error: ‘_kbhit’ was not declared in this scope
if( _kbhit() ) sign = _getch();

znów zapewne brakuje includa
https://docs.microsoft.com/pl-pl/cpp/c-runtime-library/reference/kbhit?view=vs-2019

0

W ogóle nie czytasz co ludzie do ciebie piszą.

while (true)

Już była informacja ,że taka pętla blokuje główny wątek a ty dalej jej używasz.

 sleep(1);

Ta linia powoduje uśpienie na 1 ms nie na 1s. Ogólnie to funkcja stoper jest ci w tym momencie zbędna.
A co do błędu zapewne brakuje ci #include <conio.h>

1 użytkowników online, w tym zalogowanych: 0, gości: 1