Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Sekunnit muotoon w d h min s

Resiina [11.11.2007 21:54:33]

#

Tässä tällainen aloittelijaystävällinen koodivinkki luultavasti riittävän hyvin kommentoituna ja muutenkin selvänä.
Funktion tarkoituksenahan on siis muuttaa sekunnit muotoon: viikot vuorokaudet tunnit minuutit sekunnit (w d h min s) string-merkkijonoksi. Nimi tälle funktiolle tulee siitä, että mIRC scriptissä on juuri samanlainen $duration(), niin päätinpä kääntää sen C++:lle.

PS. Tämä on ensimmäinen koodivinkkini. :-)

duration.h

std::string duration(const int sekunnit)
{
    std::string palaute;        // funktion palautettava arvo
    char temp[100] = { 0 };     // sprintf tarvitsee char-taulukon parametrikseen

    int w = 0,                  // viikot
        d = 0,                  // vuorokaudet
        h = 0,                  // tunnit
        min = 0,                // minuutit
        s = sekunnit;           // sekunnit

    if (sekunnit < 0) s *= -1;  // jos parametrina on annettu negatiivinen luku, käännetään se positiiviseksi

    while (s >= 60*60*24*7)     // 60 sekuntia * 60 (minuutit) * 24 (tunnit) * 7 (vuorokaudet) = viiko
    {
        w++;                    // lisätään viikkoja ja
        s -= 60*60*24*7;        // vähennetään sekunteja yhden viikon verran
    }                           // kunnes on siirryttävä vuorokausiin, jolloin sekunteja
                                // ei voida enää kokonaisina viikkoina ilmoittaa

    while (s >= 60*60*24)       // 60 sekuntia * 60 (minuutit) * 24 (tunnit) = vuorokausi
    {
        d++;                    // lisätään vuorokausia ja
        s -= 60*60*24;          // vähennetään sekunteja yhden vuorokauden verran
    }                           // kunnes on siirryttävä tunteihin, jolloin sekunteja
                                // ei voida enää kokonaisina vuorokausina ilmoittaa

    while (s >= 60*60)          // 60 sekuntia * 60 (minuutit) = tunti
    {
        h++;                    // lisätään tunteja ja
        s -= 60*60;             // vähennetään sekunteja yhden tunnin verran
    }                           // kunnes on siirryttävä minuutteihin, jolloin sekunteja
                                // ei voida enää kokonaisina tunteina ilmoittaa

    while (s >= 60)             // 60 sekuntia = minuutti
    {
        min++;                  // lisätään minuutteja ja
        s -= 60;                // vähennetään sekunteja yhden minuutin verran
    }                           // kunnes on enää alle 60 sekuntia jäljellä, jolloin sekunteja
                                // ei voida enää kokonaisina minuutteina ilmoittaa

    if (w)                      // jos parametrina annettu aika on yksi viikko tai enemmän,
    {                           // lisätään viikot funktion arvoon
        sprintf(temp, "%iw ", w);
        palaute += temp;
    }

    if (d)                      // jos parametrina annettu aika on yksi vuorokausi tai enemmän,
    {                           // lisätään vuorokaudet funktion arvoon
        sprintf(temp, "%id ", d);
        palaute += temp;
    }

    if (h)                      // jos parametrina annettu aika on yksi tunti tai enemmän,
    {                           // lisätään tunnit funktion arvoon
        sprintf(temp, "%ih ", h);
        palaute += temp;
    }

    if (min)                    // jos parametrina annettu aika on yksi minuutti tai enemmän,
    {                           // lisätään minuutit funktion arvoon
        sprintf(temp, "%imin ", min);
        palaute += temp;
    }

    sprintf(temp, "%is", s);    // sekunnit lisätään aina funktion arvoon
    palaute += temp;

    if (sekunnit < 0)           // jos parametrina annettu aika on negatiivinen,
        palaute = "-" + palaute;// lisätään miinusmerkki ennen lukua

    return palaute;             // palautetaan sekunnit muodossa w d h min s
}

funktion käyttö

#include <iostream>
#include "duration.h"

using namespace std;

int main()
{
    cout<<duration(2231234); // tulostaa 3w 4d 19h 47min 14s
    return 0;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta