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

Program liczący aktualną datę

Object Storage Arubacloud
+4 głosów
810 wizyt
pytanie zadane 16 kwietnia 2016 w C i C++ przez Wirla Nowicjusz (180 p.)
edycja 23 czerwca 2021 przez Wirla

Jestem nowa, to moje pierwsze pytanie. I z góry przepraszam, jeżeli dałam do złego wątku, jednak nie widzę za dużej różnicy pomiędzy kategorią 'nasze projekty', a 'programowanie'. Ja chcę się tutaj pochwalić, ale i zapytać, więc wybrałam kategorię 'programowanie'.

O co ogólnie chodzi? A więc po obejrzeniu 5 (i pół 6) odcinków z kanału na youtubie postanowiłam stworzyć samodzielny projekt. Nie do końca ogarnęłam tablice, więc nie użyłam ich w tym programie. Jego zadaniem było pokazanie i liczenie aktualnej godziny, po podaniu przez użytkownika czasu. No i prezentuje się tak:

 

cout << "Ktora jest godzina?" << endl;
            cout << "Najpierw wpisz godzine, nastepnie minuty, a potem sekundy" << endl;
            cout << "Przyklad 13, 22 i 49" << endl;
            cout << "Napisz godzine w formacie 24 godzinnym" << endl;
            cout << "Godzina: ";
            cin >> h;
            cout << "Minuta: ";
            cin >> minu;
            cout << "Sekunda: ";
            cin >> s;

            Sleep(1000);
            system("cls");

            for (;;)
            {
                if (s<60)
                {
                    if (minu<60)
                    {
                        if (h<24)
                        {
                            if (h<10)
                                cout << "0";
                            cout << h << ":";
                            if (minu<10)
                                cout << "0";
                            cout << minu << ":";
                            if (s<10)
                                cout << "0";
                            cout << s << endl;
                            s++;
                            Sleep(1000);
                            system("cls");
                        }
                        else
                        {h=0;}
                    }
                    else
                    {h++; minu=0;}
                }
                else
                {minu++; s=0;}
            }

(Oczywiście zmienne i reszta są, ale to za chwilę) Program działa perfekcyjnie. I tu pojawia się moje pierwsze pytanie dotyczące programowania, czy można ten kod skrócić? Wystarczy mi odpowiedź, że można np. używając tablic (Da mi to do zrozumienia, żebym kiedyś wróciła i skróciła ten program)

Teraz dalsza część. Pokazałam program bratu, który postanowił podnieść mi poprzeczkę i poprosił o zrobienie programu pokazującego datę i godzinę. Myślę sobie "Dobra, zrobię to ze switch case". Wszystko jest ok, do momentu kiedy zabieram się za programowanie daty. Chciałam zrobić kopiuj, wklej, ale szybko się zorientowałam, że muszę napisać od początku. Problem natrafiam już z ustaleniem roku. A mianowicie czy jest on przestępny czy nie. Wiem, że do obliczenia jego przestępności jest potrzebny warunek podzielności przez 4. Jednak jest pewien podstęp, jeżeli rok dzieli się przez 100, to nie jest przestępny. A jeżeli dzieli się przez 400, to jednak znowu jest. Moje pytanie to jak stworzyć warunek, który sprawdza, czy rok jest przestępny. Jeżeli ktoś zna jakiegoś linka do dobrego tłumaczenia jak to zrobić albo potrafi to wytłumaczyć to będę bardzo wdzięczna. I prosiłabym tłumaczyć na język ludzki, z drobnym użyciem słów będących w odcinkach 1-6.

No i mój aktualny kod, nad którym zaczęłam pracować wygląda tak: 

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

using namespace std;

int h;
int minu;
int s;
int d;
int mie;
int r;
char wybor;

int main()
{
    cout << "=====================" << endl;
    cout << "1. Godzina" << endl;
    cout << "2. Data" << endl;
    cout << "3. Data i godzina" << endl;
    cout << "=====================" << endl;
    cin >> wybor;

    wybor=getch();

    switch(wybor)
    {
        case '1':
        {
            cout << "Ktora jest godzina?" << endl;
            cout << "Najpierw wpisz godzine, nastepnie minuty, a potem sekundy" << endl;
            cout << "Przyklad 13, 22 i 49" << endl;
            cout << "Napisz godzine w formacie 24 godzinnym" << endl;
            cout << "Godzina: ";
            cin >> h;
            cout << "Minuta: ";
            cin >> minu;
            cout << "Sekunda: ";
            cin >> s;

            Sleep(1000);
            system("cls");

            for (;;)
            {
                if (s<60)
                {
                    if (minu<60)
                    {
                        if (h<24)
                        {
                            if (h<10)
                                cout << "0";
                            cout << h << ":";
                            if (minu<10)
                                cout << "0";
                            cout << minu << ":";
                            if (s<10)
                                cout << "0";
                            cout << s << endl;
                            s++;
                            Sleep(1000);
                            system("cls");
                        }
                        else
                        {h=0;}
                    }
                    else
                    {h++; minu=0;}
                }
                else
                {minu++; s=0;}
            }
        }
        case '2':
        {
            cout << "Jaka jest dzisiaj data?" << endl;
            cout << "Najpierw wpisz dzien, nastepnie miesiac, a potem rok" << endl;
            cout << "Przyklad 13, 9 i 2016" << endl;
            cout << "Napisz godzine w formacie 24 godzinnym" << endl;
            cout << "Dzien: ";
            cin >> d;
            cout << "Miesiac: ";
            cin >> mie;
            cout << "Rok: ";
            cin >> r;

            Sleep(1000);
            system("cls");

            for (;;)
            {
                if (???)
     
    }
}

Jak widać nie zrobiłam za dużo z poprzednim kodem :v

Pozdrawiam,

Wirla

 

 

Trochę lat minęło i w międzyczasie ten program napisałam, więc wkleję go tutaj jeżeli ktoś jest zainteresowany :D

 

#include <iostream>
#include <ctime>

using namespace std;

int czas, dni, month;

int main(){
    czas = time(0);
    dni = (czas % 31557600) / 86400;
    for (month = 1; dni > 27; month++) {
        if(month == 11 || month == 9 || month == 6 || month == 4) dni -= 30;
        else if(month == 2)
            if(((czas / 31557600 + 1970) % 4 == 0 && (czas / 31557600 + 1970) % 100 != 0) || (czas / 31557600 + 1970) % 400 == 0) dni -= 29;
            else dni -= 28;
        else dni -= 31;
    }

    if(dni < 10) cout << "0";
    cout << dni << ":";
    if(month < 10) cout << "0";
    cout << month << ":";
    cout << (czas / 31557600) + 1970 << " ";
    if((czas / 3600) % 24 + 2 < 10) cout << "0";
    cout << (czas / 3600) % 24 + 2 << ":";
    if((czas / 60) % 60 < 10) cout << "0";
    cout << (czas / 60) % 60;

return 0;
}

 

4 odpowiedzi

+2 głosów
odpowiedź 16 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
edycja 16 kwietnia 2016 przez Aisekai

Jednak jest pewien podstęp, jeżeli rok dzieli się przez 100, to nie jest przestępny. A jeżeli dzieli się przez 400, to jednak znowu jest.

 Właśnie sobie napisałaś go tylko słownie. 

 if((rok%4==0 && rok%100!=0) || rok%400==0) 

Nie wiem czy już było o && i || w tutorialu p. Zelenta, jeśli nie to:

- && oba warunki muszą być spełnione aby cały warunek był prawdziwy

- || tylko jeden z warunków musi być spełniony aby warunek był prawdziwy.

 

edit: jak znajdę czas, to pomyślę nad resztą

komentarz 16 kwietnia 2016 przez Wirla Nowicjusz (180 p.)

Właśnie sobie czytałam o wklejaniu gotowców. Myślę sobie "człowiek, który to pisze mądrze gada". Potem widzę, że dostałam odpowiedź, a tam gotowiec. Ech... Odsyłam to tego co czytałam: http://forum.pasja-informatyki.pl/127421/moja-wizja-gotowcow

Jednak nie jestem idiotką i podejmę się zadania przeczytania tego kodu. Popraw mnie, jeżeli źle myślę. 

A więc... (chwila, % to była reszta z dzielenia .-. Jednak jestem idiotką, że o tym zapomniałam. Teraz wszystko już jest logiczne)<-- moje myśli z przed chwili. Problem w istocie banalny, jednakże dałeś mi właśnie takiego gotowca. Preferowałabym odpowiedź w stylu "Znakiem reszty z dzielenia jest %, a więc wystarczy napisać, że reszta z dzielenia jest równa, bądź różna od zera" Jakkolwiek logiczne i proste to dla ciebie nie jest, dla takiej początkującej jak ja jest wręcz idealne. 

Aczkolwiek i tak dziękuję za odpowiedź :D Nadal pozostaje pytanie, czy pierwszy kod można skrócić. Jeżeli ktoś zna odpowiedź, to prosiłabym o jej udzielenie tak jak napisałam u góry ;)

Pozdrawiam, Wirla

komentarz 16 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Tzn to co Ci dałem wcześniej, to był tylko dla przypadków 100,200,300 etc. Zmieniłem go na taki jaki powinien być. Przepraszam za wprowadzenie w błąd.
+1 głos
odpowiedź 16 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
1. Nie oszczędzaj miejsca na dysku i zmienne nazywaj tak, aby mówiły czym są czyli pełne nazwy, jeśli będzie w niej kilka wyrazów to następny wyraz pisz z dużej litery np. toJestZmienna;

2. Nie twórz zimennych globalnych czyli twórz w int main(){} ale jeśli nie nadasz jej wartośći potem to przy deklaracji dopisz  = 0 np. int zmienna = 0;

3. Tu masz informacje o tym jak sprawdzić rok przestępny w C++: http://www.algorytm.edu.pl/instrukcjawarunkowa/25-rok-przestpny.html
komentarz 16 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
3. No właśnie nie. Bo rok 100 nie jest przestępny. Zapomniałeś o tym co napisała w swoim poście, czy też ja zacytowałem.
komentarz 16 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
Wiem, właśnie zmieniłem
komentarz 16 kwietnia 2016 przez Wirla Nowicjusz (180 p.)
Dziękuję z całego serca za linka :D

Jeżeli chodzi o 1, to nie oszczędzam miejsca na dysku, a w głowie, ponieważ jestem leniwa. Wpisywanie całej zmiennej jest dla mnie męczące. I wiem, że mogę sobie pozwolić na robienie zmiennych typy h, r czy s kiedy liczę godzinę, ponieważ automatycznie myślę o jednostkach czasu. Wybór już napisałam cały, ponieważ to nijak nie ma się do czasu i potem bym tego nie zrozumiała :)

Co do 2 to podwoiłeś moje pytania. Pierwsze to dlaczego mam robić tak jak napisałeś i w czym to jest lepsze od tego co ja zrobiłam. Z góry dziękuję za odpowiedź.

Za 3 już podziękowałam :D

Pozdrawiam,

Wirla
komentarz 16 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
1. Bardziej męczące będzie zastanawianie się potem do czego służy zmienna :D

2. Wiem, że nie zrozumiesz co teraz piszę, ale może ciebie pokusić do użycia tej zmiennej globalnej w funkcji zamiast przesłania przez argument. Taka zmienna, której potem nie będziesz używała będzie dalej w pamięci. Zmienne umieszczaj przed miejscem gdzie ich wykorzystujesz, ale to nie znaczy, żeby wszędzie umieszczać ich definicje(typ zmienna;)

Kod nie tylko musi działać, ale musi być zrozumiały przez innego programistę.
komentarz 16 kwietnia 2016 przez Wirla Nowicjusz (180 p.)
W sensie, żeby nie tworzyć zmiennych na samym początku programu, tylko w pętli, w której ich używam? Tak to zrozumiałam.

(Jedynki już nie będę męczyć, ale muszę przyznać ci rację. Kiedyś stworzyłam zmienną spr, która oczywiście znaczyła sprawdzenie, ale dojście do tego co sprawdza zajęło mi około 10 minut i dużo nerwów [A ona po prostu kończyła nieskończoną pętlę :v])

A mój program jest zrozumiały? Wiem, że marnuję miejsce robiąc tyle spacji, jednak dla mnie jest tak estetyczniej. I czy potrafisz odpowiedzieć na pytanie, czy pierwszy kod da się skrócić.

Wirla
komentarz 16 kwietnia 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
Nie, jeśli zmienne będziesz chciała używać w TYLKO w pętli to tam je tworzysz, ale jeśli w kilku miejscach to tworzysz przed pierwszym użyciem, ale nie w pętli, żeby były potem widoczne. W twoim wypadku zmienne przenieś na sam początek int main(). A co do skracania kodu to możesz spróbować przeroić ten kod: https://www.youtube.com/watch?v=I_vW4KQ99Yk z timera
+1 głos
odpowiedź 19 kwietnia 2016 przez Tomasz gajda Nowicjusz (160 p.)
int-y zapisz po przecinku zajmie to mniej miejsca
0 głosów
odpowiedź 17 kwietnia 2016 przez Marcin Soczówka Użytkownik (590 p.)
edycja 17 kwietnia 2016 przez Marcin Soczówka

Chcesz żeby Cię naprowadzić ale nie pokazywać rozwiązania? Ok, przerobiłaś odcinki od 1 do 6 więc podpowiedź brzmi 1970:). 

Teraz dalsza część. Pokazałam program bratu, który postanowił podnieść mi poprzeczkę i poprosił o zrobienie programu pokazującego datę i godzinę. 

Dopytaj może brata o co mu dokładnie chodziło bo ja go np zrozumiałem tak, że odpalasz kompilację programu i w czarnym okienku bez wpisywania czegokolwiek masz wyświetlony rok, miesiąc, dzień, godzinę, minuty i sekundy +/- 5 s.

komentarz 17 kwietnia 2016 przez Wirla Nowicjusz (180 p.)
Szczerze, to nie za bardzo zrozumiałam twój komentarz. Jakbyś tak mógł mi go lepiej wytłumaczyć to byłabym wdzięczna. (Czasem lepiej jest do mnie mówić jak do pięcioletniego dziecka, wtedy masz pewność że zrozumiem :v Mózg mi się często lasuje .-.)
komentarz 17 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Jest funkcja, która podaje ile czasu upłynęło od 1.01.1970r , nie pamiętam dokładnie jaka, pewnie o to chodziło Soczowka'ce.
komentarz 17 kwietnia 2016 przez Marcin Soczówka Użytkownik (590 p.)
Zgadza się:). W odcinku 4 kursu Zelenta masz o niej więcej powiedziane.
komentarz 17 kwietnia 2016 przez Wirla Nowicjusz (180 p.)
Ach, o to chodziło. Nie, też się go zapytałam, czy to ma być normalny zegar, ale odpowiedział, że ma liczyć czas od podanej przez użytkownika godziny. W sensie program pyta się, która jest godzina, a potem zaczyna liczyć w nieskończoność. Od taki projekt na sprawdzenie i przetestowanie umiejętności :) (Zrobienie normalnego zegara polegałoby tylko na podzieleniu otrzymanego czasu i systematycznemu dodawaniu. Przyznam, że byłby bardzo podobny :>) A to podniesienie poprzeczki polega na zrobieniu daty używając tej samej metody. Program się pyta od której daty ma zacząć i liczy :P

Podobne pytania

0 głosów
1 odpowiedź 103 wizyt
pytanie zadane 8 czerwca 2019 w JavaScript przez aniaska4 Obywatel (1,010 p.)
+1 głos
1 odpowiedź 265 wizyt
0 głosów
1 odpowiedź 244 wizyt

92,566 zapytań

141,420 odpowiedzi

319,604 komentarzy

61,952 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...