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, botów: 0