• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ciekawy problem, zegar liczący do 24h i potem ma się wyłączyć, prosty program

VPS Starter Arubacloud
+1 głos
203 wizyt
pytanie zadane 20 lutego 2021 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)

Witam serdecznie wszystkich forumowiczów,

otóż napotkałem się z problemem, nie wiem dlaczego ta pętla nie trybi tak jak powinna. Wie ktoś może gdzie tu jest błąd? 

#include <iomanip>
#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int hrs=0;
int mins=0;
int sec=0;

void ShowClock() {
    system("cls");
    cout << "           "<< " CLOCK \n";
    cout << hrs << " Hours  ";
    cout << mins << " Minutes  ";
    cout << sec << " Seconds ";
}

void Clock() {
    for (int i=hrs; i<=24; i++) {
        ShowClock();
        Sleep(10);
        sec++;

        if (sec == 60) {
            mins++;
            if (mins == 60) {
                hrs++;
                mins = 0;
            } sec = 0;
        }
    }
}

int main() {
   Clock();

   return 0;
}

powinien program się skończyć, jeśli dojdzie zmienna hrs do 24'rech, a jednak zatrzymuje się, jeśli sekundy dojdą do 24. Z góry dzięki za pomoc ;)

2 odpowiedzi

+3 głosów
odpowiedź 20 lutego 2021 przez Wiciorny Ekspert (269,120 p.)
wybrane 20 lutego 2021 przez Nabuchadonozor
 
Najlepsza

Program nie bazuje na sekundach tzn nie kończy się na 24 sekundach, tylko 24 iteracjach 

int i=hrs; i<=24; i++

) tylko pętla przechodzi 24 razy  od 0 - > 24  bo nie zważając na operacje i dane po każdym przejściu masz i++ :) a i <= 24... stąd przejdzie od hrs=0 do i = 24 czyli 24 razy 
Każde rozpoczęcie pętli nie przywraca ci I do 0, i nie staruje iteracji od hrs.  Iteracja startuje raz  potem nie modyfikujesz zmiennej i, wiec ona jest podyktowana ilością operacji (i<=24) 

Możesz użyć pętli while hrs <24 np :) lub 

1
komentarz 20 lutego 2021 przez Nabuchadonozor Gaduła (3,120 p.)
Kurcze coś w tym jest, ale może przez alkohol nie potrafię zrozumieć, trochę zabalowałem dziś, dam Ci naj i jutro to zbadam, bo wydaje mi się to proste i w miare rozumiem co napisałeś, ale ciężko mi wydedukować co zmienić, by to naprawić. W razie problemów jutro się odezwę, ale i tak dzięki ;)
komentarz 20 lutego 2021 przez VBService Ekspert (251,170 p.)
edycja 20 lutego 2021 przez VBService

Tak na marginesie ...
od i=0 do i<=24 masz 25 inkrementacji od 0, 1 ..., 24.  wink

#include <iostream>

int main()
{
    int i;
    
    std::cout << "i<=" << std::endl;
    for (i=0; i<=24; i++) {
        std::cout << i << " ";
        if (i == 9) std::cout << " ";
    }
        
    std::cout << std::endl;    
        
    for (i=0; i<=24; i++)
        std::cout << i+1 << " ";
       
    std::cout << std::endl << std::endl;

    std::cout << "i<" << std::endl;    
    for (i=0; i<24; i++) {
        std::cout << i << " ";
        if (i == 9) std::cout << " ";
    }
        
    std::cout << std::endl;    
        
    for (i=0; i<24; i++)
        std::cout << i+1 << " "; 

    return 0;
}

komentarz 20 lutego 2021 przez Nabuchadonozor Gaduła (3,120 p.)
jeszcze nie wytrzeźwiałem do końca, ale tam i tak jest i=hrs, nie i=0 (nie bierz tego za złe mi, jeszcze napisałem nie mile, choć mam nadzieję, że to tak nie zabrzmiało)
komentarz 20 lutego 2021 przez Nabuchadonozor Gaduła (3,120 p.)
dajcie mi czas do jutra, aż wytrzeźwieje, bo trochę ciężko dziś mi się myśli xd
komentarz 20 lutego 2021 przez VBService Ekspert (251,170 p.)

Napisałem  wink

więc odniosłem się w ogóle do idei używania i< czy i<=.  laugh

0 głosów
odpowiedź 20 lutego 2021 przez VBService Ekspert (251,170 p.)
edycja 21 lutego 2021 przez VBService

Według definicji sleep, przyjmuje wartość w sekundach, czyli "tik" w Twoim programie powinien być

sleep(1);
sec++;

żeby inkrementować zmienną sec co 1 sekundę.  wink

jeżeli inkrementujesz inne zmienne w oparciu o wartość zmiennej sec w tym konkretnym przypadku to

for (int i=hrs; i<=24; i++)

nie ma sensu

powinna zawierać np. dla 1h - 3600 sec. lub dla 24h - 86400 sec

pętla poniżej działa przez godzinę.  wink

#include <iostream>
#include <iomanip>
#include <windows.h>
 
using namespace std;

int main()
{
    int hrs=0, min=0, sec=0;
    
    for (int i=0; i<3600; i++) {
        system("cls");
    
        sec++;

        if (sec == 60) {
            sec = 0;
            min++;

            if (min == 60)
            {
                min = 0;
                hrs++;

                if (hrs == 24) hrs = 0;
            }
        }
    
        cout << setfill('0') << setw(2) << hrs << ":"
             << setfill('0') << setw(2) << min << ":"
             << setfill('0') << setw(2) << sec;
    
        sleep(1);
    }
    
    return 0;
}

albo pętla while  wink

#include <iostream>
#include <iomanip>
#include <windows.h>
 
using namespace std;

int main()
{
    int hrs=0, min=0, sec=0;
    
    while (true) {
        system("cls");
    
        sec++;

        if (sec == 60) {
            sec = 0;
            min++;

            if (min == 60)
            {
                min = 0;
                hrs++;

                if (hrs == 24) hrs = 0;
            }
        }
    
        cout << setfill('0') << setw(2) << hrs << ":"
             << setfill('0') << setw(2) << min << ":"
             << setfill('0') << setw(2) << sec;
    
        sleep(1);
        
        if (hrs == 1) break; // po 1h wypad ;-)
    }
    
    return 0;
}
using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int hrs = 0, min = 0, sec = 0;
            Console.CursorVisible = false;

            while (true)
            {
                sec++;

                if (sec == 60)
                {
                    sec = 0;
                    min++;

                    if (min == 60)
                    {
                        min = 0;
                        hrs++;

                        if (hrs == 24) hrs = 0;
                    }
                }

                Console.Write("{0:00}:{1:00}:{2:00}", hrs, min, sec);                

                Thread.Sleep(1000); // c# Sleep(Int32 milliseconds)
                Console.Clear();

                if (hrs == 1) break;
            }
        }
    }
}

a tu bez użycia <windows.h>  wink

#include <iostream>
//#include <windows.h>
#include <curses.h>
#include <thread>
#include <chrono>
 
using namespace std;

int main()
{
    int hrs=0, min=0, sec=0;
    initscr();
    
    while (true) {
        //system("cls");
        clear();
    
        sec++;

        if (sec == 60) {
            sec = 0;
            min++;

            if (min == 60)
            {
                min = 0;
                hrs++;

                if (hrs == 24) hrs = 0;
            }
        }
    
        printw("%02d:%02d:%02d", hrs, min, sec);
        refresh();
    
        //sleep(1);
        this_thread::sleep_for (chrono::seconds(1));
        
        if (hrs == 1) break; // po 1h wypad ;-)
    }
    
    endwin();
    return 0;
}

 

Podobne pytania

0 głosów
3 odpowiedzi 387 wizyt
pytanie zadane 22 kwietnia 2016 w C i C++ przez marcin8352 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 9 sierpnia 2018 w Java przez DedenN Początkujący (400 p.)
0 głosów
2 odpowiedzi 160 wizyt
pytanie zadane 12 września 2020 w Systemy CMS przez nowyklemens Początkujący (430 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...