Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Oma muuttuja ajalle? (c++)

Sivun loppuun

Tumpelo [04.12.2005 17:58:38]

#

Onko siis aikaa varten tehty oma muuttuja, ei nääs oikein onnistu noilla perusmuuttujilla ajan laskeminen ja ilmoittaminen.

sqwiik [04.12.2005 18:55:42]

#

Jep. Rakenne on nimeltään tm, ja se on määritelty time.h:ssa (ainakin pikaisesti vilkaistuna). tm-rakenteen sisällön pitäisi olla listattuna jossain päin nettiä.
Esim

#include <time.h>
  tm * aika;
  time_t t;
  aika = localtime(&t):

Tumpelo [04.12.2005 19:02:12]

#

Um, melkein ymmärsin tuosta jotakin. :D Tarvitsen siis vain muuttujatyypin joka on ajan muodossa, siis tyyliin "kierrosaika = 4.51,765". tjsp

sqwiik [04.12.2005 19:31:34]

#

Aa, no sitten. Riippuen ajan tarkkuudesta, clock_t tai time_t. clock_t:llä saa myös sekunnin murto-osia, time_t:llä sekunnin tarkkuudella.
clock_t palauttaa 'tick':it ohjelman alusta lukien; time palauttaa sekunnit tammikuusta 1970 lähtien.
clock_t:n lukeman saa sekunneiksi jakamalla sen makrolla CLK_TCK.

#include <time.h>
  clock_t aika, aika_alku;
  aika_alku = clock();
  while(1){
    aika_nyt = clock();
    printf("Aika kuluu, se on %d.\n", (aika - aika_alku)/CLK_TCK);
  }

Tumpelo [04.12.2005 19:38:59]

#

Hmm, näyttää olevan tuo sun koodi C:tä (kaskun vaikuttikin vähän oudolle), mutta sen muuttujan ei tarvitse palauttaa yhtään mitään, sen pitää siis vain olla tavallinen muuttuja joka on muotoa "mm.ss.sekunnin murto-osat"... Joko löytyis oikea vastaus? :P

sqwiik [04.12.2005 19:56:10]

#

Tuollaista systeemiä ei uskoakseni standardissa ole mukana... Ja äkkiähän sen itsekin koodaa -_=.
Ja tuo toimii samalla tavalla myös C++:ssa (katsoin c++ -ohjetiedostosta). Tässä ihan alkuun pääsemiseksi tuon clock-t:n aikaeron muuntaminen muotoon mm:ss:murto:

// Kentän alussa asetettu:
aika_alku = clock();
...
...
// Otetaan aikaero tikkeinä
clock_t ero = clock() - aika_alku;
int min, sec, mm;
// Nykyinen aikaero sekunteina (esim. 64.336514)
double murto = (double)ero / CLK_TCK;
// Kokonaisosa talteen (esim. 64)
sec = (int)(murto);
// murto-muuttujaan desimaalit (- sekunnit), esim .336514
// ja sitten haluttuun tarkkuuteen pyöristys, tässä 2
// desimaalin tarkkuudella eli * 100 ja pyöristys.
// Tässä nyt esim. .336514 => 34
mm = (int)(((murto - (double)sec) * 100) + 0.5);
// Minuutit taas ovat... sekunnit jaettuna 60:llä,
// esim. tässä 64 / 60 = 1.06666... => 1
min = (int)((double)sec / 60);
// Ja lopuksi minuutit pois sekunneista, esim. täss nyt
// sitten 64 - 1 * 60 = 4.
// Lopputuloste: 1:4.34
sec -= (min * 60);
cout<<min<<":"<<sec<<"."<<mm<<endl;
...

Tumpelo [04.12.2005 20:03:44]

#

Joo antaa olla, tuokaan ei ihan vastaa tarpeitani... Pitää kehitellä joku oma patentti.

Metabolix [04.12.2005 20:14:00]

#

Ei sellaista ole olemassa. Joko teet sen (vaikka luokkana) tai teet tähän tapaan:

// TAika on sama kuin int
typedef int TAika;

// Muutetaan annetut ajanpalaset pelkiksi tuhannesosiksi
TAika Tee_Aika(int tunnit, int minuutit, int sekuntit, int tuhannesosat)
{
    return (tuhannesosat + (1000 * (sekuntit + (60 * (minuutit + (60 * tunnit))))));
}

// Tulostetaan aika oikein
char * Tulosta_Aika(TAika Aika)
{
    // Tulostetaan aika
    cout << ((int)Aika / (1000*60*60))
        << ":" << (((int)Aika / (1000*60)) % 60)
        << "." << (((int)Aika / (1000)) % 60)
        << "," << ((int)Aika % 1000);

    // Palautetaan "merkkijono", jossa ei ole mitään
    static char palautettava = 0;
    return &palautettava;
}

int main(void)
{
    TAika Aika;
    Aika = Tee_Aika(10, 50, 36, 1928);

    // Tyhjän palautusarvon avulla voidaan tämäkin laitta cout-pötköön
    cout << Tulosta_Aika(Aika) << "\n";
    return 0;
}

Tietenkin "oikeampi" tapa olisi tehdä luokka, jossa olisi kaikki tarvittava siistimmin, mutta sen saat ihan itse kehittää.

Edit: Jeps, hidas taas. Mutta kannattaa varmaan se luokka tehdä. Ei siinä kauan kestäisi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta