Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: koneen käynnissäoloaika

hohoo [01.02.2010 23:06:29]

#

#include <windows.h>
#include <string>
#include <sstream>
using namespace std;

string IntToString ( int number )
{
  ostringstream oss;

  oss<< number;

  return oss.str();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
	int kokonaisaika;
	int paivat;
	int tunnit;
	int minuutit;
	int sekunnit;
	string str_paivat;
	string str_tunnit;
	string str_minuutit;
	string str_sekunnit;
	string teksti;

	kokonaisaika = GetTickCount();
	kokonaisaika = kokonaisaika / 1000;

	paivat = kokonaisaika / 86400;
	kokonaisaika =  kokonaisaika - paivat * 86400;
	str_paivat = IntToString(paivat);

	tunnit = kokonaisaika / 3600;
	kokonaisaika = kokonaisaika - tunnit * 3600;
	str_tunnit = IntToString(tunnit);

	minuutit = kokonaisaika / 60;
	kokonaisaika = kokonaisaika - minuutit * 60;
	str_minuutit = IntToString(minuutit);

	sekunnit = kokonaisaika;
	str_sekunnit = IntToString(sekunnit);

	teksti = "Järjestelmä on ollut käynnissä " + str_paivat + " päivää, " + str_tunnit + " tuntia, " + str_minuutit + " minuuttia ja " + str_sekunnit + " sekuntia.";

    MessageBoxA(NULL, teksti.c_str(), "Järjestelmän käynnissäoloaika", MB_ICONINFORMATION);
    return 0;
}

Menikö oikein? Parannettavaa?

Metabolix [01.02.2010 23:59:14]

#

Voit testata laskujen oikeellisuuden helposti sijoittamalla koodin alussa valmiin arvon kokonaisajaksi.

kokonaisaika = GetTickCount() / 1000;
// testi: 17 pv, 13 t, 11 min, 7 s
kokonaisaika = 7 + 60 * (11 + 60 * (13 + 24 * 17));

GetTickCount palauttaa etumerkittömän kokonaisluvun. Kannattaisi vaihtaa kokonaisaika-muuttujan (ja ehkä muidenkin) tyypiksi DWORD (32-bittinen unsigned int). GetTickCount pyörähtää sitten joka tapauksessa ympäri 49,7 vuorokauden paikkeilla, kun DWORD-tyypin lukualue loppuu.

Tekstin muodostaminen kävisi helpommin ilman tuota muunnosfunktiota, ja samalla pääsisit ylimääräisistä muuttujista eroon.

std::ostringstream teksti;
teksti << "Järj..." << paivat << " pv, " << tunnit << " t, ...";
MessageBoxA(0, teksti.str().c_str(), "...", MB_ICONINFORMATION);

Voit harjoituksena kokeilla myös laskujen järjestyksen vaihtamista:

sekunnit = aika % 60;
aika /= 60;
// minuutit ja tunnit samalla tavalla, päivät jäävät jäljelle.

Vastaus

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

Tietoa sivustosta