Generowanie daty, sortowanie po dacie

0

Witam wszystkich.
Jestem początkującym programistą. Mam do zrobienia mały projekt. Wyglądać to ma w następujący sposób: program (o miłej nazwie "Alkomat"), napisany w C++ ma wygenerować do pliku 8760 liczb pseudolosowych (symulacja 24 pomiarów dziennie przez 365 dni roku, przyjmując pomiary przeprowadzane od 1 stycznia do 31 grudnia). Przykład:
(...)
07.11.2014 6523
07.11.2014 5321
07.11.2014 1394
itd (...)

Pomiary mają być później posortowane dniami (od najmniejszej do największej wartości danego dnia - od 1 stycznia do 31 grudnia).
Oczywiście, wygenerowanie liczb, zapis do pliku, później odczyt z pliku i sortowanie po tychże liczbach jest proste i to udało mi się zrobić. Od dłuższego czasu stoję nad problemem wygenerowania dat. Domyślam się, że najlepiej byłoby stworzyć dwuwymiarową tablicę stringów, gdzie pierwsza kolumna byłaby datą, a druga pomiarem, ale niestety nie wiem jak się za to zabrać. Próbowałem zasięgnąć forów polsko i anglojęzycznych, niestety nie znalazłem rozwiązania mojego problemu. Podejrzewam, że da się wygenerować te daty przy pomocy gotowej biblioteki. Z góry dziękuje za pomoc i pozdrawiam.

Poniżej przedstawiam mój kod bez funkcji sortujących, które nie mają związku z problemem. Do każdego z tych 8760 pomiarów chciałbym dorzucić datę, ale niestety nie mogę znaleźć optymalnego rozwiązania...

int main()
{
	const int iloscProbek = 8760;
	int input = 0;
	int wartosci[iloscProbek];
	fstream plik;
	boolean flag; // pomocnicza zmienna ulatwiajaca sprawdzenie czy zbior juz byl sortowany
	

	SYSTEMTIME st;
	GetLocalTime(&st);
	int godzina = st.wHour;
	int minuta = st.wMinute;
	int sekunda = st.wSecond;
	int dzien = st.wDay;
	int miesiac = st.wMonth;
	int rok = st.wYear;
	srand(time(0));


	while (input !=5) 
	{
		cout << endl << endl << "ALKOMAT - MENU GLOWNE" << endl;
		cout << "__________________" << endl << endl;
		cout << "1. GENEROWANIE DANYCH" << endl;
		cout << "2. SORTOWANIE BABELKOWE" << endl;
		cout << "3. SORTOWANIE PRZEZ WSTAWIANIE" << endl;
		cout << "4. SORTOWANIE PRZEZ WYBOR" << endl;
		cout << "5. WYJSCIE" << endl;
		cout << "__________________" << endl << endl;
		cout << "Wybierz opcje" << endl;

		//*****************************************************sprawdzenie poprawnosci danych wejsciowych
		while (true) 
		{	
			cin >> input;
			if (cin.peek() == '\n' && cin.good())
				break;
			cout << "Cos poszlo zle. Wybierz opcje ponownie: " << endl;
			cin.clear();
			do
			{
				cin.ignore(numeric_limits<streamsize>::max(), '\n');
			} while (!cin);
		}  // ---------------------------------------------------------------------------------------------		
		
		//*************************************************obsluga MENU
		switch (input) {
			case 1:
				plik.open("pomiary.txt", ios::out);
				plik << "| LABORATORIUM JPO | Losowe wartosci utworzono: " << dzien << "." << miesiac << "." << rok <<"  " << godzina << ":" << minuta << ":" << sekunda << endl;
				
				//Generowanie świeżego pomiaru
				for (int i = 0; i < iloscProbek; i++)
				{
					wartosci[i] = 0;
				}

				for (int i = 0; i < iloscProbek; i++)
				{
					wartosci[i] = rand() % 10000;
					plik << wartosci[i] << endl;
				}
				plik.close();
				plik.clear();
				flag = false;
				cout << "Wygenerowano losowe wartosci" << endl;	
				break;

1

Wymaga C++11

#include <ctime>
#include <chrono>
#include <vector>
#include <random>
#include <iostream>

using namespace std::chrono;

int main() {
    const int beginYear = 2014, beginMonth = 11, beginDay = 7;
    
    tm _tm = {0};
    _tm.tm_year = beginYear - 1900;
    _tm.tm_mon  = beginMonth - 1;
    _tm.tm_mday = beginDay;
   
    std::time_t cpoint = mktime(&_tm);     
    system_clock::time_point point = system_clock::from_time_t(cpoint);

    const int samplesCount = 3;
   
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(-666, 666);

    for(int i=0;i<5;++i) {
        char buf[256] = {0};

        for(int j=0;j<samplesCount;++j) {
            std::strftime(buf, sizeof(buf), "%d.%m.%Y", std::localtime(&cpoint));
            std::cout << buf << " " << dis(gen) << std::endl;
        }

        point += std::chrono::hours(24);
        cpoint = system_clock::to_time_t(point);
    }
    
    return 0;
}

Output:

07.11.2014 -639
07.11.2014 -334
07.11.2014 -96
08.11.2014 310
08.11.2014 -559
08.11.2014 -60
09.11.2014 -661
09.11.2014 378
09.11.2014 -221
10.11.2014 -343
10.11.2014 -362
10.11.2014 -376
11.11.2014 -16
11.11.2014 545
11.11.2014 160

https://ideone.com/Od5Xqa

1

Zamiast się pałować z chrono lepiej użyć header only liby przegotowanej przez nie byle kogo tylko samego Howarda Hinnant. Polecam wszystkim.
https://github.com/HowardHinnant/date

1 użytkowników online, w tym zalogowanych: 0, gości: 1